SR-IOV的简单理解

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
};

你可能感兴趣的:(Linux,源码分析)