[PATCH RFC 3/5] NVMe: Asynchronous device scan support
Santosh Y
santoshsy at gmail.com
Mon Dec 30 05:27:18 EST 2013
This patch provides asynchronous device enumeration
capability. The 'probe' need not wait until the namespace scanning is
complete.
Signed-off-by: Ravi Kumar <ravi.android at gmail.com>
Signed-off-by: Santosh Y <santoshsy at gmail.com>
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c
index 8a02135..cd37335 100644
--- a/drivers/block/nvme-core.c
+++ b/drivers/block/nvme-core.c
@@ -17,6 +17,9 @@
*/
#include <linux/nvme.h>
+#ifdef CONFIG_BLK_DEV_NVME_HP
+#include <linux/async.h>
+#endif
#include <linux/bio.h>
#include <linux/bitops.h>
#include <linux/blkdev.h>
@@ -2115,8 +2118,10 @@ static int nvme_dev_add(struct nvme_dev *dev)
if (ns)
list_add_tail(&ns->list, &dev->namespaces);
}
+#ifndef CONFIG_BLK_DEV_NVME_HP
list_for_each_entry(ns, &dev->namespaces, list)
add_disk(ns->disk);
+#endif
res = 0;
out:
@@ -2546,6 +2551,19 @@ static void nvme_reset_failed_dev(struct work_struct *ws)
nvme_dev_reset(dev);
}
+#ifdef CONFIG_BLK_DEV_NVME_HP
+static void nvme_async_add(void *data, async_cookie_t cookie)
+{
+ struct nvme_dev *dev = (struct nvme_dev *)data;
+ struct nvme_ns *ns;
+
+ list_for_each_entry(ns, &dev->namespaces, list)
+ add_disk(ns->disk);
+ if (!test_bit(NVME_HOT_REM, &dev->hp_flag))
+ dev->initialized = 1;
+}
+#endif
+
static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
int result = -ENOMEM;
@@ -2595,14 +2613,16 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
if (result)
goto remove;
- dev->initialized = 1;
- kref_init(&dev->kref);
-
#ifdef CONFIG_BLK_DEV_NVME_HP
+ async_schedule(nvme_async_add, dev);
if (!pdev->is_added)
dev_info(&pdev->dev,
"Device 0x%x is on-line\n", pdev->device);
+#else
+ dev->initialized = 1;
#endif
+ kref_init(&dev->kref);
+
return 0;
remove:
--
1.8.3.2
More information about the Linux-nvme
mailing list