diff for duplicates of <20160805190323.GA12853@merlins.org> diff --git a/a/1.txt b/N1/1.txt index 563c644..a59e239 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -38,8 +38,8 @@ Boot logs on 4.4.5 kernel where sleep works fine: [ 1.252360] scsi host3: ahci [ 1.252437] ata1: DUMMY [ 1.252449] ata2: DUMMY -[ 1.252462] ata3: SATA max UDMA/133 abar m2048 at 0xd584c000 port 0xd584c200 irq 122 -[ 1.252499] ata4: SATA max UDMA/133 abar m2048 at 0xd584c000 port 0xd584c280 irq 122 +[ 1.252462] ata3: SATA max UDMA/133 abar m2048@0xd584c000 port 0xd584c200 irq 122 +[ 1.252499] ata4: SATA max UDMA/133 abar m2048@0xd584c000 port 0xd584c280 irq 122 [ 1.253374] scsi host4: pata_legacy [ 1.253439] ata5: PATA max PIO4 cmd 0x1f0 ctl 0x3f6 irq 14 [ 1.355385] nvme0n1: p1 p2 p3 p4 p5 p6 p7 p8 @@ -69,10 +69,3 @@ Marc Microsoft is to operating systems .... .... what McDonalds is to gourmet cooking Home page: http://marc.merlins.org/ | PGP 1024R/763BE901 --------------- next part -------------- -A non-text attachment was scrubbed... -Name: freeze.diff -Type: text/x-diff -Size: 3888 bytes -Desc: not available -URL: <http://lists.infradead.org/pipermail/linux-nvme/attachments/20160805/934c1a84/attachment.bin> diff --git a/N1/2.hdr b/N1/2.hdr new file mode 100644 index 0000000..03b4e4f --- /dev/null +++ b/N1/2.hdr @@ -0,0 +1,2 @@ +Content-Type: text/x-diff; charset=us-ascii +Content-Disposition: attachment; filename="freeze.diff" diff --git a/N1/2.txt b/N1/2.txt new file mode 100644 index 0000000..4ce07d3 --- /dev/null +++ b/N1/2.txt @@ -0,0 +1,111 @@ +saruman:/usr/src/linux# git bisect good +25646264e15af96c5c630fc742708b1eb3339222 is the first bad commit +commit 25646264e15af96c5c630fc742708b1eb3339222 +Author: Keith Busch <keith.busch@intel.com> +Date: Mon Jan 4 09:10:57 2016 -0700 + + NVMe: Remove queue freezing on resets + + NVMe submits all commands through the block layer now. This means we + can let requests queue at the blk-mq hardware context since there is no + path that bypasses this anymore so we don't need to freeze the queues + anymore. The driver can simply stop the h/w queues from running during + a reset instead. + + This also fixes a WARN in percpu_ref_reinit when the queue was unfrozen + with requeued requests. + + Signed-off-by: Keith Busch <keith.busch@intel.com> + Signed-off-by: Jens Axboe <axboe@fb.com> + + +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c +index e31a256..8da4a8a 100644 +--- a/drivers/nvme/host/core.c ++++ b/drivers/nvme/host/core.c +@@ -1372,12 +1372,14 @@ out: + return ret; + } + +-void nvme_stop_queues(struct nvme_ctrl *ctrl) ++void nvme_freeze_queues(struct nvme_ctrl *ctrl) + { + struct nvme_ns *ns; + + mutex_lock(&ctrl->namespaces_mutex); + list_for_each_entry(ns, &ctrl->namespaces, list) { ++ blk_mq_freeze_queue_start(ns->queue); ++ + spin_lock_irq(ns->queue->queue_lock); + queue_flag_set(QUEUE_FLAG_STOPPED, ns->queue); + spin_unlock_irq(ns->queue->queue_lock); +@@ -1388,13 +1390,14 @@ void nvme_stop_queues(struct nvme_ctrl *ctrl) + mutex_unlock(&ctrl->namespaces_mutex); + } + +-void nvme_start_queues(struct nvme_ctrl *ctrl) ++void nvme_unfreeze_queues(struct nvme_ctrl *ctrl) + { + struct nvme_ns *ns; + + mutex_lock(&ctrl->namespaces_mutex); + list_for_each_entry(ns, &ctrl->namespaces, list) { + queue_flag_clear_unlocked(QUEUE_FLAG_STOPPED, ns->queue); ++ blk_mq_unfreeze_queue(ns->queue); + blk_mq_start_stopped_hw_queues(ns->queue, true); + blk_mq_kick_requeue_list(ns->queue); + } +diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h +index 4722fad..4437592 100644 +--- a/drivers/nvme/host/nvme.h ++++ b/drivers/nvme/host/nvme.h +@@ -238,8 +238,8 @@ int nvme_init_identify(struct nvme_ctrl *ctrl); + void nvme_scan_namespaces(struct nvme_ctrl *ctrl); + void nvme_remove_namespaces(struct nvme_ctrl *ctrl); + +-void nvme_stop_queues(struct nvme_ctrl *ctrl); +-void nvme_start_queues(struct nvme_ctrl *ctrl); ++void nvme_freeze_queues(struct nvme_ctrl *ctrl); ++void nvme_unfreeze_queues(struct nvme_ctrl *ctrl); + + struct request *nvme_alloc_request(struct request_queue *q, + struct nvme_command *cmd, unsigned int flags); +diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c +index 953fe48..ac6c7af 100644 +--- a/drivers/nvme/host/pci.c ++++ b/drivers/nvme/host/pci.c +@@ -1064,7 +1064,7 @@ static int nvme_suspend_queue(struct nvme_queue *nvmeq) + spin_unlock_irq(&nvmeq->q_lock); + + if (!nvmeq->qid && nvmeq->dev->ctrl.admin_q) +- blk_mq_stop_hw_queues(nvmeq->dev->ctrl.admin_q); ++ blk_mq_freeze_queue_start(nvmeq->dev->ctrl.admin_q); + + irq_set_affinity_hint(vector, NULL); + free_irq(vector, nvmeq); +@@ -1296,7 +1296,7 @@ static int nvme_alloc_admin_tags(struct nvme_dev *dev) + return -ENODEV; + } + } else +- blk_mq_start_stopped_hw_queues(dev->ctrl.admin_q, true); ++ blk_mq_unfreeze_queue(dev->ctrl.admin_q); + + return 0; + } +@@ -1917,7 +1917,7 @@ static void nvme_dev_shutdown(struct nvme_dev *dev) + + mutex_lock(&dev->shutdown_lock); + if (dev->bar) { +- nvme_stop_queues(&dev->ctrl); ++ nvme_freeze_queues(&dev->ctrl); + csts = readl(dev->bar + NVME_REG_CSTS); + } + if (csts & NVME_CSTS_CFS || !(csts & NVME_CSTS_RDY)) { +@@ -2026,7 +2026,7 @@ static void nvme_reset_work(struct work_struct *work) + dev_warn(dev->dev, "IO queues not created\n"); + nvme_remove_namespaces(&dev->ctrl); + } else { +- nvme_start_queues(&dev->ctrl); ++ nvme_unfreeze_queues(&dev->ctrl); + nvme_dev_add(dev); + } diff --git a/a/content_digest b/N1/content_digest index febf2df..7fc235a 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,7 +1,11 @@ - "From\0marc@merlins.org (Marc MERLIN)\0" + "From\0Marc MERLIN <marc@merlins.org>\0" "Subject\0NVME regression in all kernels after 4.4.x for NVME in M2 slot for laptop?\0" "Date\0Fri, 5 Aug 2016 12:03:23 -0700\0" - "\00:1\0" + "To\0keith.busch@intel.com" + " axboe@fb.com\0" + "Cc\0linux-nvme@lists.infradead.org" + " linux-kernel@vger.kernel.org\0" + "\01:1\0" "b\0" "I've been stuck on 4.4.x for a while (currently 4.4.5) because any\n" "subsequent kernel would fail to suspend or resume (S3 sleep) on my\n" @@ -43,8 +47,8 @@ "[ 1.252360] scsi host3: ahci\n" "[ 1.252437] ata1: DUMMY\n" "[ 1.252449] ata2: DUMMY\n" - "[ 1.252462] ata3: SATA max UDMA/133 abar m2048 at 0xd584c000 port 0xd584c200 irq 122\n" - "[ 1.252499] ata4: SATA max UDMA/133 abar m2048 at 0xd584c000 port 0xd584c280 irq 122\n" + "[ 1.252462] ata3: SATA max UDMA/133 abar m2048@0xd584c000 port 0xd584c200 irq 122\n" + "[ 1.252499] ata4: SATA max UDMA/133 abar m2048@0xd584c000 port 0xd584c280 irq 122\n" "[ 1.253374] scsi host4: pata_legacy\n" "[ 1.253439] ata5: PATA max PIO4 cmd 0x1f0 ctl 0x3f6 irq 14\n" "[ 1.355385] nvme0n1: p1 p2 p3 p4 p5 p6 p7 p8\n" @@ -73,13 +77,120 @@ "\"A mouse is a device used to point at the xterm you want to type in\" - A.S.R.\n" "Microsoft is to operating systems ....\n" " .... what McDonalds is to gourmet cooking\n" - "Home page: http://marc.merlins.org/ | PGP 1024R/763BE901\n" - "-------------- next part --------------\n" - "A non-text attachment was scrubbed...\n" - "Name: freeze.diff\n" - "Type: text/x-diff\n" - "Size: 3888 bytes\n" - "Desc: not available\n" - URL: <http://lists.infradead.org/pipermail/linux-nvme/attachments/20160805/934c1a84/attachment.bin> + Home page: http://marc.merlins.org/ | PGP 1024R/763BE901 + "\01:2\0" + "fn\0freeze.diff\0" + "b\0" + "saruman:/usr/src/linux# git bisect good\n" + "25646264e15af96c5c630fc742708b1eb3339222 is the first bad commit\n" + "commit 25646264e15af96c5c630fc742708b1eb3339222\n" + "Author: Keith Busch <keith.busch@intel.com>\n" + "Date: Mon Jan 4 09:10:57 2016 -0700\n" + "\n" + " NVMe: Remove queue freezing on resets\n" + " \n" + " NVMe submits all commands through the block layer now. This means we\n" + " can let requests queue at the blk-mq hardware context since there is no\n" + " path that bypasses this anymore so we don't need to freeze the queues\n" + " anymore. The driver can simply stop the h/w queues from running during\n" + " a reset instead.\n" + " \n" + " This also fixes a WARN in percpu_ref_reinit when the queue was unfrozen\n" + " with requeued requests.\n" + " \n" + " Signed-off-by: Keith Busch <keith.busch@intel.com>\n" + " Signed-off-by: Jens Axboe <axboe@fb.com>\n" + "\n" + "\n" + "diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c\n" + "index e31a256..8da4a8a 100644\n" + "--- a/drivers/nvme/host/core.c\n" + "+++ b/drivers/nvme/host/core.c\n" + "@@ -1372,12 +1372,14 @@ out:\n" + " \treturn ret;\n" + " }\n" + " \n" + "-void nvme_stop_queues(struct nvme_ctrl *ctrl)\n" + "+void nvme_freeze_queues(struct nvme_ctrl *ctrl)\n" + " {\n" + " \tstruct nvme_ns *ns;\n" + " \n" + " \tmutex_lock(&ctrl->namespaces_mutex);\n" + " \tlist_for_each_entry(ns, &ctrl->namespaces, list) {\n" + "+\t\tblk_mq_freeze_queue_start(ns->queue);\n" + "+\n" + " \t\tspin_lock_irq(ns->queue->queue_lock);\n" + " \t\tqueue_flag_set(QUEUE_FLAG_STOPPED, ns->queue);\n" + " \t\tspin_unlock_irq(ns->queue->queue_lock);\n" + "@@ -1388,13 +1390,14 @@ void nvme_stop_queues(struct nvme_ctrl *ctrl)\n" + " \tmutex_unlock(&ctrl->namespaces_mutex);\n" + " }\n" + " \n" + "-void nvme_start_queues(struct nvme_ctrl *ctrl)\n" + "+void nvme_unfreeze_queues(struct nvme_ctrl *ctrl)\n" + " {\n" + " \tstruct nvme_ns *ns;\n" + " \n" + " \tmutex_lock(&ctrl->namespaces_mutex);\n" + " \tlist_for_each_entry(ns, &ctrl->namespaces, list) {\n" + " \t\tqueue_flag_clear_unlocked(QUEUE_FLAG_STOPPED, ns->queue);\n" + "+\t\tblk_mq_unfreeze_queue(ns->queue);\n" + " \t\tblk_mq_start_stopped_hw_queues(ns->queue, true);\n" + " \t\tblk_mq_kick_requeue_list(ns->queue);\n" + " \t}\n" + "diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h\n" + "index 4722fad..4437592 100644\n" + "--- a/drivers/nvme/host/nvme.h\n" + "+++ b/drivers/nvme/host/nvme.h\n" + "@@ -238,8 +238,8 @@ int nvme_init_identify(struct nvme_ctrl *ctrl);\n" + " void nvme_scan_namespaces(struct nvme_ctrl *ctrl);\n" + " void nvme_remove_namespaces(struct nvme_ctrl *ctrl);\n" + " \n" + "-void nvme_stop_queues(struct nvme_ctrl *ctrl);\n" + "-void nvme_start_queues(struct nvme_ctrl *ctrl);\n" + "+void nvme_freeze_queues(struct nvme_ctrl *ctrl);\n" + "+void nvme_unfreeze_queues(struct nvme_ctrl *ctrl);\n" + " \n" + " struct request *nvme_alloc_request(struct request_queue *q,\n" + " \t\tstruct nvme_command *cmd, unsigned int flags);\n" + "diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c\n" + "index 953fe48..ac6c7af 100644\n" + "--- a/drivers/nvme/host/pci.c\n" + "+++ b/drivers/nvme/host/pci.c\n" + "@@ -1064,7 +1064,7 @@ static int nvme_suspend_queue(struct nvme_queue *nvmeq)\n" + " \tspin_unlock_irq(&nvmeq->q_lock);\n" + " \n" + " \tif (!nvmeq->qid && nvmeq->dev->ctrl.admin_q)\n" + "-\t\tblk_mq_stop_hw_queues(nvmeq->dev->ctrl.admin_q);\n" + "+\t\tblk_mq_freeze_queue_start(nvmeq->dev->ctrl.admin_q);\n" + " \n" + " \tirq_set_affinity_hint(vector, NULL);\n" + " \tfree_irq(vector, nvmeq);\n" + "@@ -1296,7 +1296,7 @@ static int nvme_alloc_admin_tags(struct nvme_dev *dev)\n" + " \t\t\treturn -ENODEV;\n" + " \t\t}\n" + " \t} else\n" + "-\t\tblk_mq_start_stopped_hw_queues(dev->ctrl.admin_q, true);\n" + "+\t\tblk_mq_unfreeze_queue(dev->ctrl.admin_q);\n" + " \n" + " \treturn 0;\n" + " }\n" + "@@ -1917,7 +1917,7 @@ static void nvme_dev_shutdown(struct nvme_dev *dev)\n" + " \n" + " \tmutex_lock(&dev->shutdown_lock);\n" + " \tif (dev->bar) {\n" + "-\t\tnvme_stop_queues(&dev->ctrl);\n" + "+\t\tnvme_freeze_queues(&dev->ctrl);\n" + " \t\tcsts = readl(dev->bar + NVME_REG_CSTS);\n" + " \t}\n" + " \tif (csts & NVME_CSTS_CFS || !(csts & NVME_CSTS_RDY)) {\n" + "@@ -2026,7 +2026,7 @@ static void nvme_reset_work(struct work_struct *work)\n" + " \t\tdev_warn(dev->dev, \"IO queues not created\\n\");\n" + " \t\tnvme_remove_namespaces(&dev->ctrl);\n" + " \t} else {\n" + "-\t\tnvme_start_queues(&dev->ctrl);\n" + "+\t\tnvme_unfreeze_queues(&dev->ctrl);\n" + " \t\tnvme_dev_add(dev);\n" + " \t}" -efa09362d616904017f628e0af5cd668ea3058d8a9722b14629a2524f09bbfb7 +5327129fb5a5a9978f5fda4a0cd53869829d627e249d4ea6a131779429faa3b7
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.