From: cyliu@suse.com
To: xen-devel@lists.xensource.com
Cc: cyliu@suse.com
Subject: [PATCH 1 of 2] pci passtrough: add xm pci-assignable-add/remove commands
Date: Thu, 17 Jan 2013 13:29:51 +0800 [thread overview]
Message-ID: <f0b2ddf43585d50a8965.1358400591@linux-1.site> (raw)
In-Reply-To: <patchbomb.1358400590@linux-1.site>
Add two commands to xm, make xend toolstack parallel to xl toolstack. Functions
can be used in managed pci devices handling.
Signed-off-by: Chunyan Liu <cyliu@suse.com>
diff -r 64b36dde26bc -r f0b2ddf43585 tools/python/xen/util/pci.py
--- a/tools/python/xen/util/pci.py Fri Jan 04 15:58:37 2013 +0000
+++ b/tools/python/xen/util/pci.py Tue Jan 08 15:03:17 2013 +0800
@@ -20,6 +20,7 @@ from xen.xend import sxp
from xen.xend.XendConstants import AUTO_PHP_SLOT
from xen.xend.XendSXPDev import dev_dict_to_sxp
from xen.xend.XendLogging import log
+from xen.xend.xenstore.xstransact import xstransact
# for 2.3 compatibility
try:
@@ -27,9 +28,11 @@ try:
except NameError:
from sets import Set as set
+XS_PCIBACK_PATH = '/xm/pciback'
PROC_PCI_PATH = '/proc/bus/pci/devices'
PROC_PCI_NUM_RESOURCES = 7
+SYSFS_PCI_DRVS_PATH = 'bus/pci/drivers'
SYSFS_PCI_DEVS_PATH = '/bus/pci/devices'
SYSFS_PCI_DEV_RESOURCE_PATH = '/resource'
SYSFS_PCI_DEV_CONFIG_PATH = '/config'
@@ -427,6 +430,9 @@ def __pci_dict_to_fmt_str(fmt, dev):
def pci_dict_to_bdf_str(dev):
return __pci_dict_to_fmt_str('%04x:%02x:%02x.%01x', dev)
+def pci_dict_to_xs_bdf_str(dev):
+ return __pci_dict_to_fmt_str('%04x-%02x-%02x-%01x', dev)
+
def pci_dict_to_xc_str(dev):
return __pci_dict_to_fmt_str('0x%x, 0x%x, 0x%x, 0x%x', dev)
@@ -560,6 +566,111 @@ def find_all_assignable_devices():
dev_list = dev_list + [dev]
return dev_list
+def pci_assignable_add(dev, rebind):
+ '''detach pci device from driver that we need to unbind from and rebind
+ to pciback driver, then it can be assigned to guest.
+ '''
+ sysfs_mnt = find_sysfs_mnt()
+ pcidev_path = sysfs_mnt + SYSFS_PCI_DEVS_PATH
+ pciback_path = sysfs_mnt + SYSFS_PCIBACK_PATH
+
+ # See if the device exists
+ pci_bdf = pci_dict_to_bdf_str(dev)
+ path = pcidev_path + '/' + pci_bdf
+ if not os.path.exists(path):
+ log.debug("Pci device %s doesn't exist" % pci_bdf)
+ return -1
+
+ # Check to see if it's already assigned to pciback
+ path = pciback_path + '/' + pci_bdf
+ if os.path.exists(path):
+ log.debug("Pci device %s is already assigned to pciback" % pci_bdf)
+ return 0
+
+ # Check to see if there's already a driver that we need to unbind from
+ path = pcidev_path + '/' + pci_bdf + '/driver'
+ drv_path = None
+ if os.path.exists(path):
+ drv_path = os.path.realpath(path)
+ cmd = 'echo %s > %s/unbind' % (pci_bdf, drv_path)
+ if os.system(cmd):
+ log.debug("Couldn't unbind device")
+ return -1;
+
+ # Store Store driver_path for rebinding to dom0
+ if rebind:
+ if drv_path is not None:
+ xs_pci_bdf = pci_dict_to_xs_bdf_str(dev)
+ path = XS_PCIBACK_PATH + '/' + xs_pci_bdf
+ xstransact.Mkdir(path)
+ xstransact.Write(path, 'driver_path', drv_path)
+ else:
+ log.debug("Not bound to a driver, will not be rebound")
+
+ # Bind to pciback
+ # Scan through /sys/.../pciback/slots looking for pcidev's BDF
+ slots = os.popen('cat %s/slots' % pciback_path).read()
+ if re.search(pci_bdf, slots) is None:
+ # write bdf to new_slot
+ cmd = 'echo %s > %s/new_slot' % (pci_bdf, pciback_path)
+ if os.system(cmd):
+ log.debug("Couldn't add device to pciback new_slot")
+ return -1
+
+ # Bind to pciback
+ cmd = 'echo %s > %s/bind' % (pci_bdf, pciback_path)
+ if os.system(cmd):
+ log.debug("Couldn't bind device to pciback")
+ return -1
+
+ return 0
+
+def pci_assignable_remove(dev, rebind):
+ '''unbind pci device from pciback, and rebind to host pci driver where it
+ was detached from in pci-assignable-add.
+ '''
+ sysfs_mnt = find_sysfs_mnt()
+ pcidrv_path = sysfs_mnt + SYSFS_PCI_DRVS_PATH
+ pciback_path = sysfs_mnt + SYSFS_PCIBACK_PATH
+ pci_bdf = pci_dict_to_bdf_str(dev)
+
+ # Unbind from pciback
+ path = pciback_path + '/' + pci_bdf
+ if os.path.exists(path):
+ # unbind
+ cmd = 'echo %s > %s/unbind' % (pci_bdf, pciback_path)
+ if os.system(cmd):
+ log.debug("Couldn't unbind device to pciback")
+ return -1
+
+ # remove slots if necessary
+ slots = os.popen('cat %s/slots' % pciback_path).read()
+ if re.search(pci_bdf, slots):
+ # write bdf to remove_slot
+ cmd = 'echo %s > %s/remove_slot' % (pci_bdf, pciback_path)
+ if os.system(cmd):
+ log.debug("Couldn't remove pciback slot")
+ return -1
+ else:
+ log.debug("Not bound to pciback")
+
+ # Rebind if necessary
+ xs_pci_bdf = pci_dict_to_xs_bdf_str(dev)
+ path = XS_PCIBACK_PATH + '/' + xs_pci_bdf
+ drv_path = xstransact.Read(path, 'driver_path')
+ if drv_path:
+ if rebind:
+ cmd = 'echo %s > %s/bind' % (pci_bdf, drv_path)
+ if os.system(cmd):
+ log.debug("Couldn't rebind to driver %s" % drv_path)
+ return -1
+ xstransact.Remove(path)
+ else:
+ if rebind:
+ log.debug("Counldn't find path for original driver.Not rebinding")
+
+ return 0
+
def transform_list(target, src):
''' src: its element is pci string (Format: xxxx:xx:xx.x).
target: its element is pci string, or a list of pci string.
diff -r 64b36dde26bc -r f0b2ddf43585 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py Fri Jan 04 15:58:37 2013 +0000
+++ b/tools/python/xen/xm/main.py Tue Jan 08 15:03:17 2013 +0800
@@ -211,6 +211,10 @@ SUBCOMMAND_HELP = {
'pci-list' : ('<Domain>',
'List pass-through pci devices for a domain.'),
'pci-list-assignable-devices' : ('', 'List all the assignable pci devices'),
+ 'pci-assignable-add' : ('<domain:bus:slot.func>',
+ 'Add a pci device to assignable list.'),
+ 'pci-assignable-remove' : ('<domain:bus:slot.func>',
+ 'Remove pci device from assignable list.'),
'scsi-attach' : ('<Domain> <PhysDevice> <VirtDevice> [BackDomain]',
'Attach a new SCSI device.'),
'scsi-detach' : ('<Domain> <VirtDevice>',
@@ -472,6 +476,8 @@ device_commands = [
"pci-detach",
"pci-list",
"pci-list-assignable-devices",
+ "pci-assignable-add",
+ "pci-assignable-remove",
"scsi-attach",
"scsi-detach",
"scsi-list",
@@ -2488,6 +2494,21 @@ def xm_pci_list_assignable_devices(args)
pci = parse_pci_info(x)
print fmt_str % pci
+def xm_pci_assignable_add(args):
+ xenapi_unsupported()
+ arg_check(args, "pci-assignable-add", 1)
+
+ pci_dev_str = args[0]
+ pci_dev = parse_pci_name(pci_dev_str)
+ pci_assignable_add(pci_dev, 1)
+
+def xm_pci_assignable_remove(args):
+ xenapi_unsupported()
+ arg_check(args, "pci-assignable-remove", 1)
+
+ pci_dev_str = args[0]
+ pci_dev = parse_pci_name(pci_dev_str)
+ pci_assignable_remove(pci_dev, 1)
def vscsi_sort(devs):
def sort_hctl(ds, l):
@@ -3824,6 +3845,8 @@ commands = {
"pci-detach": xm_pci_detach,
"pci-list": xm_pci_list,
"pci-list-assignable-devices": xm_pci_list_assignable_devices,
+ "pci-assignable-add": xm_pci_assignable_add,
+ "pci-assignable-remove": xm_pci_assignable_remove,
# vscsi
"scsi-attach": xm_scsi_attach,
"scsi-detach": xm_scsi_detach,
next prev parent reply other threads:[~2013-01-17 5:29 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-17 5:29 [PATCH 0 of 2] pci passthrough: support "managed" pci device in xend for libvirt usage cyliu
2013-01-17 5:29 ` cyliu [this message]
2013-01-17 5:29 ` [PATCH 2 of 2] pci passthrough: handle managed pci devices cyliu
2013-01-17 18:00 ` [PATCH 0 of 2] pci passthrough: support "managed" pci device in xend for libvirt usage George Dunlap
2013-01-17 19:12 ` Jim Fehlig
2013-01-18 13:39 ` George Dunlap
2013-01-21 4:50 ` Jim Fehlig
2013-01-21 11:40 ` George Dunlap
2013-01-18 15:48 ` Konrad Rzeszutek Wilk
2013-01-18 16:16 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f0b2ddf43585d50a8965.1358400591@linux-1.site \
--to=cyliu@suse.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).