Simon Horman
2009-Mar-20 10:55 UTC
[Xen-devel] xend: specify the slot for pass-through devices
Currently a slot may be specified for a hot-plug device,
but not for a pass-through device that is inserted at boot time.
This patch adds support for the latter.
The syntax is:
BUS:DEV.FUNC[@VSLOT]
e.g: 0000:00:1d:0@7
This may be important as recent changes that allow any free PCI
slot to be used for pass-through (and hotplug) may case pass-through
devices to be assigned in different locations to before. Amongst
other things, specifying the slot will allow users to move them
back, if there is a need.
There is also an ioemu portion of this patch, which will be posted separately.
Signed-off-by: Simon Horman <horms@verge.net.au>
Index: xen-unstable.hg/tools/python/xen/xend/server/pciif.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xend/server/pciif.py 2009-03-20
21:41:12.000000000 +1100
+++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py 2009-03-20
21:41:15.000000000 +1100
@@ -75,6 +75,7 @@ class PciController(DevController):
bus = parse_hex(pci_config.get(''bus'', 0))
slot = parse_hex(pci_config.get(''slot'', 0))
func = parse_hex(pci_config.get(''func'', 0))
+ vslot = parse_hex(pci_config.get(''vslot'', 0))
opts = pci_config.get(''opts'',
'''')
if len(opts) > 0:
Index: xen-unstable.hg/tools/python/xen/xm/create.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xm/create.py 2009-03-20 21:41:12.000000000
+1100
+++ xen-unstable.hg/tools/python/xen/xm/create.py 2009-03-20 21:41:15.000000000
+1100
@@ -1,4 +1,4 @@
-#===========================================================================+#============================================================================UTO
# This library is free software; you can redistribute it and/or
# modify it under the terms of version 2.1 of the GNU Lesser General Public
# License as published by the Free Software Foundation.
@@ -32,6 +32,7 @@ from xen.xend import PrettyPrint as SXPP
from xen.xend import osdep
import xen.xend.XendClient
from xen.xend.XendBootloader import bootloader
+from xen.xend.XendConstants import *
from xen.xend.server.DevConstants import xenbusState
from xen.util import blkif
from xen.util import vscsi_util
@@ -322,10 +323,12 @@ gopts.var(''disk'',
val=''phy:DEV,VDEV,MODE
backend driver domain to use for the disk.
The option may be repeated to add more than one
disk.""")
-gopts.var(''pci'',
val=''BUS:DEV.FUNC[,msitranslate=0|1][,power_mgmt=0|1]'',
+gopts.var(''pci'',
val=''BUS:DEV.FUNC[@VSLOT][,msitranslate=0|1][,power_mgmt=0|1]'',
fn=append_value, default=[],
use="""Add a PCI device to a domain, using given
params (in hex).
For example ''pci=c0:02.1''.
+ If VSLOT is supplied the device will be inserted into that
+ virtual slot in the guest, else a free slot is selected.
If msitranslate is set, MSI-INTx translation is enabled if possible.
Guest that doesn''t support MSI will get IO-APIC type IRQs
translated from physical MSI, HVM only. Default is 1.
@@ -696,7 +699,7 @@ def configure_pci(config_devs, vals):
"""Create the config for pci devices.
"""
config_pci = []
- for (domain, bus, slot, func, opts) in vals.pci:
+ for (domain, bus, slot, func, vslot, opts) in vals.pci:
config_pci_opts = []
d = comma_sep_kv_to_dict(opts)
@@ -707,7 +710,7 @@ def configure_pci(config_devs, vals):
config_pci_opts.append([k, d[k]])
config_pci_bdf = [''dev'', [''domain'',
domain], [''bus'', bus], \
- [''slot'', slot],
[''func'', func]]
+ [''slot'', slot],
[''func'', func], [''vslot'', vslot]]
map(f, d.keys())
if len(config_pci_opts)>0:
config_pci_bdf.append([''opts'', config_pci_opts])
@@ -1054,16 +1057,21 @@ def preprocess_pci(vals):
r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + \
r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + \
r"(?P<func>[0-7])" + \
- r"(,(?P<opts>.*))?$", pci_dev_str)
+ r"(@(?P<vslot>[0-9a-fA-F]))?" + \
+ r"(,(?P<opts>.*))?$", \
+ pci_dev_str)
if pci_match!=None:
pci_dev_info = pci_match.groupdict('''')
if pci_dev_info[''domain'']=='''':
pci_dev_info[''domain'']=''0''
+ if pci_dev_info[''vslot'']=='''':
+ pci_dev_info[''vslot'']="%02x" %
AUTO_PHP_SLOT
try:
pci.append(
(''0x''+pci_dev_info[''domain''], \
''0x''+pci_dev_info[''bus''], \
''0x''+pci_dev_info[''slot''], \
''0x''+pci_dev_info[''func''], \
+
''0x''+pci_dev_info[''vslot''], \
pci_dev_info[''opts'']))
except IndexError:
err(''Error in PCI slot syntax
"%s"''%(pci_dev_str))
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-Mar-20 11:07 UTC
Re: [Xen-devel] xend: specify the slot for pass-through devices
Sorry, I should have noted in the subject of the original email that this is an rfc. In particular with regards to inclusion in 3.4. My opinion is that that it would be a good addition to 3.4. On Fri, Mar 20, 2009 at 09:55:03PM +1100, Simon Horman wrote:> Currently a slot may be specified for a hot-plug device, > but not for a pass-through device that is inserted at boot time. > This patch adds support for the latter. > > The syntax is: > BUS:DEV.FUNC[@VSLOT] > e.g: 0000:00:1d:0@7 > > This may be important as recent changes that allow any free PCI > slot to be used for pass-through (and hotplug) may case pass-through > devices to be assigned in different locations to before. Amongst > other things, specifying the slot will allow users to move them > back, if there is a need. > > There is also an ioemu portion of this patch, which will be posted separately. > > Signed-off-by: Simon Horman <horms@verge.net.au> > > Index: xen-unstable.hg/tools/python/xen/xend/server/pciif.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/xend/server/pciif.py 2009-03-20 21:41:12.000000000 +1100 > +++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py 2009-03-20 21:41:15.000000000 +1100 > @@ -75,6 +75,7 @@ class PciController(DevController): > bus = parse_hex(pci_config.get(''bus'', 0)) > slot = parse_hex(pci_config.get(''slot'', 0)) > func = parse_hex(pci_config.get(''func'', 0)) > + vslot = parse_hex(pci_config.get(''vslot'', 0)) > > opts = pci_config.get(''opts'', '''') > if len(opts) > 0: > Index: xen-unstable.hg/tools/python/xen/xm/create.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/xm/create.py 2009-03-20 21:41:12.000000000 +1100 > +++ xen-unstable.hg/tools/python/xen/xm/create.py 2009-03-20 21:41:15.000000000 +1100 > @@ -1,4 +1,4 @@ > -#===========================================================================> +#============================================================================UTO > # This library is free software; you can redistribute it and/or > # modify it under the terms of version 2.1 of the GNU Lesser General Public > # License as published by the Free Software Foundation. > @@ -32,6 +32,7 @@ from xen.xend import PrettyPrint as SXPP > from xen.xend import osdep > import xen.xend.XendClient > from xen.xend.XendBootloader import bootloader > +from xen.xend.XendConstants import * > from xen.xend.server.DevConstants import xenbusState > from xen.util import blkif > from xen.util import vscsi_util > @@ -322,10 +323,12 @@ gopts.var(''disk'', val=''phy:DEV,VDEV,MODE > backend driver domain to use for the disk. > The option may be repeated to add more than one disk.""") > > -gopts.var(''pci'', val=''BUS:DEV.FUNC[,msitranslate=0|1][,power_mgmt=0|1]'', > +gopts.var(''pci'', val=''BUS:DEV.FUNC[@VSLOT][,msitranslate=0|1][,power_mgmt=0|1]'', > fn=append_value, default=[], > use="""Add a PCI device to a domain, using given params (in hex). > For example ''pci=c0:02.1''. > + If VSLOT is supplied the device will be inserted into that > + virtual slot in the guest, else a free slot is selected. > If msitranslate is set, MSI-INTx translation is enabled if possible. > Guest that doesn''t support MSI will get IO-APIC type IRQs > translated from physical MSI, HVM only. Default is 1. > @@ -696,7 +699,7 @@ def configure_pci(config_devs, vals): > """Create the config for pci devices. > """ > config_pci = [] > - for (domain, bus, slot, func, opts) in vals.pci: > + for (domain, bus, slot, func, vslot, opts) in vals.pci: > config_pci_opts = [] > d = comma_sep_kv_to_dict(opts) > > @@ -707,7 +710,7 @@ def configure_pci(config_devs, vals): > config_pci_opts.append([k, d[k]]) > > config_pci_bdf = [''dev'', [''domain'', domain], [''bus'', bus], \ > - [''slot'', slot], [''func'', func]] > + [''slot'', slot], [''func'', func], [''vslot'', vslot]] > map(f, d.keys()) > if len(config_pci_opts)>0: > config_pci_bdf.append([''opts'', config_pci_opts]) > @@ -1054,16 +1057,21 @@ def preprocess_pci(vals): > r"(?P<bus>[0-9a-fA-F]{1,2})[:,]" + \ > r"(?P<slot>[0-9a-fA-F]{1,2})[.,]" + \ > r"(?P<func>[0-7])" + \ > - r"(,(?P<opts>.*))?$", pci_dev_str) > + r"(@(?P<vslot>[0-9a-fA-F]))?" + \ > + r"(,(?P<opts>.*))?$", \ > + pci_dev_str) > if pci_match!=None: > pci_dev_info = pci_match.groupdict('''') > if pci_dev_info[''domain'']=='''': > pci_dev_info[''domain'']=''0'' > + if pci_dev_info[''vslot'']=='''': > + pci_dev_info[''vslot'']="%02x" % AUTO_PHP_SLOT > try: > pci.append( (''0x''+pci_dev_info[''domain''], \ > ''0x''+pci_dev_info[''bus''], \ > ''0x''+pci_dev_info[''slot''], \ > ''0x''+pci_dev_info[''func''], \ > + ''0x''+pci_dev_info[''vslot''], \ > pci_dev_info[''opts''])) > except IndexError: > err(''Error in PCI slot syntax "%s"''%(pci_dev_str)) > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel-- Simon Horman VA Linux Systems Japan K.K., Sydney, Australia Satellite Office H: www.vergenet.net/~horms/ W: www.valinux.co.jp/en _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel