PCI/IOV: Add sysfs MSI-X vector assignment interface
A typical cloud provider SR-IOV use case is to create many VFs for use by guest VMs. The VFs may not be assigned to a VM until a customer requests a VM of a certain size, e.g., number of CPUs. A VF may need MSI-X vectors proportional to the number of CPUs in the VM, but there is no standard way to change the number of MSI-X vectors supported by a VF. Some Mellanox ConnectX devices support dynamic assignment of MSI-X vectors to SR-IOV VFs. This can be done by the PF driver after VFs are enabled, and it can be done without affecting VFs that are already in use. The hardware supports a limited pool of MSI-X vectors that can be assigned to the PF or to individual VFs. This is device-specific behavior that requires support in the PF driver. Add a read-only "sriov_vf_total_msix" sysfs file for the PF and a writable "sriov_vf_msix_count" file for each VF. Management software may use these to learn how many MSI-X vectors are available and to dynamically assign them to VFs before the VFs are passed through to a VM. If the PF driver implements the ->sriov_get_vf_total_msix() callback, "sriov_vf_total_msix" contains the total number of MSI-X vectors available for distribution among VFs. If no driver is bound to the VF, writing "N" to "sriov_vf_msix_count" uses the PF driver ->sriov_set_msix_vec_count() callback to assign "N" MSI-X vectors to the VF. When a VF driver subsequently reads the MSI-X Message Control register, it will see the new Table Size "N". Link: https://lore.kernel.org/linux-pci/20210314124256.70253-2-leon@kernel.org Acked-by: Bjorn Helgaas <bhelgaas@google.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
This commit is contained in:
@@ -856,6 +856,12 @@ struct module;
|
||||
* e.g. drivers/net/e100.c.
|
||||
* @sriov_configure: Optional driver callback to allow configuration of
|
||||
* number of VFs to enable via sysfs "sriov_numvfs" file.
|
||||
* @sriov_set_msix_vec_count: PF Driver callback to change number of MSI-X
|
||||
* vectors on a VF. Triggered via sysfs "sriov_vf_msix_count".
|
||||
* This will change MSI-X Table Size in the VF Message Control
|
||||
* registers.
|
||||
* @sriov_get_vf_total_msix: PF driver callback to get the total number of
|
||||
* MSI-X vectors available for distribution to the VFs.
|
||||
* @err_handler: See Documentation/PCI/pci-error-recovery.rst
|
||||
* @groups: Sysfs attribute groups.
|
||||
* @driver: Driver model structure.
|
||||
@@ -871,6 +877,8 @@ struct pci_driver {
|
||||
int (*resume)(struct pci_dev *dev); /* Device woken up */
|
||||
void (*shutdown)(struct pci_dev *dev);
|
||||
int (*sriov_configure)(struct pci_dev *dev, int num_vfs); /* On PF */
|
||||
int (*sriov_set_msix_vec_count)(struct pci_dev *vf, int msix_vec_count); /* On PF */
|
||||
u32 (*sriov_get_vf_total_msix)(struct pci_dev *pf);
|
||||
const struct pci_error_handlers *err_handler;
|
||||
const struct attribute_group **groups;
|
||||
struct device_driver driver;
|
||||
|
||||
Reference in New Issue
Block a user