diff options
author | Jon Derrick <jonathan.derrick@intel.com> | 2015-05-27 20:26:23 +0200 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-06-05 18:33:34 +0200 |
commit | 36a7e993eedb2c3f11de3b686b351f75e1edbbb5 (patch) | |
tree | f073262e2a058db7a77d4490d422711e8e3c6e46 | |
parent | NVMe: add sysfs and ioctl controller reset (diff) | |
download | linux-36a7e993eedb2c3f11de3b686b351f75e1edbbb5.tar.xz linux-36a7e993eedb2c3f11de3b686b351f75e1edbbb5.zip |
NVMe: Memory barrier before queue_count is incremented
Protects against reordering and/or preempting which would allow the
kthread to access the queue descriptor before it is set up
Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
Acked-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r-- | drivers/block/nvme-core.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index 9682e29b4171..cae7cac6cc43 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c @@ -1453,9 +1453,12 @@ static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid, nvmeq->q_db = &dev->dbs[qid * 2 * dev->db_stride]; nvmeq->q_depth = depth; nvmeq->qid = qid; - dev->queue_count++; dev->queues[qid] = nvmeq; + /* make sure queue descriptor is set before queue count, for kthread */ + mb(); + dev->queue_count++; + return nvmeq; free_cqdma: |