mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
virtio_pci: support enabling VFs
There is a new feature bit allocated in virtio spec to support SR-IOV (Single Root I/O Virtualization): https://github.com/oasis-tcs/virtio-spec/issues/11 This patch enables the support for this feature bit in virtio driver. Signed-off-by: Tiwei Bie <tiwei.bie@intel.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
committed by
Michael S. Tsirkin
parent
670ae9caac
commit
cfecc2918d
@@ -577,6 +577,8 @@ static void virtio_pci_remove(struct pci_dev *pci_dev)
|
||||
struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
|
||||
struct device *dev = get_device(&vp_dev->vdev.dev);
|
||||
|
||||
pci_disable_sriov(pci_dev);
|
||||
|
||||
unregister_virtio_device(&vp_dev->vdev);
|
||||
|
||||
if (vp_dev->ioaddr)
|
||||
@@ -588,6 +590,33 @@ static void virtio_pci_remove(struct pci_dev *pci_dev)
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
static int virtio_pci_sriov_configure(struct pci_dev *pci_dev, int num_vfs)
|
||||
{
|
||||
struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
|
||||
struct virtio_device *vdev = &vp_dev->vdev;
|
||||
int ret;
|
||||
|
||||
if (!(vdev->config->get_status(vdev) & VIRTIO_CONFIG_S_DRIVER_OK))
|
||||
return -EBUSY;
|
||||
|
||||
if (!__virtio_test_bit(vdev, VIRTIO_F_SR_IOV))
|
||||
return -EINVAL;
|
||||
|
||||
if (pci_vfs_assigned(pci_dev))
|
||||
return -EPERM;
|
||||
|
||||
if (num_vfs == 0) {
|
||||
pci_disable_sriov(pci_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = pci_enable_sriov(pci_dev, num_vfs);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return num_vfs;
|
||||
}
|
||||
|
||||
static struct pci_driver virtio_pci_driver = {
|
||||
.name = "virtio-pci",
|
||||
.id_table = virtio_pci_id_table,
|
||||
@@ -596,6 +625,7 @@ static struct pci_driver virtio_pci_driver = {
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.driver.pm = &virtio_pci_pm_ops,
|
||||
#endif
|
||||
.sriov_configure = virtio_pci_sriov_configure,
|
||||
};
|
||||
|
||||
module_pci_driver(virtio_pci_driver);
|
||||
|
||||
Reference in New Issue
Block a user