Commit e4025e46 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Jens Axboe
Browse files

mtip32xx: avoid using semaphores



The "cmd_slot_unal" semaphore is never used in a blocking way
but only as an atomic counter. Change the code to using
atomic_dec_if_positive() as a better API.

Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 6f757231
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -2680,7 +2680,7 @@ static void mtip_softirq_done_fn(struct request *rq)
							cmd->direction);

	if (unlikely(cmd->unaligned))
		up(&dd->port->cmd_slot_unal);
		atomic_inc(&dd->port->cmd_slot_unal);

	blk_mq_end_request(rq, cmd->status);
}
@@ -2990,7 +2990,7 @@ static int mtip_hw_init(struct driver_data *dd)
	else
		dd->unal_qdepth = 0;

	sema_init(&dd->port->cmd_slot_unal, dd->unal_qdepth);
	atomic_set(&dd->port->cmd_slot_unal, dd->unal_qdepth);

	/* Spinlock to prevent concurrent issue */
	for (i = 0; i < MTIP_MAX_SLOT_GROUPS; i++)
@@ -3533,7 +3533,7 @@ static bool mtip_check_unal_depth(struct blk_mq_hw_ctx *hctx,
			cmd->unaligned = 1;
	}

	if (cmd->unaligned && down_trylock(&dd->port->cmd_slot_unal))
	if (cmd->unaligned && atomic_dec_if_positive(&dd->port->cmd_slot_unal) >= 0)
		return true;

	return false;
+2 −2
Original line number Diff line number Diff line
@@ -433,8 +433,8 @@ struct mtip_port {
	 */
	unsigned long ic_pause_timer;

	/* Semaphore to control queue depth of unaligned IOs */
	struct semaphore cmd_slot_unal;
	/* Counter to control queue depth of unaligned IOs */
	atomic_t cmd_slot_unal;

	/* Spinlock for working around command-issue bug. */
	spinlock_t cmd_issue_lock[MTIP_MAX_SLOT_GROUPS];