• Yishai Hadas's avatar
    vfio/virtio: Introduce a vfio driver over virtio devices · eb61eca0
    Yishai Hadas authored
    Introduce a vfio driver over virtio devices to support the legacy
    interface functionality for VFs.
    
    Background, from the virtio spec [1].
    --------------------------------------------------------------------
    In some systems, there is a need to support a virtio legacy driver with
    a device that does not directly support the legacy interface. In such
    scenarios, a group owner device can provide the legacy interface
    functionality for the group member devices. The driver of the owner
    device can then access the legacy interface of a member device on behalf
    of the legacy member device driver.
    
    For example, with the SR-IOV group type, group members (VFs) can not
    present the legacy interface in an I/O BAR in BAR0 as expected by the
    legacy pci driver. If the legacy driver is running inside a virtual
    machine, the hypervisor executing the virtual machine can present a
    virtual device with an I/O BAR in BAR0. The hypervisor intercepts the
    legacy driver accesses to this I/O BAR and forwards them to the group
    owner device (PF) using group administration commands.
    --------------------------------------------------------------------
    
    Specifically, this driver adds support for a virtio-net VF to be exposed
    as a transitional device to a guest driver and allows the legacy IO BAR
    functionality on top.
    
    This allows a VM which uses a legacy virtio-net driver in the guest to
    work transparently over a VF which its driver in the host is that new
    driver.
    
    The driver can be extended easily to support some other types of virtio
    devices (e.g virtio-blk), by adding in a few places the specific type
    properties as was done for virtio-net.
    
    For now, only the virtio-net use case was tested and as such we introduce
    the support only for such a device.
    
    Practically,
    Upon probing a VF for a virtio-net device, in case its PF supports
    legacy access over the virtio admin commands and the VF doesn't have BAR
    0, we set some specific 'vfio_device_ops' to be able to simulate in SW a
    transitional device with I/O BAR in BAR 0.
    
    The existence of the simulated I/O bar is reported later on by
    overwriting the VFIO_DEVICE_GET_REGION_INFO command and the device
    exposes itself as a transitional device by overwriting some properties
    upon reading its config space.
    
    Once we report the existence of I/O BAR as BAR 0 a legacy driver in the
    guest may use it via read/write calls according to the virtio
    specification.
    
    Any read/write towards the control parts of the BAR will be captured by
    the new driver and will be translated into admin commands towards the
    device.
    
    In addition, any data path read/write access (i.e. virtio driver
    notifications) will be captured by the driver and forwarded to the
    physical BAR which its properties were supplied by the admin command
    VIRTIO_ADMIN_CMD_LEGACY_NOTIFY_INFO upon the probing/init flow.
    
    With that code in place a legacy driver in the guest has the look and
    feel as if having a transitional device with legacy support for both its
    control and data path flows.
    
    [1]
    https://github.com/oasis-tcs/virtio-spec/commit/03c2d32e5093ca9f2a17797242fbef88efe94b8cReviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Signed-off-by: default avatarYishai Hadas <yishaih@nvidia.com>
    Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Link: https://lore.kernel.org/r/20231219093247.170936-10-yishaih@nvidia.comSigned-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    eb61eca0
Makefile 521 Bytes