mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
xend: pass-through: Implement least-mapping of virtual functions
This is an alternative to identity mapping virtual functions.
It works by assigning the numerically lowest virtual function that is
available.
* The order of assignment is thus dependent on the order that physical
functions are specified.
e.g.
config physical virtual
01.00.0,2 -> 01:00.0 -> 00:07.0
-> 01:00.2 -> 00:07.1
is different to
config physical virtual
01.00.2,0 -> 01:00.2 -> 00:07.0
-> 01:00.0 -> 00:07.1
* Physical function 0 need not be present
e.g.
config physical virtual
01.00.1,2 -> 01:00.1 -> 00:07.0
-> 01:00.2 -> 00:07.1
* Functions from the same physical multi-function device
may be exported as multiple multi-function and single-function
devices
e.g.
01.00.0,2 -> 01:00.0 -> 00:07.0
-> 01:00.2 -> 00:07.1
and
01.00.1,3 -> 01:00.1 -> 00:08.1
-> 01:00.3 -> 00:08.1
and
01.00.5 -> 01:00.5 -> 00:09.0
Cc: Dexuan Cui <dexuan.cui@intel.com>
Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
This commit is contained in:
1 parent
e22b1a81b3
commit
4cc88b66d7
2 files changed
+13
-10
No files matched your search
@@ -286,19 +286,13 @@ def parse_pci_name_extended(pci_dev_str):
|
||||
# Virtual slot assignment takes place here if specified in the bdf,
|
||||
# else it is done inside qemu-xen, as it knows which slots are free
|
||||
pci = []
|
||||
vfunc = 0;
|
||||
func_list = pci_func_list_process(pci_dev_str, template,
|
||||
pci_dev_info['func'])
|
||||
for func in func_list:
|
||||
pci_dev = template.copy()
|
||||
pci_dev['func'] = "0x%x" % func
|
||||
|
||||
if len(func_list) == 1:
|
||||
# For single-function devices vfunc must be 0
|
||||
vfunc = 0
|
||||
else:
|
||||
# For multi-function virtual devices,
|
||||
# identity map the func to vfunc
|
||||
vfunc = func
|
||||
if pci_dev_info['vdevfn'] == '':
|
||||
vdevfn = AUTO_PHP_SLOT | vfunc
|
||||
else:
|
||||
@@ -306,6 +300,7 @@ def parse_pci_name_extended(pci_dev_str):
|
||||
pci_dev['vdevfn'] = "0x%02x" % vdevfn
|
||||
|
||||
pci.append(pci_dev)
|
||||
vfunc += 1
|
||||
|
||||
# For pci attachment and detachment is it important that virtual
|
||||
# function 0 is done last. This is because is virtual function 0 that
|
||||
|
||||
@@ -2226,9 +2226,17 @@ def xm_pci_list(args):
|
||||
if len(devs) == 0:
|
||||
return
|
||||
|
||||
devs.sort(None,
|
||||
lambda x: (x['vdevfn'] - PCI_FUNC(x['vdevfn'])) << 32 |
|
||||
PCI_BDF(x['domain'], x['bus'], x['slot'], x['func']))
|
||||
def f(x):
|
||||
# The vfunc shouldn't be used for ordering if the vslot hasn't been
|
||||
# assigned as the output looks odd beacuse the vfunc isn't reported
|
||||
# but the (physical) function is.
|
||||
if x['vdevfn'] & AUTO_PHP_SLOT:
|
||||
vdevfn = AUTO_PHP_SLOT
|
||||
else:
|
||||
vdevfn = x['vdevfn']
|
||||
return (vdevfn << 32) | \
|
||||
PCI_BDF(x['domain'], x['bus'], x['slot'], x['func'])
|
||||
devs.sort(None, f)
|
||||
|
||||
has_vdevfn = False
|
||||
for x in devs:
|
||||
|
||||