+CC Michael

> Update virtio-pmem to call virtio_device_ready prior to creating the pmem
> region. Otherwise, the guest may try to access the pmem region prior to
> the DRIVER_OK status being set.
>
> In the case of Hyper-V, the backing pmem file isn't mapped to the guest
> until the DRIVER_OK status is set. Therefore, attempts to access the pmem
> region can cause the guest to crash. Hyper-V could map the file earlier,
> for example at VM creation, but we didn't want to pay the mapping cost if
> the device is never used. Additionally, it felt weird to allow the guest
> to access the region prior to the device fully coming online.
>
> Signed-off-by: Taylor Stark <[email protected]>
> ---
>  drivers/nvdimm/virtio_pmem.c | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/drivers/nvdimm/virtio_pmem.c b/drivers/nvdimm/virtio_pmem.c
> index 43c1d835a449..ea9e111f3ea1 100644
> --- a/drivers/nvdimm/virtio_pmem.c
> +++ b/drivers/nvdimm/virtio_pmem.c
> @@ -91,6 +91,11 @@ static int virtio_pmem_probe(struct virtio_device *vdev)
>
>         dev_set_drvdata(&vdev->dev, vpmem->nvdimm_bus);
>
> +       /* Online the device prior to creating a pmem region, to ensure that
> +        * the region is never touched while the device is offline.
> +        */
> +       virtio_device_ready(vdev);
> +
>         ndr_desc.res = &res;
>         ndr_desc.numa_node = nid;
>         ndr_desc.flush = async_pmem_flush;
> @@ -105,6 +110,7 @@ static int virtio_pmem_probe(struct virtio_device *vdev)
>         nd_region->provider_data = 
> dev_to_virtio(nd_region->dev.parent->parent);
>         return 0;
>  out_nd:
> +       vdev->config->reset(vdev);
>         nvdimm_bus_unregister(vpmem->nvdimm_bus);
>  out_vq:
>         vdev->config->del_vqs(vdev);
> --
> 2.32.0

Looks good to me, independent to the first patch.

Reviewed-by: Pankaj Gupta <[email protected]>

Reply via email to