diff options
author | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2011-02-06 09:01:00 -0500 |
---|---|---|
committer | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2011-11-04 15:52:56 -0400 |
commit | ec6ce618d65b5ce1bef83a5509255107a0feac44 (patch) | |
tree | c28e35b52fed671c47eae0017cb9df02f66a7d2b /drivers | |
parent | 48e3d39816416b3bf03dee3a796c0c04427c1a31 (diff) |
NVMe: Need to lock queue during interrupt handling
If we're sharing a queue between multiple CPUs and we cancel a sync I/O,
we must have the queue locked to avoid corrupting the stack of the thread
that submitted the I/O. It turns out this is the same locking that's needed
for the threaded irq handler, so share that code.
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/nvme.c | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/drivers/block/nvme.c b/drivers/block/nvme.c index f4085d4fe0f..139e6fc1e2a 100644 --- a/drivers/block/nvme.c +++ b/drivers/block/nvme.c @@ -477,11 +477,6 @@ static irqreturn_t nvme_process_cq(struct nvme_queue *nvmeq) static irqreturn_t nvme_irq(int irq, void *data) { - return nvme_process_cq(data); -} - -static irqreturn_t nvme_irq_thread(int irq, void *data) -{ irqreturn_t result; struct nvme_queue *nvmeq = data; spin_lock(&nvmeq->q_lock); @@ -676,7 +671,7 @@ static int queue_request_irq(struct nvme_dev *dev, struct nvme_queue *nvmeq, { if (use_threaded_interrupts) return request_threaded_irq(dev->entry[nvmeq->cq_vector].vector, - nvme_irq_check, nvme_irq_thread, + nvme_irq_check, nvme_irq, IRQF_DISABLED | IRQF_SHARED, name, nvmeq); return request_irq(dev->entry[nvmeq->cq_vector].vector, nvme_irq, |