Simon Horman
2009-May-26 06:33 UTC
[Xen-devel] [patch] [xm, xend] passthrough: Add assigned_or_requested_vslot()
Add an accessor to simplify accessing vslot if available,
otherwise requested_vslot.
Lightly tested
Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
---
tools/python/xen/util/pci.py | 14 +++++++++++++-
tools/python/xen/xend/XendDomainInfo.py | 16 ++++------------
tools/python/xen/xend/server/pciif.py | 10 +++++-----
tools/python/xen/xm/main.py | 12 +++---------
4 files changed, 25 insertions(+), 27 deletions(-)
Index: xen-unstable.hg/tools/python/xen/util/pci.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/util/pci.py 2009-05-26 14:17:52.000000000
+1000
+++ xen-unstable.hg/tools/python/xen/util/pci.py 2009-05-26 14:38:36.000000000
+1000
@@ -138,7 +138,13 @@ def parse_pci_name(pci_name_string):
func = parse_hex(pci_dev_info[''func''])
return (domain, bus, slot, func)
-
+
+def assigned_or_requested_vslot(dev):
+ if dev.has_key("vslot"):
+ return dev["vslot"]
+ if dev.has_key("requested_vslot"):
+ return dev["requested_vslot"]
+ raise PciDeviceVslotMissing("%s" % dev)
def find_sysfs_mnt():
try:
@@ -355,6 +361,12 @@ class PciDeviceAssignmentError(Exception
return ''pci: impproper device assignment spcified: ''
+ \
self.message
+class PciDeviceVslotMissing(Exception):
+ def __init__(self,msg):
+ self.message = msg
+ def __str__(self):
+ return ''pci: no vslot or requested_vslot: '' +
self.message
+
class PciDevice:
def __init__(self, domain, bus, slot, func):
self.domain = domain
Index: xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xend/XendDomainInfo.py 2009-05-26
14:37:18.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py 2009-05-26
16:29:41.000000000 +1000
@@ -38,6 +38,7 @@ from xen.util import asserts
from xen.util.blkif import blkdev_uname_to_file, blkdev_uname_to_taptype
import xen.util.xsm.xsm as security
from xen.util import xsconstants
+from xen.util.pci import assigned_or_requested_vslot
from xen.xend import balloon, sxp, uuid, image, arch, osdep
from xen.xend import XendOptions, XendNode, XendConfig
@@ -621,10 +622,7 @@ class XendDomainInfo:
pci_conf = self.info[''devices''][dev_uuid][1]
pci_devs = pci_conf[''devs'']
for x in pci_devs:
- if x.has_key(''vslot''):
- x_vslot = x[''vslot'']
- else:
- x_vslot = x[''requested_vslot'']
+ x_vslot = assigned_or_requested_vslot(x)
if (int(x_vslot, 16) ==
int(new_dev[''requested_vslot''], 16) and
int(x_vslot, 16) != AUTO_PHP_SLOT):
raise VmError("vslot %s already have a device." %
(new_dev[''requested_vslot'']))
@@ -819,10 +817,7 @@ class XendDomainInfo:
int(x[''bus''], 16) ==
int(dev[''bus''], 16) and
int(x[''slot''], 16) ==
int(dev[''slot''], 16) and
int(x[''func''], 16) ==
int(dev[''func''], 16) ):
- if x.has_key(''vslot''):
- vslot = x[''vslot'']
- else:
- vslot = x[''requested_vslot'']
+ vslot = assigned_or_requested_vslot(x)
break
if vslot == AUTO_PHP_SLOT_STR:
raise VmError("Device %04x:%02x:%02x.%01x is not
connected"
@@ -1119,10 +1114,7 @@ class XendDomainInfo:
#find the pass-through device with the virtual slot
devnum = 0
for x in pci_conf[''devs'']:
- if x.has_key(''vslot''):
- x_vslot = x[''vslot'']
- else:
- x_vslot = x[''requested_vslot'']
+ x_vslot = assigned_or_requested_vslot(x)
if int(x_vslot, 16) == vslot:
break
devnum += 1
Index: xen-unstable.hg/tools/python/xen/xend/server/pciif.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xend/server/pciif.py 2009-05-26
14:37:15.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py 2009-05-26
14:38:36.000000000 +1000
@@ -71,15 +71,15 @@ class PciController(DevController):
pcidevid = 0
vslots = ""
for pci_config in config.get(''devs'', []):
- vslot = pci_config.get(''vslot'')
- if vslot is not None:
- vslots = vslots + vslot + ";"
+ attached_vslot = pci_config.get(''vslot'')
+ if attached_vslot is not None:
+ vslots = vslots + attached_vslot + ";"
domain = parse_hex(pci_config.get(''domain'', 0))
bus = parse_hex(pci_config.get(''bus'', 0))
slot = parse_hex(pci_config.get(''slot'', 0))
func = parse_hex(pci_config.get(''func'', 0))
- requested_vslot =
parse_hex(pci_config.get(''requested_vslot'', 0))
+ vslot = parse_hex(assigned_or_requested_vslot(pci_config))
opts = pci_config.get(''opts'',
'''')
if len(opts) > 0:
@@ -90,7 +90,7 @@ class PciController(DevController):
back[''dev-%i'' % pcidevid] =
"%04x:%02x:%02x.%01x" % \
(domain, bus, slot, func)
back[''uuid-%i'' % pcidevid] =
pci_config.get(''uuid'', '''')
- back[''vslot-%i'' % pcidevid] = "%02x" %
requested_vslot
+ back[''vslot-%i'' % pcidevid] = "%02x" %
vslot
pcidevid += 1
if vslots != "":
Index: xen-unstable.hg/tools/python/xen/xm/main.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xm/main.py 2009-05-26 14:37:15.000000000
+1000
+++ xen-unstable.hg/tools/python/xen/xm/main.py 2009-05-26 14:38:36.000000000
+1000
@@ -2167,18 +2167,12 @@ def xm_pci_list(args):
has_vslot = False
for x in devs:
- if x.has_key(''vslot''):
- if x[''vslot''] == "0x%s" %
AUTO_PHP_SLOT_STR:
- x[''vslot''] = ''-''
- else:
- has_vslot = True
- elif not x.has_key(''requested_vslot''):
- x[''vslot''] = ''-''
- elif x[''requested_vslot''] == "0x%s" %
AUTO_PHP_SLOT_STR:
+ vslot = assigned_or_requested_vslot(x)
+ if int(vslot, 16) == AUTO_PHP_SLOT:
x[''vslot''] = ''-''
else:
+ x[''vslot''] = vslot
has_vslot = True
- x[''vslot''] =
x[''requested_vslot'']
if has_vslot:
hdr_str = ''VSlt domain bus slot func''
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Masaki Kanno
2009-May-26 07:24 UTC
Re: [Xen-devel] [patch] [xm, xend] passthrough: Add assigned_or_requested_vslot()
Hi Simon,
Great!! Your patch is of importance.
If without your patch, we cannot start domains. I found a problem
about starting domains. The reproduction operations of the problem
are as follows.
Step to Reproduce:
1. xm start <domain>
2. xm pci-attach <domain> **:**.* *
3. Shutdown guest OS on <domain>
4. xm start <domain> ---> fail
Your patch has solved the problem.
Trivial comment:
The following line includes Tab indent.
Index: xen-unstable.hg/tools/python/xen/xm/main.py
==================================================================---
xen-unstable.hg.orig/tools/python/xen/xm/main.py 2009-05-26 14:
37:15.000000000 +1000
+++ xen-unstable.hg/tools/python/xen/xm/main.py 2009-05-26 14:38:36.
000000000 +1000
@@ -2167,18 +2167,12 @@ def xm_pci_list(args):
has_vslot = False
for x in devs:
- if x.has_key(''vslot''):
- if x[''vslot''] == "0x%s" %
AUTO_PHP_SLOT_STR:
- x[''vslot''] = ''-''
- else:
- has_vslot = True
- elif not x.has_key(''requested_vslot''):
- x[''vslot''] = ''-''
- elif x[''requested_vslot''] == "0x%s" %
AUTO_PHP_SLOT_STR:
+ vslot = assigned_or_requested_vslot(x) <------------ here!!
+ if int(vslot, 16) == AUTO_PHP_SLOT:
x[''vslot''] = ''-''
else:
+ x[''vslot''] = vslot
has_vslot = True
- x[''vslot''] =
x[''requested_vslot'']
if has_vslot:
hdr_str = ''VSlt domain bus slot func''
Best regards,
Kan
Tue, 26 May 2009 16:33:42 +1000, Simon Horman wrote:
>Add an accessor to simplify accessing vslot if available,
>otherwise requested_vslot.
>
>Lightly tested
>
>Cc: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
>Signed-off-by: Simon Horman <horms@verge.net.au>
>
>---
>
> tools/python/xen/util/pci.py | 14 +++++++++++++-
> tools/python/xen/xend/XendDomainInfo.py | 16 ++++------------
> tools/python/xen/xend/server/pciif.py | 10 +++++-----
> tools/python/xen/xm/main.py | 12 +++---------
> 4 files changed, 25 insertions(+), 27 deletions(-)
>
>Index: xen-unstable.hg/tools/python/xen/util/pci.py
>==================================================================>---
xen-unstable.hg.orig/tools/python/xen/util/pci.py 2009-05-26 14:17:52.
>000000000 +1000
>+++ xen-unstable.hg/tools/python/xen/util/pci.py 2009-05-26 14:38:36.
>000000000 +1000
>@@ -138,7 +138,13 @@ def parse_pci_name(pci_name_string):
> func = parse_hex(pci_dev_info[''func''])
>
> return (domain, bus, slot, func)
>-
>+
>+def assigned_or_requested_vslot(dev):
>+ if dev.has_key("vslot"):
>+ return dev["vslot"]
>+ if dev.has_key("requested_vslot"):
>+ return dev["requested_vslot"]
>+ raise PciDeviceVslotMissing("%s" % dev)
>
> def find_sysfs_mnt():
> try:
>@@ -355,6 +361,12 @@ class PciDeviceAssignmentError(Exception
> return ''pci: impproper device assignment spcified:
'' + \
> self.message
>
>+class PciDeviceVslotMissing(Exception):
>+ def __init__(self,msg):
>+ self.message = msg
>+ def __str__(self):
>+ return ''pci: no vslot or requested_vslot: '' +
self.message
>+
> class PciDevice:
> def __init__(self, domain, bus, slot, func):
> self.domain = domain
>Index: xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py
>==================================================================>---
xen-unstable.hg.orig/tools/python/xen/xend/XendDomainInfo.py 2009-05
-26> 14:37:18.000000000 +1000
>+++ xen-unstable.hg/tools/python/xen/xend/XendDomainInfo.py 2009-05-26 16:
>29:41.000000000 +1000
>@@ -38,6 +38,7 @@ from xen.util import asserts
> from xen.util.blkif import blkdev_uname_to_file, blkdev_uname_to_taptype
> import xen.util.xsm.xsm as security
> from xen.util import xsconstants
>+from xen.util.pci import assigned_or_requested_vslot
>
> from xen.xend import balloon, sxp, uuid, image, arch, osdep
> from xen.xend import XendOptions, XendNode, XendConfig
>@@ -621,10 +622,7 @@ class XendDomainInfo:
> pci_conf = self.info[''devices''][dev_uuid][1]
> pci_devs = pci_conf[''devs'']
> for x in pci_devs:
>- if x.has_key(''vslot''):
>- x_vslot = x[''vslot'']
>- else:
>- x_vslot = x[''requested_vslot'']
>+ x_vslot = assigned_or_requested_vslot(x)
> if (int(x_vslot, 16) ==
int(new_dev[''requested_vslot''], 16
>) and
> int(x_vslot, 16) != AUTO_PHP_SLOT):
> raise VmError("vslot %s already have a
device." % (
>new_dev[''requested_vslot'']))
>@@ -819,10 +817,7 @@ class XendDomainInfo:
> int(x[''bus''], 16) ==
int(dev[''bus''], 16) and
> int(x[''slot''], 16) ==
int(dev[''slot''], 16) and
> int(x[''func''], 16) ==
int(dev[''func''], 16) ):
>- if x.has_key(''vslot''):
>- vslot = x[''vslot'']
>- else:
>- vslot = x[''requested_vslot'']
>+ vslot = assigned_or_requested_vslot(x)
> break
> if vslot == AUTO_PHP_SLOT_STR:
> raise VmError("Device %04x:%02x:%02x.%01x is not
>connected"
>@@ -1119,10 +1114,7 @@ class XendDomainInfo:
> #find the pass-through device with the virtual slot
> devnum = 0
> for x in pci_conf[''devs'']:
>- if x.has_key(''vslot''):
>- x_vslot = x[''vslot'']
>- else:
>- x_vslot = x[''requested_vslot'']
>+ x_vslot = assigned_or_requested_vslot(x)
> if int(x_vslot, 16) == vslot:
> break
> devnum += 1
>Index: xen-unstable.hg/tools/python/xen/xend/server/pciif.py
>==================================================================>---
xen-unstable.hg.orig/tools/python/xen/xend/server/pciif.py 2009-05-26
>14:37:15.000000000 +1000
>+++ xen-unstable.hg/tools/python/xen/xend/server/pciif.py 2009-05-26 14:
38:>36.000000000 +1000
>@@ -71,15 +71,15 @@ class PciController(DevController):
> pcidevid = 0
> vslots = ""
> for pci_config in config.get(''devs'', []):
>- vslot = pci_config.get(''vslot'')
>- if vslot is not None:
>- vslots = vslots + vslot + ";"
>+ attached_vslot = pci_config.get(''vslot'')
>+ if attached_vslot is not None:
>+ vslots = vslots + attached_vslot + ";"
>
> domain = parse_hex(pci_config.get(''domain'',
0))
> bus = parse_hex(pci_config.get(''bus'', 0))
> slot = parse_hex(pci_config.get(''slot'', 0))
> func = parse_hex(pci_config.get(''func'', 0))
>- requested_vslot =
parse_hex(pci_config.get(''requested_vslot'',
>0))
>+ vslot = parse_hex(assigned_or_requested_vslot(pci_config))
>
> opts = pci_config.get(''opts'',
'''')
> if len(opts) > 0:
>@@ -90,7 +90,7 @@ class PciController(DevController):
> back[''dev-%i'' % pcidevid] =
"%04x:%02x:%02x.%01x" % \
> (domain, bus, slot, func)
> back[''uuid-%i'' % pcidevid] =
pci_config.get(''uuid'', '''')
>- back[''vslot-%i'' % pcidevid] =
"%02x" % requested_vslot
>+ back[''vslot-%i'' % pcidevid] =
"%02x" % vslot
> pcidevid += 1
>
> if vslots != "":
>Index: xen-unstable.hg/tools/python/xen/xm/main.py
>==================================================================>---
xen-unstable.hg.orig/tools/python/xen/xm/main.py 2009-05-26 14:37:15.
>000000000 +1000
>+++ xen-unstable.hg/tools/python/xen/xm/main.py 2009-05-26 14:38:36.
>000000000 +1000
>@@ -2167,18 +2167,12 @@ def xm_pci_list(args):
>
> has_vslot = False
> for x in devs:
>- if x.has_key(''vslot''):
>- if x[''vslot''] == "0x%s" %
AUTO_PHP_SLOT_STR:
>- x[''vslot''] = ''-''
>- else:
>- has_vslot = True
>- elif not x.has_key(''requested_vslot''):
>- x[''vslot''] = ''-''
>- elif x[''requested_vslot''] == "0x%s" %
AUTO_PHP_SLOT_STR:
>+ vslot = assigned_or_requested_vslot(x)
>+ if int(vslot, 16) == AUTO_PHP_SLOT:
> x[''vslot''] = ''-''
> else:
>+ x[''vslot''] = vslot
> has_vslot = True
>- x[''vslot''] =
x[''requested_vslot'']
>
> if has_vslot:
> hdr_str = ''VSlt domain bus slot func''
>
>_______________________________________________
>Xen-devel mailing list
>Xen-devel@lists.xensource.com
>http://lists.xensource.com/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Horman
2009-May-26 08:41 UTC
Re: [Xen-devel] [patch] [xm, xend] passthrough: Add assigned_or_requested_vslot()
On Tue, May 26, 2009 at 04:24:05PM +0900, Masaki Kanno wrote:> Hi Simon, > > Great!! Your patch is of importance. > If without your patch, we cannot start domains. I found a problem > about starting domains. The reproduction operations of the problem > are as follows. > > Step to Reproduce: > 1. xm start <domain> > 2. xm pci-attach <domain> **:**.* * > 3. Shutdown guest OS on <domain> > 4. xm start <domain> ---> fail > > Your patch has solved the problem.Great!> Trivial comment: > The following line includes Tab indent.Sorry, I will fix that and repost.> Index: xen-unstable.hg/tools/python/xen/xm/main.py > ==================================================================> --- xen-unstable.hg.orig/tools/python/xen/xm/main.py 2009-05-26 14: > 37:15.000000000 +1000 > +++ xen-unstable.hg/tools/python/xen/xm/main.py 2009-05-26 14:38:36. > 000000000 +1000 > @@ -2167,18 +2167,12 @@ def xm_pci_list(args): > > has_vslot = False > for x in devs: > - if x.has_key(''vslot''): > - if x[''vslot''] == "0x%s" % AUTO_PHP_SLOT_STR: > - x[''vslot''] = ''-'' > - else: > - has_vslot = True > - elif not x.has_key(''requested_vslot''): > - x[''vslot''] = ''-'' > - elif x[''requested_vslot''] == "0x%s" % AUTO_PHP_SLOT_STR: > + vslot = assigned_or_requested_vslot(x) <------------ here!! > + if int(vslot, 16) == AUTO_PHP_SLOT: > x[''vslot''] = ''-'' > else: > + x[''vslot''] = vslot > has_vslot = True > - x[''vslot''] = x[''requested_vslot''] > > if has_vslot: > hdr_str = ''VSlt domain bus slot func''_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel