mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-15 11:07:46 +00:00
NVMe: Correct SQ doorbell semantics
The value written to the doorbell needs to be the first free index in the queue, not the most recently used index in the queue. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
This commit is contained in:
parent
740216fc59
commit
7547881d09
@ -246,9 +246,9 @@ static int nvme_submit_cmd(struct nvme_queue *nvmeq, struct nvme_command *cmd)
|
|||||||
spin_lock_irqsave(&nvmeq->q_lock, flags);
|
spin_lock_irqsave(&nvmeq->q_lock, flags);
|
||||||
tail = nvmeq->sq_tail;
|
tail = nvmeq->sq_tail;
|
||||||
memcpy(&nvmeq->sq_cmds[tail], cmd, sizeof(*cmd));
|
memcpy(&nvmeq->sq_cmds[tail], cmd, sizeof(*cmd));
|
||||||
writel(tail, nvmeq->q_db);
|
|
||||||
if (++tail == nvmeq->q_depth)
|
if (++tail == nvmeq->q_depth)
|
||||||
tail = 0;
|
tail = 0;
|
||||||
|
writel(tail, nvmeq->q_db);
|
||||||
nvmeq->sq_tail = tail;
|
nvmeq->sq_tail = tail;
|
||||||
spin_unlock_irqrestore(&nvmeq->q_lock, flags);
|
spin_unlock_irqrestore(&nvmeq->q_lock, flags);
|
||||||
|
|
||||||
@ -471,9 +471,9 @@ static int nvme_submit_bio_queue(struct nvme_queue *nvmeq, struct nvme_ns *ns,
|
|||||||
cmnd->rw.control = cpu_to_le16(control);
|
cmnd->rw.control = cpu_to_le16(control);
|
||||||
cmnd->rw.dsmgmt = cpu_to_le32(dsmgmt);
|
cmnd->rw.dsmgmt = cpu_to_le32(dsmgmt);
|
||||||
|
|
||||||
writel(nvmeq->sq_tail, nvmeq->q_db);
|
|
||||||
if (++nvmeq->sq_tail == nvmeq->q_depth)
|
if (++nvmeq->sq_tail == nvmeq->q_depth)
|
||||||
nvmeq->sq_tail = 0;
|
nvmeq->sq_tail = 0;
|
||||||
|
writel(nvmeq->sq_tail, nvmeq->q_db);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user