diff options
-rw-r--r-- | drivers/block/nvme-core.c | 49 | ||||
-rw-r--r-- | include/linux/nvme.h | 1 |
2 files changed, 19 insertions, 31 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index a57685f74e5e..0f388206b15b 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
@@ -1274,29 +1274,18 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved) | |||
1274 | struct nvme_cmd_info *cmd = blk_mq_rq_to_pdu(req); | 1274 | struct nvme_cmd_info *cmd = blk_mq_rq_to_pdu(req); |
1275 | struct nvme_queue *nvmeq = cmd->nvmeq; | 1275 | struct nvme_queue *nvmeq = cmd->nvmeq; |
1276 | 1276 | ||
1277 | /* | ||
1278 | * The aborted req will be completed on receiving the abort req. | ||
1279 | * We enable the timer again. If hit twice, it'll cause a device reset, | ||
1280 | * as the device then is in a faulty state. | ||
1281 | */ | ||
1282 | int ret = BLK_EH_RESET_TIMER; | ||
1283 | |||
1284 | dev_warn(nvmeq->q_dmadev, "Timeout I/O %d QID %d\n", req->tag, | 1277 | dev_warn(nvmeq->q_dmadev, "Timeout I/O %d QID %d\n", req->tag, |
1285 | nvmeq->qid); | 1278 | nvmeq->qid); |
1286 | |||
1287 | spin_lock_irq(&nvmeq->q_lock); | 1279 | spin_lock_irq(&nvmeq->q_lock); |
1288 | if (!nvmeq->dev->initialized) { | 1280 | nvme_abort_req(req); |
1289 | /* | ||
1290 | * Force cancelled command frees the request, which requires we | ||
1291 | * return BLK_EH_NOT_HANDLED. | ||
1292 | */ | ||
1293 | nvme_cancel_queue_ios(nvmeq->hctx, req, nvmeq, reserved); | ||
1294 | ret = BLK_EH_NOT_HANDLED; | ||
1295 | } else | ||
1296 | nvme_abort_req(req); | ||
1297 | spin_unlock_irq(&nvmeq->q_lock); | 1281 | spin_unlock_irq(&nvmeq->q_lock); |
1298 | 1282 | ||
1299 | return ret; | 1283 | /* |
1284 | * The aborted req will be completed on receiving the abort req. | ||
1285 | * We enable the timer again. If hit twice, it'll cause a device reset, | ||
1286 | * as the device then is in a faulty state. | ||
1287 | */ | ||
1288 | return BLK_EH_RESET_TIMER; | ||
1300 | } | 1289 | } |
1301 | 1290 | ||
1302 | static void nvme_free_queue(struct nvme_queue *nvmeq) | 1291 | static void nvme_free_queue(struct nvme_queue *nvmeq) |
@@ -1349,7 +1338,6 @@ static void nvme_clear_queue(struct nvme_queue *nvmeq) | |||
1349 | struct blk_mq_hw_ctx *hctx = nvmeq->hctx; | 1338 | struct blk_mq_hw_ctx *hctx = nvmeq->hctx; |
1350 | 1339 | ||
1351 | spin_lock_irq(&nvmeq->q_lock); | 1340 | spin_lock_irq(&nvmeq->q_lock); |
1352 | nvme_process_cq(nvmeq); | ||
1353 | if (hctx && hctx->tags) | 1341 | if (hctx && hctx->tags) |
1354 | blk_mq_tag_busy_iter(hctx, nvme_cancel_queue_ios, nvmeq); | 1342 | blk_mq_tag_busy_iter(hctx, nvme_cancel_queue_ios, nvmeq); |
1355 | spin_unlock_irq(&nvmeq->q_lock); | 1343 | spin_unlock_irq(&nvmeq->q_lock); |
@@ -1372,7 +1360,10 @@ static void nvme_disable_queue(struct nvme_dev *dev, int qid) | |||
1372 | } | 1360 | } |
1373 | if (!qid && dev->admin_q) | 1361 | if (!qid && dev->admin_q) |
1374 | blk_mq_freeze_queue_start(dev->admin_q); | 1362 | blk_mq_freeze_queue_start(dev->admin_q); |
1375 | nvme_clear_queue(nvmeq); | 1363 | |
1364 | spin_lock_irq(&nvmeq->q_lock); | ||
1365 | nvme_process_cq(nvmeq); | ||
1366 | spin_unlock_irq(&nvmeq->q_lock); | ||
1376 | } | 1367 | } |
1377 | 1368 | ||
1378 | static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid, | 1369 | static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid, |
@@ -2121,8 +2112,7 @@ static int nvme_kthread(void *data) | |||
2121 | spin_lock(&dev_list_lock); | 2112 | spin_lock(&dev_list_lock); |
2122 | list_for_each_entry_safe(dev, next, &dev_list, node) { | 2113 | list_for_each_entry_safe(dev, next, &dev_list, node) { |
2123 | int i; | 2114 | int i; |
2124 | if (readl(&dev->bar->csts) & NVME_CSTS_CFS && | 2115 | if (readl(&dev->bar->csts) & NVME_CSTS_CFS) { |
2125 | dev->initialized) { | ||
2126 | if (work_busy(&dev->reset_work)) | 2116 | if (work_busy(&dev->reset_work)) |
2127 | continue; | 2117 | continue; |
2128 | list_del_init(&dev->node); | 2118 | list_del_init(&dev->node); |
@@ -2525,8 +2515,6 @@ static struct nvme_delq_ctx *nvme_get_dq(struct nvme_delq_ctx *dq) | |||
2525 | static void nvme_del_queue_end(struct nvme_queue *nvmeq) | 2515 | static void nvme_del_queue_end(struct nvme_queue *nvmeq) |
2526 | { | 2516 | { |
2527 | struct nvme_delq_ctx *dq = nvmeq->cmdinfo.ctx; | 2517 | struct nvme_delq_ctx *dq = nvmeq->cmdinfo.ctx; |
2528 | |||
2529 | nvme_clear_queue(nvmeq); | ||
2530 | nvme_put_dq(dq); | 2518 | nvme_put_dq(dq); |
2531 | } | 2519 | } |
2532 | 2520 | ||
@@ -2669,7 +2657,6 @@ static void nvme_dev_shutdown(struct nvme_dev *dev) | |||
2669 | int i; | 2657 | int i; |
2670 | u32 csts = -1; | 2658 | u32 csts = -1; |
2671 | 2659 | ||
2672 | dev->initialized = 0; | ||
2673 | nvme_dev_list_remove(dev); | 2660 | nvme_dev_list_remove(dev); |
2674 | 2661 | ||
2675 | if (dev->bar) { | 2662 | if (dev->bar) { |
@@ -2680,7 +2667,6 @@ static void nvme_dev_shutdown(struct nvme_dev *dev) | |||
2680 | for (i = dev->queue_count - 1; i >= 0; i--) { | 2667 | for (i = dev->queue_count - 1; i >= 0; i--) { |
2681 | struct nvme_queue *nvmeq = dev->queues[i]; | 2668 | struct nvme_queue *nvmeq = dev->queues[i]; |
2682 | nvme_suspend_queue(nvmeq); | 2669 | nvme_suspend_queue(nvmeq); |
2683 | nvme_clear_queue(nvmeq); | ||
2684 | } | 2670 | } |
2685 | } else { | 2671 | } else { |
2686 | nvme_disable_io_queues(dev); | 2672 | nvme_disable_io_queues(dev); |
@@ -2688,6 +2674,9 @@ static void nvme_dev_shutdown(struct nvme_dev *dev) | |||
2688 | nvme_disable_queue(dev, 0); | 2674 | nvme_disable_queue(dev, 0); |
2689 | } | 2675 | } |
2690 | nvme_dev_unmap(dev); | 2676 | nvme_dev_unmap(dev); |
2677 | |||
2678 | for (i = dev->queue_count - 1; i >= 0; i--) | ||
2679 | nvme_clear_queue(dev->queues[i]); | ||
2691 | } | 2680 | } |
2692 | 2681 | ||
2693 | static void nvme_dev_remove(struct nvme_dev *dev) | 2682 | static void nvme_dev_remove(struct nvme_dev *dev) |
@@ -2955,7 +2944,6 @@ static int nvme_dev_resume(struct nvme_dev *dev) | |||
2955 | nvme_unfreeze_queues(dev); | 2944 | nvme_unfreeze_queues(dev); |
2956 | nvme_set_irq_hints(dev); | 2945 | nvme_set_irq_hints(dev); |
2957 | } | 2946 | } |
2958 | dev->initialized = 1; | ||
2959 | return 0; | 2947 | return 0; |
2960 | } | 2948 | } |
2961 | 2949 | ||
@@ -3063,11 +3051,12 @@ static void nvme_async_probe(struct work_struct *work) | |||
3063 | goto reset; | 3051 | goto reset; |
3064 | 3052 | ||
3065 | nvme_set_irq_hints(dev); | 3053 | nvme_set_irq_hints(dev); |
3066 | dev->initialized = 1; | ||
3067 | return; | 3054 | return; |
3068 | reset: | 3055 | reset: |
3069 | dev->reset_workfn = nvme_reset_failed_dev; | 3056 | if (!work_busy(&dev->reset_work)) { |
3070 | queue_work(nvme_workq, &dev->reset_work); | 3057 | dev->reset_workfn = nvme_reset_failed_dev; |
3058 | queue_work(nvme_workq, &dev->reset_work); | ||
3059 | } | ||
3071 | } | 3060 | } |
3072 | 3061 | ||
3073 | static void nvme_reset_notify(struct pci_dev *pdev, bool prepare) | 3062 | static void nvme_reset_notify(struct pci_dev *pdev, bool prepare) |
diff --git a/include/linux/nvme.h b/include/linux/nvme.h index e2429e8cdab4..0adad4a5419b 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h | |||
@@ -103,7 +103,6 @@ struct nvme_dev { | |||
103 | u16 abort_limit; | 103 | u16 abort_limit; |
104 | u8 event_limit; | 104 | u8 event_limit; |
105 | u8 vwc; | 105 | u8 vwc; |
106 | u8 initialized; | ||
107 | }; | 106 | }; |
108 | 107 | ||
109 | /* | 108 | /* |