]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
virtio_pmem: set device ready in probe()
authorJason Wang <jasowang@redhat.com>
Tue, 28 Jun 2022 08:34:30 +0000 (16:34 +0800)
committerMichael S. Tsirkin <mst@redhat.com>
Thu, 11 Aug 2022 08:06:37 +0000 (04:06 -0400)
The NVDIMM region could be available before the virtio_device_ready()
that is called by virtio_dev_probe(). This means the driver tries to
use device before DRIVER_OK which violates the spec, fixing this by
set device ready before the nvdimm_pmem_region_create().

Note that this means the virtio_pmem_host_ack() could be triggered
before the creation of the nd region, this is safe since the pmem_lock
has been initialized and whether or not any available buffer is added
before is validated by virtio_pmem_host_ack().

Fixes 6e84200c0a29 ("virtio-pmem: Add virtio pmem driver")
Acked-by: Pankaj Gupta <pankaj.gupta@amd.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Message-Id: <20220628083430.61856-2-jasowang@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
drivers/nvdimm/virtio_pmem.c

index 48f8327d0431fa9998dc7b1d70e55fc723383da8..20da455d2ef6378791956cba06a939fc8bdb32ad 100644 (file)
@@ -84,6 +84,12 @@ static int virtio_pmem_probe(struct virtio_device *vdev)
        ndr_desc.provider_data = vdev;
        set_bit(ND_REGION_PAGEMAP, &ndr_desc.flags);
        set_bit(ND_REGION_ASYNC, &ndr_desc.flags);
+       /*
+        * The NVDIMM region could be available before the
+        * virtio_device_ready() that is called by
+        * virtio_dev_probe(), so we set device ready here.
+        */
+       virtio_device_ready(vdev);
        nd_region = nvdimm_pmem_region_create(vpmem->nvdimm_bus, &ndr_desc);
        if (!nd_region) {
                dev_err(&vdev->dev, "failed to create nvdimm region\n");
@@ -92,6 +98,7 @@ static int virtio_pmem_probe(struct virtio_device *vdev)
        }
        return 0;
 out_nd:
+       virtio_reset_device(vdev);
        nvdimm_bus_unregister(vpmem->nvdimm_bus);
 out_vq:
        vdev->config->del_vqs(vdev);