diff options
author | Christoph Hellwig <hch@lst.de> | 2015-10-02 12:49:23 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-10-09 12:40:36 -0400 |
commit | 90667892c5a78b47080359883a569a260e9e87ed (patch) | |
tree | 183972dd064dce2d0dc83a4548a9a225a09c54a3 | |
parent | 77b50d9e15e113fdb871218aa0f2e3bed12ee731 (diff) |
nvme: factor reset code into a common helper
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r-- | drivers/block/nvme-core.c | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index 509ad4baccd8..e03a95bd4ee4 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
@@ -84,6 +84,7 @@ static wait_queue_head_t nvme_kthread_wait; | |||
84 | 84 | ||
85 | static struct class *nvme_class; | 85 | static struct class *nvme_class; |
86 | 86 | ||
87 | static int __nvme_reset(struct nvme_dev *dev); | ||
87 | static int nvme_reset(struct nvme_dev *dev); | 88 | static int nvme_reset(struct nvme_dev *dev); |
88 | static int nvme_process_cq(struct nvme_queue *nvmeq); | 89 | static int nvme_process_cq(struct nvme_queue *nvmeq); |
89 | 90 | ||
@@ -1276,17 +1277,13 @@ static void nvme_abort_req(struct request *req) | |||
1276 | struct nvme_command cmd; | 1277 | struct nvme_command cmd; |
1277 | 1278 | ||
1278 | if (!nvmeq->qid || cmd_rq->aborted) { | 1279 | if (!nvmeq->qid || cmd_rq->aborted) { |
1279 | unsigned long flags; | 1280 | spin_lock(&dev_list_lock); |
1280 | 1281 | if (!__nvme_reset(dev)) { | |
1281 | spin_lock_irqsave(&dev_list_lock, flags); | 1282 | dev_warn(dev->dev, |
1282 | if (work_busy(&dev->reset_work)) | 1283 | "I/O %d QID %d timeout, reset controller\n", |
1283 | goto out; | 1284 | req->tag, nvmeq->qid); |
1284 | list_del_init(&dev->node); | 1285 | } |
1285 | dev_warn(dev->dev, "I/O %d QID %d timeout, reset controller\n", | 1286 | spin_unlock(&dev_list_lock); |
1286 | req->tag, nvmeq->qid); | ||
1287 | queue_work(nvme_workq, &dev->reset_work); | ||
1288 | out: | ||
1289 | spin_unlock_irqrestore(&dev_list_lock, flags); | ||
1290 | return; | 1287 | return; |
1291 | } | 1288 | } |
1292 | 1289 | ||
@@ -2081,13 +2078,11 @@ static int nvme_kthread(void *data) | |||
2081 | 2078 | ||
2082 | if ((dev->subsystem && (csts & NVME_CSTS_NSSRO)) || | 2079 | if ((dev->subsystem && (csts & NVME_CSTS_NSSRO)) || |
2083 | csts & NVME_CSTS_CFS) { | 2080 | csts & NVME_CSTS_CFS) { |
2084 | if (work_busy(&dev->reset_work)) | 2081 | if (!__nvme_reset(dev)) { |
2085 | continue; | 2082 | dev_warn(dev->dev, |
2086 | list_del_init(&dev->node); | 2083 | "Failed status: %x, reset controller\n", |
2087 | dev_warn(dev->dev, | 2084 | readl(&dev->bar->csts)); |
2088 | "Failed status: %x, reset controller\n", | 2085 | } |
2089 | readl(&dev->bar->csts)); | ||
2090 | queue_work(nvme_workq, &dev->reset_work); | ||
2091 | continue; | 2086 | continue; |
2092 | } | 2087 | } |
2093 | for (i = 0; i < dev->queue_count; i++) { | 2088 | for (i = 0; i < dev->queue_count; i++) { |
@@ -3074,19 +3069,24 @@ static void nvme_reset_work(struct work_struct *ws) | |||
3074 | schedule_work(&dev->probe_work); | 3069 | schedule_work(&dev->probe_work); |
3075 | } | 3070 | } |
3076 | 3071 | ||
3072 | static int __nvme_reset(struct nvme_dev *dev) | ||
3073 | { | ||
3074 | if (work_pending(&dev->reset_work)) | ||
3075 | return -EBUSY; | ||
3076 | list_del_init(&dev->node); | ||
3077 | queue_work(nvme_workq, &dev->reset_work); | ||
3078 | return 0; | ||
3079 | } | ||
3080 | |||
3077 | static int nvme_reset(struct nvme_dev *dev) | 3081 | static int nvme_reset(struct nvme_dev *dev) |
3078 | { | 3082 | { |
3079 | int ret = -EBUSY; | 3083 | int ret; |
3080 | 3084 | ||
3081 | if (!dev->admin_q || blk_queue_dying(dev->admin_q)) | 3085 | if (!dev->admin_q || blk_queue_dying(dev->admin_q)) |
3082 | return -ENODEV; | 3086 | return -ENODEV; |
3083 | 3087 | ||
3084 | spin_lock(&dev_list_lock); | 3088 | spin_lock(&dev_list_lock); |
3085 | if (!work_pending(&dev->reset_work)) { | 3089 | ret = __nvme_reset(dev); |
3086 | list_del_init(&dev->node); | ||
3087 | queue_work(nvme_workq, &dev->reset_work); | ||
3088 | ret = 0; | ||
3089 | } | ||
3090 | spin_unlock(&dev_list_lock); | 3090 | spin_unlock(&dev_list_lock); |
3091 | 3091 | ||
3092 | if (!ret) { | 3092 | if (!ret) { |