diff options
author | Dexuan Cui <decui@microsoft.com> | 2015-08-05 03:52:44 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-08-05 14:44:29 -0400 |
commit | 502d84bd1aa2445b13ff75e8ac2a39d249f791ee (patch) | |
tree | a63102288ea124ebb6b4e7198c10be71c60d4d05 /tools/hv | |
parent | 042ab0313bbb7e776e9510da3f07fb300d08a8ba (diff) |
tools: hv: add a python script lsvmbus to list VMBus devices
By default lsvmbus lists all the devices in the VMBus.
With -v or -vv, more information is printed, including the VMBus
Rel_ID, class ID, device ID and which channel is bound to which
virtual processor, etc.
Signed-off-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'tools/hv')
-rw-r--r-- | tools/hv/lsvmbus | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/tools/hv/lsvmbus b/tools/hv/lsvmbus new file mode 100644 index 000000000000..162a3784d80e --- /dev/null +++ b/tools/hv/lsvmbus | |||
@@ -0,0 +1,101 @@ | |||
1 | #!/usr/bin/env python | ||
2 | |||
3 | import os | ||
4 | from optparse import OptionParser | ||
5 | |||
6 | parser = OptionParser() | ||
7 | parser.add_option("-v", "--verbose", dest="verbose", | ||
8 | help="print verbose messages. Try -vv, -vvv for \ | ||
9 | more verbose messages", action="count") | ||
10 | |||
11 | (options, args) = parser.parse_args() | ||
12 | |||
13 | verbose = 0 | ||
14 | if options.verbose is not None: | ||
15 | verbose = options.verbose | ||
16 | |||
17 | vmbus_sys_path = '/sys/bus/vmbus/devices' | ||
18 | if not os.path.isdir(vmbus_sys_path): | ||
19 | print "%s doesn't exist: exiting..." % vmbus_sys_path | ||
20 | exit(-1) | ||
21 | |||
22 | vmbus_dev_dict = { | ||
23 | '{0e0b6031-5213-4934-818b-38d90ced39db}' : '[Operating system shutdown]', | ||
24 | '{9527e630-d0ae-497b-adce-e80ab0175caf}' : '[Time Synchronization]', | ||
25 | '{57164f39-9115-4e78-ab55-382f3bd5422d}' : '[Heartbeat]', | ||
26 | '{a9a0f4e7-5a45-4d96-b827-8a841e8c03e6}' : '[Data Exchange]', | ||
27 | '{35fa2e29-ea23-4236-96ae-3a6ebacba440}' : '[Backup (volume checkpoint)]', | ||
28 | '{34d14be3-dee4-41c8-9ae7-6b174977c192}' : '[Guest services]', | ||
29 | '{525074dc-8985-46e2-8057-a307dc18a502}' : '[Dynamic Memory]', | ||
30 | '{cfa8b69e-5b4a-4cc0-b98b-8ba1a1f3f95a}' : 'Synthetic mouse', | ||
31 | '{f912ad6d-2b17-48ea-bd65-f927a61c7684}' : 'Synthetic keyboard', | ||
32 | '{da0a7802-e377-4aac-8e77-0558eb1073f8}' : 'Synthetic framebuffer adapter', | ||
33 | '{f8615163-df3e-46c5-913f-f2d2f965ed0e}' : 'Synthetic network adapter', | ||
34 | '{32412632-86cb-44a2-9b5c-50d1417354f5}' : 'Synthetic IDE Controller', | ||
35 | '{ba6163d9-04a1-4d29-b605-72e2ffb1dc7f}' : 'Synthetic SCSI Controller', | ||
36 | '{2f9bcc4a-0069-4af3-b76b-6fd0be528cda}' : 'Synthetic fiber channel adapter', | ||
37 | '{8c2eaf3d-32a7-4b09-ab99-bd1f1c86b501}' : 'Synthetic RDMA adapter', | ||
38 | '{276aacf4-ac15-426c-98dd-7521ad3f01fe}' : '[Reserved system device]', | ||
39 | '{f8e65716-3cb3-4a06-9a60-1889c5cccab5}' : '[Reserved system device]', | ||
40 | '{3375baf4-9e15-4b30-b765-67acb10d607b}' : '[Reserved system device]', | ||
41 | } | ||
42 | |||
43 | def get_vmbus_dev_attr(dev_name, attr): | ||
44 | try: | ||
45 | f = open('%s/%s/%s' % (vmbus_sys_path, dev_name, attr), 'r') | ||
46 | lines = f.readlines() | ||
47 | f.close() | ||
48 | except IOError: | ||
49 | lines = [] | ||
50 | |||
51 | return lines | ||
52 | |||
53 | class VMBus_Dev: | ||
54 | pass | ||
55 | |||
56 | |||
57 | vmbus_dev_list = [] | ||
58 | |||
59 | for f in os.listdir(vmbus_sys_path): | ||
60 | vmbus_id = get_vmbus_dev_attr(f, 'id')[0].strip() | ||
61 | class_id = get_vmbus_dev_attr(f, 'class_id')[0].strip() | ||
62 | device_id = get_vmbus_dev_attr(f, 'device_id')[0].strip() | ||
63 | dev_desc = vmbus_dev_dict.get(class_id, 'Unknown') | ||
64 | |||
65 | chn_vp_mapping = get_vmbus_dev_attr(f, 'channel_vp_mapping') | ||
66 | chn_vp_mapping = [c.strip() for c in chn_vp_mapping] | ||
67 | chn_vp_mapping = sorted(chn_vp_mapping, | ||
68 | key = lambda c : int(c.split(':')[0])) | ||
69 | |||
70 | chn_vp_mapping = ['\tRel_ID=%s, target_cpu=%s' % | ||
71 | (c.split(':')[0], c.split(':')[1]) | ||
72 | for c in chn_vp_mapping] | ||
73 | d = VMBus_Dev() | ||
74 | d.sysfs_path = '%s/%s' % (vmbus_sys_path, f) | ||
75 | d.vmbus_id = vmbus_id | ||
76 | d.class_id = class_id | ||
77 | d.device_id = device_id | ||
78 | d.dev_desc = dev_desc | ||
79 | d.chn_vp_mapping = '\n'.join(chn_vp_mapping) | ||
80 | if d.chn_vp_mapping: | ||
81 | d.chn_vp_mapping += '\n' | ||
82 | |||
83 | vmbus_dev_list.append(d) | ||
84 | |||
85 | |||
86 | vmbus_dev_list = sorted(vmbus_dev_list, key = lambda d : int(d.vmbus_id)) | ||
87 | |||
88 | format0 = '%2s: %s' | ||
89 | format1 = '%2s: Class_ID = %s - %s\n%s' | ||
90 | format2 = '%2s: Class_ID = %s - %s\n\tDevice_ID = %s\n\tSysfs path: %s\n%s' | ||
91 | |||
92 | for d in vmbus_dev_list: | ||
93 | if verbose == 0: | ||
94 | print ('VMBUS ID ' + format0) % (d.vmbus_id, d.dev_desc) | ||
95 | elif verbose == 1: | ||
96 | print ('VMBUS ID ' + format1) % \ | ||
97 | (d.vmbus_id, d.class_id, d.dev_desc, d.chn_vp_mapping) | ||
98 | else: | ||
99 | print ('VMBUS ID ' + format2) % \ | ||
100 | (d.vmbus_id, d.class_id, d.dev_desc, \ | ||
101 | d.device_id, d.sysfs_path, d.chn_vp_mapping) | ||