Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18119775 authored by Keith Busch's avatar Keith Busch
Browse files

nvme/pci: Use async_schedule for initial reset work



This patch schedules the initial controller reset in an async_domain
so that it can be synchronized from wait_for_device_probe(). This way
the kernel waits for the initial nvme controller scan to complete for
all devices before proceeding with the boot sequence, which may have
nvme dependencies.

Reported-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Tested-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Signed-off-by: default avatarKeith Busch <keith.busch@intel.com>
parent ea48e877
Loading
Loading
Loading
Loading
+9 −1
Original line number Original line Diff line number Diff line
@@ -13,6 +13,7 @@
 */
 */


#include <linux/aer.h>
#include <linux/aer.h>
#include <linux/async.h>
#include <linux/blkdev.h>
#include <linux/blkdev.h>
#include <linux/blk-mq.h>
#include <linux/blk-mq.h>
#include <linux/blk-mq-pci.h>
#include <linux/blk-mq-pci.h>
@@ -2488,6 +2489,13 @@ static unsigned long check_vendor_combination_bug(struct pci_dev *pdev)
	return 0;
	return 0;
}
}


static void nvme_async_probe(void *data, async_cookie_t cookie)
{
	struct nvme_dev *dev = data;
	nvme_reset_ctrl_sync(&dev->ctrl);
	flush_work(&dev->ctrl.scan_work);
}

static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
{
	int node, result = -ENOMEM;
	int node, result = -ENOMEM;
@@ -2532,7 +2540,7 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)


	dev_info(dev->ctrl.device, "pci function %s\n", dev_name(&pdev->dev));
	dev_info(dev->ctrl.device, "pci function %s\n", dev_name(&pdev->dev));


	nvme_reset_ctrl(&dev->ctrl);
	async_schedule(nvme_async_probe, dev);


	return 0;
	return 0;