All of lore.kernel.org
 help / color / mirror / Atom feed
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.