您的位置:首页 > 其它

SR-IOV的简单理解

2017-04-01 10:03 796 查看
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

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: