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:
Keir Fraser committed 2009-06-27 10:01:20 +01:00
1 parent e22b1a81b3
commit 4cc88b66d7
2 files changed
+13 -10

No files matched your search

+2 -7
View File
@@ -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
+11 -3
View File
@@ -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:
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.