Add new commands to manage SR-IOV device.
Signed-off-by: Yu Zhao <yu.zhao@xxxxxxxxx>
diff -r b642e39d96cf tools/python/xen/util/pci.py
--- a/tools/python/xen/util/pci.py Thu Sep 25 17:41:29 2008 +0100
+++ b/tools/python/xen/util/pci.py Sat Sep 27 01:08:05 2008 -0400
@@ -17,7 +17,7 @@
PROC_PCI_PATH = '/proc/bus/pci/devices'
PROC_PCI_NUM_RESOURCES = 7
-SYSFS_PCI_DEVS_PATH = '/bus/pci/devices'
+SYSFS_PCI_DEVS_PATH = '/bus/pci/devices/'
SYSFS_PCI_DEV_RESOURCE_PATH = '/resource'
SYSFS_PCI_DEV_CONFIG_PATH = '/config'
SYSFS_PCI_DEV_IRQ_PATH = '/irq'
@@ -28,6 +28,14 @@
SYSFS_PCI_DEV_SUBDEVICE_PATH = '/subsystem_device'
SYSFS_PCI_DEV_CLASS_PATH = '/class'
SYSFS_PCIBACK_PATH = '/bus/pci/drivers/pciback/'
+SYSFS_PCIBACK_NEWSLOT = 'new_slot'
+SYSFS_PCIBACK_REMOVESLOT = 'remove_slot'
+SYSFS_PCI_IOV_ENTRY = '/iov/'
+SYSFS_PCI_IOV_RID = 'rid'
+SYSFS_PCI_IOV_ENABLE = 'enable'
+SYSFS_PCI_IOV_NUMVFS = 'numvfs'
+SYSFS_PCI_IOV_TOTAL = 'totalvfs'
+SYSFS_PCI_IOV_INITIAL = 'initialvfs'
LSPCI_CMD = 'lspci'
@@ -330,6 +338,173 @@
result = result + [dev_list]
return result
+
+def pci_dev_name(dev):
+ match = re.match(r"((?P<d>[0-9a-fA-F]{1,4})[:,])?" + \
+ r"(?P<b>[0-9a-fA-F]{1,2})[:,]" + \
+ r"(?P<s>[0-9a-fA-F]{1,2})[.,]" + \
+ r"(?P<f>[0-7])$", dev)
+ if match == None:
+ print "Invalid PCI device name: %s." % dev
+ return None
+
+ a = match.groupdict('0')
+ return "%04x:%02x:%02x.%01x" % (int(a['d'], 16), \
+ int(a['b'], 16), int(a['s'], 16), int(a['f'], 16))
+
+def pciback_add_device(dev):
+ sysfs_mnt = find_sysfs_mnt()
+ slot = sysfs_mnt + SYSFS_PCIBACK_PATH + SYSFS_PCIBACK_NEWSLOT
+ f = open(slot, 'w')
+ f.write(dev)
+ f.close()
+
+def pciback_remove_device(dev):
+ sysfs_mnt = find_sysfs_mnt()
+ slot = sysfs_mnt + SYSFS_PCIBACK_PATH + SYSFS_PCIBACK_REMOVESLOT
+ f = open(slot, 'w')
+ f.write(dev)
+ f.close()
+
+def has_iov(dev):
+ sysfs_mnt = find_sysfs_mnt()
+ path = sysfs_mnt + SYSFS_PCI_DEVS_PATH + dev
+ if not os.path.isdir(path):
+ print "Device %s doesn't exist." % dev
+ return None
+
+ path += SYSFS_PCI_IOV_ENTRY
+ if not os.path.isdir(path):
+ print "Device %s doesn't have SR-IOV capability." % dev
+ return None
+
+ return path
+
+def has_vf(dev, i):
+ path = has_iov(dev)
+ if path == None:
+ return None
+
+ path += "%s/" % i
+ if not os.path.isdir(path):
+ print "Device %s doesn't have Virtual Function #%s." % (dev, i)
+ return None
+
+ return path
+
+def list_iov(dev):
+ path = has_iov(dev)
+ if path == None:
+ return False
+
+ f = open(path + SYSFS_PCI_IOV_ENABLE, 'r')
+ enable = f.readline().strip()
+ f.close()
+ f = open(path + SYSFS_PCI_IOV_NUMVFS, 'r')
+ numvfs = f.readline().strip()
+ f.close()
+ f = open(path + SYSFS_PCI_IOV_TOTAL, 'r')
+ total = f.readline().strip()
+ f.close()
+ f = open(path + SYSFS_PCI_IOV_INITIAL, 'r')
+ initial = f.readline().strip()
+ f.close()
+
+ print "Device: %s, SR-IOV Enabled: %s, TotalVFs: %s, InitialVFs: %s, " \
+ "NumVFs: %s" % (dev, enable, total, initial, numvfs)
+
+ for i in range(int(total)):
+ if i == 0:
+ ents = os.listdir(path + "%d/" % i)
+ ents.remove(SYSFS_PCI_IOV_RID)
+ f = open(path + "%d/" % i + SYSFS_PCI_IOV_RID, 'r')
+ output = "VF-%d:[%s]" % (i, f.readline().strip())
+ f.close()
+ for j in ents:
+ f = open(path + "%d/" % i + j, 'r')
+ output += ", %s:[%s]" % (j, f.readline().strip())
+ f.close()
+ print output
+
+ return True
+
+def enable_iov(dev, numvfs):
+ path = has_iov(dev)
+ if path == None:
+ return False
+
+ f1 = open(path + SYSFS_PCI_IOV_INITIAL, 'r')
+ initial = f1.readline().strip()
+ f1.close()
+
+ if int(numvfs) < 0 or int(numvfs) > int(initial):
+ print "Invalid NumVFS %s." % numvfs
+ return False
+
+ f1 = open(path + SYSFS_PCI_IOV_ENABLE, 'r+')
+ enable = f1.readline().strip()
+ if enable == "1":
+ print "Device %s SR-IOV is enabled." % dev
+ f1.close()
+ return False
+
+ f2 = open(path + SYSFS_PCI_IOV_NUMVFS, 'r+')
+ f2.write(numvfs)
+ f2.close()
+
+ for i in range(int(numvfs)):
+ f2 = open(path + "%d/" % i + SYSFS_PCI_IOV_RID, 'r')
+ rid = f2.readline()
+ f2.close()
+ pciback_add_device(rid)
+
+ f1.write("1")
+ f1.close()
+
+ return True
+
+def disable_iov(dev):
+ path = has_iov(dev)
+ if path == None:
+ return False
+
+ f1 = open(path + SYSFS_PCI_IOV_ENABLE, 'r+')
+ enable = f1.readline().strip()
+ if enable == "0":
+ print "Device %s SR-IOV isn't enabled." % dev
+ f1.close()
+ return False
+
+ f2 = open(path + SYSFS_PCI_IOV_NUMVFS, 'r')
+ numvfs = f2.readline().strip()
+ f2.close()
+
+ f1.write("0")
+ f1.close()
+
+ for i in range(int(numvfs)):
+ f1 = open(path + "%d/" % i + SYSFS_PCI_IOV_RID, 'r')
+ rid = f1.readline()
+ f1.close()
+ pciback_remove_device(rid)
+
+ return True
+
+def set_iov_param(dev, i, ent, value):
+ path = has_vf(dev, i)
+ if path == None:
+ return False
+
+ path += ent
+ if not os.path.isfile(path):
+ print "Device %s doesn't have parameter %s." % (dev, ent)
+ return None
+
+ f = open(path, 'w')
+ f.write(value)
+ f.close()
+
+ return True
class PciDeviceNotFoundError(Exception):
def __init__(self,domain,bus,slot,func):
diff -r b642e39d96cf tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py Thu Sep 25 17:41:29 2008 +0100
+++ b/tools/python/xen/xm/main.py Sat Sep 27 01:08:05 2008 -0400
@@ -199,6 +199,14 @@
'Detach a specified SCSI device.'),
'scsi-list' : ('<Domain> [--long]',
'List all SCSI devices currently attached.'),
+ 'iov-list' : ('<domain:bus:slot.func>',
+ 'List SR-IOV information of a device.'),
+ 'iov-enable' : ('<domain:bus:slot.func> <NumVFs>',
+ 'Enable SR-IOV capability of a device with NumVFs.'),
+ 'iov-disable' : ('<domain:bus:slot.func>',
+ 'Disable SR-IOV capability.'),
+ 'iov-setparam' : ('<domain:bus:slot.func> <VFN> <parameter name> <value>',
+ 'Set device specific parameters of a VF.'),
# security
@@ -377,6 +385,10 @@
"scsi-attach",
"scsi-detach",
"scsi-list",
+ "iov-list",
+ "iov-enable",
+ "iov-disable",
+ "iov-setparam",
]
vnet_commands = [
@@ -2258,6 +2270,30 @@
print "%(idx)-3d %(backend-id)-3d %(state)-5d " % ni,
print "%(p-dev)-10s %(p-devname)-5s %(v-dev)-10s
%(frontstate)-4s" % mi
+def xm_iov_list(args):
+ arg_check(args, 'iov-list', 1)
+ dev = pci_dev_name(args[0])
+ if dev == None or list_iov(dev) == False:
+ raise OptionError("Operation failed.")
+
+def xm_iov_enable(args):
+ arg_check(args, 'iov-enable', 2)
+ dev = pci_dev_name(args[0])
+ if dev == None or enable_iov(dev, args[1]) == False:
+ raise OptionError("Operation failed.")
+
+def xm_iov_disable(args):
+ arg_check(args, 'iov-disable', 1)
+ dev = pci_dev_name(args[0])
+ if dev == None or disable_iov(dev) == False:
+ raise OptionError("Operation failed.")
+
+def xm_iov_setparam(args):
+ arg_check(args, 'iov-setparam', 4)
+ dev = pci_dev_name(args[0])
+ if dev == None or set_iov_param(dev, args[1], args[2], args[3]) == False:
+ raise OptionError("Operation failed.")
+
def parse_block_configuration(args):
dom = args[0]
@@ -2808,6 +2844,10 @@
"scsi-attach": xm_scsi_attach,
"scsi-detach": xm_scsi_detach,
"scsi-list": xm_scsi_list,
+ "iov-list": xm_iov_list,
+ "iov-enable": xm_iov_enable,
+ "iov-disable": xm_iov_disable,
+ "iov-setparam": xm_iov_setparam,
}
## The commands supported by a separate argument parser in xend.xm.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|