]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
virtio: add num_vf callback to virtio_bus
authorYui Washizu <yui.washidu@gmail.com>
Tue, 10 Mar 2026 06:14:52 +0000 (15:14 +0900)
committerMichael S. Tsirkin <mst@redhat.com>
Wed, 10 Jun 2026 06:17:00 +0000 (02:17 -0400)
Recent QEMU versions added support for virtio SR-IOV emulation,
allowing virtio devices to expose SR-IOV VFs to the guest.
However, virtio_bus does not implement the num_vf callback of bus_type,
causing dev_num_vf() to return 0 for virtio devices even when
SR-IOV VFs are active.

net/core/rtnetlink.c calls dev_num_vf(dev->dev.parent) to populate
IFLA_NUM_VF in RTM_GETLINK responses.  For a virtio-net device,
dev.parent points to the virtio_device, whose busis virtio_bus.
Without num_vf, SR-IOV VF information is silently
omitted from tools that rely on rtnetlink, such as 'ip link show'.

Add a num_vf callback that delegates to dev_num_vf(dev->parent),
which in turn reaches the underlying transport (pci_bus_type for
virtio-pci) where the actual VF count is tracked.  Non-PCI transports
are unaffected as dev_num_vf() returns 0 when no num_vf callback is
present.

Signed-off-by: Yui Washizu <yui.washidu@gmail.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Message-ID: <20260310061454.683894-1-yui.washidu@gmail.com>

drivers/virtio/virtio.c

index 5bdc6b82b30b480d40a0ce602690b1e6b1ec252f..299fa83be1d5f9085223c820a0456524e79cb536 100644 (file)
@@ -435,6 +435,14 @@ static void virtio_dev_shutdown(struct device *_d)
        dev->config->reset(dev);
 }
 
+static int virtio_dev_num_vf(struct device *dev)
+{
+       struct virtio_device *vdev = dev_to_virtio(dev);
+
+       return dev_num_vf(vdev->dev.parent);
+}
+
+
 static const struct bus_type virtio_bus = {
        .name  = "virtio",
        .match = virtio_dev_match,
@@ -444,6 +452,7 @@ static const struct bus_type virtio_bus = {
        .remove = virtio_dev_remove,
        .irq_get_affinity = virtio_irq_get_affinity,
        .shutdown = virtio_dev_shutdown,
+       .num_vf = virtio_dev_num_vf,
 };
 
 int __register_virtio_driver(struct virtio_driver *driver, struct module *owner)