Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

virtio-pci: Fix legacy device flag setting error in probe

The 'is_legacy' flag is used to differentiate between legacy vs modern
device. Currently, it is based on the value of vp_dev->ldev.ioaddr.
However, due to the shared memory of the union between struct
virtio_pci_legacy_device and struct virtio_pci_modern_device, when
virtio_pci_modern_probe modifies the content of struct
virtio_pci_modern_device, it affects the content of struct
virtio_pci_legacy_device, and ldev.ioaddr is no longer zero, causing
the 'is_legacy' flag to be set as true. To resolve issue, when legacy
device is probed, mark 'is_legacy' as true, when modern device is
probed, keep 'is_legacy' as false.

Fixes: 4f0fc22534e3 ("virtio_pci: Optimize virtio_pci_device structure size")
Signed-off-by: Feng Liu <feliu@nvidia.com>
Reviewed-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Message-Id: <20230719154550.79536-1-feliu@nvidia.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Acked-by: Jason Wang <jasowang@redhat.com>

authored by

Feng Liu and committed by
Michael S. Tsirkin
13f3efac 8d4bdf11

+1 -2
-2
drivers/virtio/virtio_pci_common.c
··· 557 557 558 558 pci_set_master(pci_dev); 559 559 560 - vp_dev->is_legacy = vp_dev->ldev.ioaddr ? true : false; 561 - 562 560 rc = register_virtio_device(&vp_dev->vdev); 563 561 reg_dev = vp_dev; 564 562 if (rc)
+1
drivers/virtio/virtio_pci_legacy.c
··· 223 223 vp_dev->config_vector = vp_config_vector; 224 224 vp_dev->setup_vq = setup_vq; 225 225 vp_dev->del_vq = del_vq; 226 + vp_dev->is_legacy = true; 226 227 227 228 return 0; 228 229 }