SR-IOV的简单理解

  • Post author:
  • Post category:其他


SR-IOV的全程是single root I/O virtualization。物理的设备被叫做physical function(PV),一个PF 可以虚拟出virtual devices(VF)。当开启VF是,每一个VF都有自己的配置空间,VF 最后的作用就相当一个传统的PCI devices.

如果一个PCIe设备有SR-IOV的功能,则在PF的probe函数中调用pci_enable_sriov(dev, NR_VIRTFN); 就可以是能VF功能。下面是一个例子:

static int dev_probe(struct pci_dev *dev, const struct pci_device_id *id)

{

pci_enable_sriov(dev, NR_VIRTFN);

return 0;

}

static void dev_remove(struct pci_dev *dev)

{

pci_disable_sriov(dev);



}

static int dev_suspend(struct pci_dev *dev, pm_message_t state)

{

return 0;

}

static int dev_resume(struct pci_dev *dev)

{

return 0;

}

static void dev_shutdown(struct pci_dev *dev)

{



}

static int dev_sriov_configure(struct pci_dev *dev, int numvfs)

{

if (numvfs > 0) {



pci_enable_sriov(dev, numvfs);



return numvfs;

}

if (numvfs == 0) {

….

pci_disable_sriov(dev);



return 0;

}

}

static struct pci_driver dev_driver = {

.name =        “SR-IOV Physical Function driver”,

.id_table =    dev_id_table,

.probe =    dev_probe,

.remove =    dev_remove,

.suspend =    dev_suspend,

.resume =    dev_resume,

.shutdown =    dev_shutdown,

.sriov_configure = dev_sriov_configure,

};

以82599为例的话ixgbe_probe->ixgbe_enable_sriov->ixgbe_enable_sriov

static struct pci_driver ixgbe_driver = {

.name     = ixgbe_driver_name,

.id_table = ixgbe_pci_tbl,

.probe    = ixgbe_probe,

.remove   = ixgbe_remove,

#ifdef CONFIG_PM

.suspend  = ixgbe_suspend,

.resume   = ixgbe_resume,

#endif

.shutdown = ixgbe_shutdown,

.sriov_configure = ixgbe_pci_sriov_configure,

.err_handler = &ixgbe_err_handler

};



版权声明:本文为tiantao2012原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。