On Mon, Jun 20, 2022 at 04:39:27PM +0800, Jason Wang wrote: > On Mon, Jun 20, 2022 at 4:32 PM Michael S. Tsirkin <m...@redhat.com> wrote: > > > > I think you should CC the maintainer, Pankaj Gupta. > > Yes, I miss him accidentally. > > > > > On Mon, Jun 20, 2022 at 04:15:19PM +0800, Jason Wang wrote: > > > 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 > > > virtio_pmem_host_ack() since pmem_lock has been initialized and we > > > check if we've added any buffer before trying to proceed. > > > > > > Fixes 6e84200c0a29 ("virtio-pmem: Add virtio pmem driver") > > > Signed-off-by: Jason Wang <jasow...@redhat.com> > > > --- > > > drivers/nvdimm/virtio_pmem.c | 12 ++++++++++++ > > > 1 file changed, 12 insertions(+) > > > > > > diff --git a/drivers/nvdimm/virtio_pmem.c b/drivers/nvdimm/virtio_pmem.c > > > index 48f8327d0431..173f2f5adaea 100644 > > > --- a/drivers/nvdimm/virtio_pmem.c > > > +++ b/drivers/nvdimm/virtio_pmem.c > > > @@ -84,6 +84,17 @@ 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_dev_probe is not to blame here, right? > > Yes and actually it's not to blame, it just describes what can happen now. > > > I don't like copying its logic here as we won't remember to fix > > it if we change virtio_dev_probe to e.g. not call virtio_device_ready. > > > > is it nvdimm_pmem_region_create what makes it possible for > > the region to become available? > > I think so. > > > Then "The NVDIMM region could become available immediately > > after the call to nvdimm_pmem_region_create. > > Tell device we are ready to handle this case." > > That's fine. > > > > > > + * The callback - virtio_pmem_host_ack() is safe to be called > > > + * before the nvdimm_pmem_region_create() since the pmem_lock > > > + * has been initialized and legality of a used buffer is > > > + * validated before moving forward. > > > + */ > > > + 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 +103,7 @@ static int virtio_pmem_probe(struct virtio_device > > > *vdev) > > > } > > > return 0; > > > out_nd: > > > + virtio_reset_device(vdev); > > > > > > Does this fix cleanup too? > > Not sure I get this, we make the device ready before > nvdimm_pmem_region_create(), so we need to reset if > nvdimm_pmem_region_create() fails? > > Thanks
Oh, right. > > > > > nvdimm_bus_unregister(vpmem->nvdimm_bus); > > > out_vq: > > > vdev->config->del_vqs(vdev); > > > -- > > > 2.25.1 > >