Skip to content

Commit

Permalink
NVMe: Call put_nvmeq() before calling nvme_submit_sync_cmd()
Browse files Browse the repository at this point in the history
We can't have preemption disabled when we call schedule().  Accept the
possibility that we'll get preempted, and it'll cost us some cacheline
bounces.

Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
  • Loading branch information
Matthew Wilcox committed Nov 4, 2011
1 parent 3c0cf13 commit b1ad37e
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion drivers/block/nvme.c
Original file line number Diff line number Diff line change
Expand Up @@ -842,8 +842,13 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio)
nvme_setup_prps(&c.common, sg, length);

nvmeq = get_nvmeq(ns);
status = nvme_submit_sync_cmd(nvmeq, &c, &result);
/* Since nvme_submit_sync_cmd sleeps, we can't keep preemption
* disabled. We may be preempted at any point, and be rescheduled
* to a different CPU. That will cause cacheline bouncing, but no
* additional races since q_lock already protects against other CPUs.
*/
put_nvmeq(nvmeq);
status = nvme_submit_sync_cmd(nvmeq, &c, &result);

nvme_unmap_user_pages(dev, io.opcode & 1, io.addr, length, sg, nents);
put_user(result, &uio->result);
Expand Down

0 comments on commit b1ad37e

Please sign in to comment.