# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1246093280 -3600
# Node ID 22067ba1de0dc1cc54bd78c034401f9e87d87123
# Parent 4926b30ed56d7259c5b9ad2811f3e8712e83d820
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@xxxxxxxxx>
Cc: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>
Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
---
tools/python/xen/util/pci.py | 9 ++-------
tools/python/xen/xm/main.py | 14 +++++++++++---
2 files changed, 13 insertions(+), 10 deletions(-)
diff -r 4926b30ed56d -r 22067ba1de0d tools/python/xen/util/pci.py
--- a/tools/python/xen/util/pci.py Sat Jun 27 10:00:24 2009 +0100
+++ b/tools/python/xen/util/pci.py Sat Jun 27 10:01:20 2009 +0100
@@ -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
diff -r 4926b30ed56d -r 22067ba1de0d tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py Sat Jun 27 10:00:24 2009 +0100
+++ b/tools/python/xen/xm/main.py Sat Jun 27 10:01:20 2009 +0100
@@ -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:
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|