switch (result & 0xff07) {
        case NVME_AER_NOTICE_NS_CHANGED:
                dev_info(nvmeq->q_dmadev, "rescanning\n");
-               schedule_work(&nvmeq->dev->scan_work);
+               queue_work(nvme_workq, &nvmeq->dev->scan_work);
        default:
                dev_warn(nvmeq->q_dmadev, "async event result %08x\n", result);
        }
                        return 0;
                dev->ctrl.tagset = &dev->tagset;
        }
-       schedule_work(&dev->scan_work);
+       queue_work(nvme_workq, &dev->scan_work);
        return 0;
 }
 
        if (result)
                goto release_pools;
 
-       schedule_work(&dev->reset_work);
+       queue_work(nvme_workq, &dev->reset_work);
        return 0;
 
  release_pools:
        if (prepare)
                nvme_dev_shutdown(dev);
        else
-               schedule_work(&dev->reset_work);
+               queue_work(nvme_workq, &dev->reset_work);
 }
 
 static void nvme_shutdown(struct pci_dev *pdev)
        struct pci_dev *pdev = to_pci_dev(dev);
        struct nvme_dev *ndev = pci_get_drvdata(pdev);
 
-       schedule_work(&ndev->reset_work);
+       queue_work(nvme_workq, &ndev->reset_work);
        return 0;
 }
 #endif
 
        init_waitqueue_head(&nvme_kthread_wait);
 
-       nvme_workq = create_singlethread_workqueue("nvme");
+       nvme_workq = alloc_workqueue("nvme", WQ_UNBOUND | WQ_MEM_RECLAIM, 0);
        if (!nvme_workq)
                return -ENOMEM;