aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2015-10-02 12:49:23 -0400
committerJens Axboe <axboe@fb.com>2015-10-09 12:40:36 -0400
commit90667892c5a78b47080359883a569a260e9e87ed (patch)
tree183972dd064dce2d0dc83a4548a9a225a09c54a3
parent77b50d9e15e113fdb871218aa0f2e3bed12ee731 (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.c48
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
85static struct class *nvme_class; 85static struct class *nvme_class;
86 86
87static int __nvme_reset(struct nvme_dev *dev);
87static int nvme_reset(struct nvme_dev *dev); 88static int nvme_reset(struct nvme_dev *dev);
88static int nvme_process_cq(struct nvme_queue *nvmeq); 89static 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
3072static 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
3077static int nvme_reset(struct nvme_dev *dev) 3081static 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) {