qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] scripts: add a script to list virtio devices in a system
@ 2021-05-06 19:33 Laurent Vivier
  2021-05-06 19:50 ` Philippe Mathieu-Daudé
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Laurent Vivier @ 2021-05-06 19:33 UTC (permalink / raw)
  To: qemu-devel; +Cc: Laurent Vivier

Add "lsvirtio" that lists all virtio devices in a system
the same way lspci does for the PCI cards.

For instance:

 $ ./lsvirtio
 0000:01:00.0 virtio0 Red Hat, Inc. (PCI) Virtio Network Card
	 Subsystem: virtio
	 Modalias: virtio:d00000001v00001AF4
	 Status: ACKNOWLEDGE DRIVER_OK DRIVER FEATURES_OK
	 Feature: CSUM
	 Feature: GUEST_CSUM
	 Feature: CTRL_GUEST_OFFLOADS
	 Feature: MAC
	 Feature: GUEST_TSO4
	 Feature: GUEST_TSO6
	 Feature: GUEST_ECN
	 Feature: GUEST_UFO
	 Feature: HOST_TSO4
	 Feature: HOST_TSO6
	 Feature: HOST_ECN
	 Feature: HOST_UFO
	 Feature: MRG_RXBUF
	 Feature: STATUS
	 Feature: CTRL_VQ
	 Feature: CTRL_RX
	 Feature: CTRL_VLAN
	 Feature: GUEST_ANNOUNCE
	 Feature: CTRL_MAC_ADDR
	 Feature: RING_INDIRECT_DESC
	 Feature: RING_EVENT_IDX
	 Feature: VERSION_1
	 Kernel driver in use: virtio_net
         Interfaces: enp1s0

 0000:03:00.0 virtio1 Red Hat, Inc. (PCI) Virtio Console
	 Subsystem: virtio
	 Modalias: virtio:d00000003v00001AF4
	 Status: ACKNOWLEDGE DRIVER_OK DRIVER FEATURES_OK
	 Feature: MULTIPORT
	 Feature: RING_INDIRECT_DESC
	 Feature: RING_EVENT_IDX
	 Feature: VERSION_1
	 Kernel driver in use: virtio_console
         Interfaces: vport1p1
 ...

This is useful to have the list of virtio devices when they are not
mapped by a PCI card:

 $ ./lsvirtio
 virtio-mmio.121 virtio0 Virt (MMIO) Virtio 9P transport
	 Subsystem: virtio
	 Modalias: virtio:d00000009v554D4551
	 Status: FEATURES_OK ACKNOWLEDGE DRIVER DRIVER_OK
	 Feature: MOUNT_TAG
	 Feature: RING_INDIRECT_DESC
	 Feature: RING_EVENT_IDX
	 Feature: VERSION_1
	 Kernel driver in use: 9pnet_virtio
         Interfaces: home0

 virtio-mmio.122 virtio1 Virt (MMIO) Virtio GPU Device
	 Subsystem: virtio
	 Modalias: virtio:d00000010v554D4551
	 Status: FEATURES_OK ACKNOWLEDGE DRIVER DRIVER_OK
	 Feature: EDID
	 Feature: RING_INDIRECT_DESC
	 Feature: RING_EVENT_IDX
	 Feature: VERSION_1
	 Kernel driver in use: virtio_gpu
         Interfaces: fb0
 ...

Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
 scripts/lsvirtio | 317 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 317 insertions(+)
 create mode 100755 scripts/lsvirtio

diff --git a/scripts/lsvirtio b/scripts/lsvirtio
new file mode 100755
index 000000000000..f457d5b7344d
--- /dev/null
+++ b/scripts/lsvirtio
@@ -0,0 +1,317 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2021 Red Hat, Inc.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+import os
+
+# Virtual I/O Device (VIRTIO) Version 1.1
+
+# 2.1 Device Status Field
+status_name = {
+    ( 1, 'ACKNOWLEDGE' ),
+    ( 2, 'DRIVER') ,
+    ( 4, 'DRIVER_OK' ),
+    ( 8, 'FEATURES_OK' ),
+    ( 64, 'DEVICE_NEEDS_RESET' ),
+    ( 128, 'FAILED' )
+}
+
+# 5 Device Types
+device_name = {
+    1:'Network Card',
+    2:'Block Device',
+    3:'Console',
+    4:'Entropy Source',
+    5:'Memory Ballooning (traditional)',
+    6:'ioMemory',
+    7:'rpmsg',
+    8:'SCSI host',
+    9:'9P transport',
+    10:'MAC80211 WLAN',
+    11:'rproc serial',
+    12:'CAIF',
+    13:'Memory Balloon',
+    16:'GPU Device',
+    17:'Timer/Clock Device',
+    18:'Input Device',
+    19:'Socket Device',
+    20:'Crypto Device',
+    21:'Signal Distribution Module',
+    22:'pstore Device',
+    23:'IOMMU Device',
+    24:'Memory Device',
+# From linux headers
+    26:'Filesystem',
+    27:'pmem',
+    29:'mac80211-hwsim',
+}
+
+# 5.1 Network Device
+# 5.1.3 Feature bits
+net_feature_name = {
+    0:'CSUM',
+    1:'GUEST_CSUM',
+    2:'CTRL_GUEST_OFFLOADS',
+    3:'MTU',
+    5:'MAC',
+    6:'GSO',
+    7:'GUEST_TSO4',
+    8:'GUEST_TSO6',
+    9:'GUEST_ECN',
+    10:'GUEST_UFO',
+    11:'HOST_TSO4',
+    12:'HOST_TSO6',
+    13:'HOST_ECN',
+    14:'HOST_UFO',
+    15:'MRG_RXBUF',
+    16:'STATUS',
+    17:'CTRL_VQ',
+    18:'CTRL_RX',
+    19:'CTRL_VLAN',
+    21:'GUEST_ANNOUNCE',
+    22:'MQ',
+    23:'CTRL_MAC_ADDR',
+    41:'GUEST_RSC4',
+    42:'GUEST_RSC6',
+    61:'RSC_EXT',
+    62:'STANDBY',
+}
+
+def get_feature_net(feature):
+    return net_feature_name[feature]
+
+# 5.2 Block Device
+# 5.2.3 Feature bits
+block_feature_name = {
+    0:'BARRIER',
+    1:'SIZE_MAX',
+    2:'SEG_MAX',
+    4:'GEOMETRY',
+    5:'RO',
+    6:'BLK_SIZE',
+    7:'SCSI',
+    9:'FLUSH',
+    10:'TOPOLOGY',
+    11:'CONFIG_WCE',
+    13:'DISCARD',
+    14:'WRITE_ZEROES',
+}
+
+def get_feature_block(feature):
+    return block_feature_name[feature]
+
+# 5.3 Console Device
+# 5.3.3 Feature bits
+console_feature_name = {
+    0:'SIZE',
+    1:'MULTIPORT',
+    2:'EMERG_WRITE',
+}
+
+def get_feature_console(feature):
+    return console_feature_name[feature]
+
+# 5.4 Entropy Device
+# 5.4.3 Feature bits
+# No feature bits
+
+# 5.5 Traditional Memory Balloon Device
+# 5.5.3 Feature bits
+balloon_traditional_feature_name = {
+    0:'MUST_TELL_HOST',
+    1:'STATS_VQ',
+    2:'DEFLATE_ON_OOM',
+# from linux headers
+    3:'FREE_PAGE_HINT',
+    4:'PAGE_POISON',
+    5:'REPORTING',
+}
+
+def get_feature_balloon_traditional(feature):
+    return balloon_traditional_feature_name[feature]
+
+# 5.6 SCSI Host Device
+# 5.6.3 Feature bits
+scsi_feature_name = {
+    0:'INOUT',
+    1:'HOTPLUG',
+    2:'CHANGE',
+    3:'T10_PI',
+}
+
+def get_feature_scsi_host(feature):
+    return scsi_feature_name[feature]
+
+# 5.7 GPU Device
+# 5.7.3 Feature bits
+gpu_feature_name = {
+    0:'VIRGL',
+    1:'EDID',
+}
+
+def get_feature_gpu(feature):
+    return gpu_feature_name[feature]
+
+# 5.8 Input Device
+# 5.8.3 Feature bits
+# No feature bits
+
+# 5.9 Crypto Device
+# 5.9.3 Feature bits
+crypto_feature_name = {
+    0:'REVISION_1',
+    1:'CIPHER_STATELESS_MODE',
+    2:'HASH_STATELESS_MODE',
+    3:'MAC_STATELESS_MODE',
+    4:'AEAD_STATELESS_MODE',
+}
+
+def get_feature_crypto(feature):
+    return crypto_feature_name[feature]
+
+# 5.10 Socket Device
+# 5.10.3 Feature bits
+# No feature bits
+
+# following feature bits from linux headers
+# 9P
+ninep_feature_name = {
+    0:'MOUNT_TAG',
+}
+
+def get_feature_9p(feature):
+    return ninep_feature_name[feature]
+
+# IOMMU
+iommu_feature_name = {
+    0:'INPUT_RANGE',
+    1:'DOMAIN_RANGE',
+    2:'MAP_UNMAP',
+    3:'BYPASS',
+    4:'PROBE',
+    5:'MMIO',
+}
+
+def get_feature_iommu(feature):
+    return iommu_feature_name[feature]
+
+# MEM
+
+mem_feature_name = {
+    0:'ACPI_PXM',
+}
+
+def get_feature_memory(feature):
+    return mem_feature_name[feature]
+
+get_feature = {
+    1:get_feature_net,
+    2:get_feature_block,
+    3:get_feature_console,
+    5:get_feature_balloon_traditional,
+    8:get_feature_scsi_host,
+    9:get_feature_9p,
+    16:get_feature_gpu,
+    20:get_feature_crypto,
+    23:get_feature_iommu,
+    24:get_feature_memory,
+}
+
+# 6 Reserved Feature Bits
+reserved_feature_name = {
+    24:'NOTIFY_ON_EMPTY',
+    27:'ANY_LAYOUT',
+    28:'RING_INDIRECT_DESC',
+    29:'RING_EVENT_IDX',
+    30:'BAD_FEATURE',
+    32:'VERSION_1',
+    33:'ACCESS_PLATFORM',
+    34:'RING_PACKED',
+    35:'IN_ORDER',
+    36:'ORDER_PLATFORM',
+    37:'SR_IOV',
+    38:'NOTIFICATION_DATA'
+}
+
+vendor_name = {
+    0x554D4551:'Virt (MMIO)',
+    0x1AF4:'Red Hat, Inc. (PCI)',
+}
+
+def get_status_name(status):
+    result = ''
+    for name in status_name:
+        if name[0] & status:
+            result = result + name[1] + ' '
+    return result
+
+def list_interfaces(path):
+    interfaces = ''
+    for interface in sorted(os.listdir(path)):
+        interfaces = interfaces + interface + ' '
+    return interfaces
+
+def get_net_interfaces(path):
+    return list_interfaces(path + '/net')
+
+def get_block_interfaces(path):
+    return list_interfaces(path + '/block')
+
+def get_console_interfaces(path):
+    return list_interfaces(path + '/block')
+
+def get_9p_interfaces(path):
+    return open(path + '/mount_tag').read().rstrip()
+
+def get_gpu_interfaces(path):
+    return list_interfaces(path + '/graphics')
+
+def get_input_interaces(path):
+    return list_interfaces(path + '/input')
+
+get_interfaces = {
+    1:get_net_interfaces,
+    2:get_block_interfaces,
+    3:get_console_interfaces,
+    9:get_9p_interfaces,
+    16:get_gpu_interfaces,
+    18:get_input_interaces,
+}
+
+busses = '/sys/bus/virtio'
+devices = busses + '/devices'
+
+for device in sorted(os.listdir(devices)):
+    bus = os.path.basename(os.path.dirname(os.readlink(devices + '/' + device)))
+    path = devices + '/' + device
+    subsystem = os.path.basename(os.readlink(path + '/subsystem'))
+    device_id = int(open(path + '/device').read(), base = 0)
+    vendor = int(open(path + '/vendor').read(), base = 0)
+    driver = os.path.basename(os.readlink(path + '/driver'))
+    modalias = open(path + '/modalias').read().rstrip()
+    features = open(path + '/features').read().rstrip()
+    status = open(path + '/status').read().rstrip()
+
+    print(bus + ' ' + device + ' ' + vendor_name[vendor] + ' Virtio ' + device_name[device_id])
+    print('\tSubsystem: ' + subsystem)
+    print('\tModalias: ' + modalias)
+    print('\tStatus: ' + get_status_name(int(status, base=0)))
+    bit=0
+    for feature in features:
+        if feature == '1':
+            try:
+                if bit >= 24:
+                    print('\tFeature: ' + reserved_feature_name[bit])
+                else:
+                    print('\tFeature: ' + get_feature[device_id](bit))
+            except:
+                print('\tFeature: ' + str(bit))
+        bit += 1
+    print('\tKernel driver in use: ' + driver)
+    try:
+        print('\tInterfaces: ' + get_interfaces[device_id](path))
+    except:
+        print('\tNo interface')
+    print('')
-- 
2.31.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] scripts: add a script to list virtio devices in a system
  2021-05-06 19:33 [PATCH] scripts: add a script to list virtio devices in a system Laurent Vivier
@ 2021-05-06 19:50 ` Philippe Mathieu-Daudé
  2021-05-07  6:17   ` Laurent Vivier
  2021-05-11  8:32 ` Michael S. Tsirkin
  2021-05-11  9:17 ` Peter Maydell
  2 siblings, 1 reply; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-05-06 19:50 UTC (permalink / raw)
  To: Laurent Vivier, qemu-devel

On 5/6/21 9:33 PM, Laurent Vivier wrote:
> Add "lsvirtio" that lists all virtio devices in a system
> the same way lspci does for the PCI cards.
> 
> For instance:
> 
>  $ ./lsvirtio
>  0000:01:00.0 virtio0 Red Hat, Inc. (PCI) Virtio Network Card
> 	 Subsystem: virtio
> 	 Modalias: virtio:d00000001v00001AF4

"ModAlias" maybe?

> 	 Status: ACKNOWLEDGE DRIVER_OK DRIVER FEATURES_OK
> 	 Feature: CSUM
> 	 Feature: GUEST_CSUM
> 	 Feature: CTRL_GUEST_OFFLOADS
> 	 Feature: MAC
> 	 Feature: GUEST_TSO4
> 	 Feature: GUEST_TSO6
> 	 Feature: GUEST_ECN
> 	 Feature: GUEST_UFO
> 	 Feature: HOST_TSO4
> 	 Feature: HOST_TSO6
> 	 Feature: HOST_ECN
> 	 Feature: HOST_UFO
> 	 Feature: MRG_RXBUF
> 	 Feature: STATUS
> 	 Feature: CTRL_VQ
> 	 Feature: CTRL_RX
> 	 Feature: CTRL_VLAN
> 	 Feature: GUEST_ANNOUNCE
> 	 Feature: CTRL_MAC_ADDR
> 	 Feature: RING_INDIRECT_DESC
> 	 Feature: RING_EVENT_IDX
> 	 Feature: VERSION_1
> 	 Kernel driver in use: virtio_net
>          Interfaces: enp1s0
> 
>  0000:03:00.0 virtio1 Red Hat, Inc. (PCI) Virtio Console
> 	 Subsystem: virtio
> 	 Modalias: virtio:d00000003v00001AF4
> 	 Status: ACKNOWLEDGE DRIVER_OK DRIVER FEATURES_OK
> 	 Feature: MULTIPORT
> 	 Feature: RING_INDIRECT_DESC
> 	 Feature: RING_EVENT_IDX
> 	 Feature: VERSION_1
> 	 Kernel driver in use: virtio_console
>          Interfaces: vport1p1
>  ...
> 
> This is useful to have the list of virtio devices when they are not
> mapped by a PCI card:
> 
>  $ ./lsvirtio
>  virtio-mmio.121 virtio0 Virt (MMIO) Virtio 9P transport
> 	 Subsystem: virtio
> 	 Modalias: virtio:d00000009v554D4551
> 	 Status: FEATURES_OK ACKNOWLEDGE DRIVER DRIVER_OK
> 	 Feature: MOUNT_TAG
> 	 Feature: RING_INDIRECT_DESC
> 	 Feature: RING_EVENT_IDX
> 	 Feature: VERSION_1
> 	 Kernel driver in use: 9pnet_virtio
>          Interfaces: home0
> 
>  virtio-mmio.122 virtio1 Virt (MMIO) Virtio GPU Device
> 	 Subsystem: virtio
> 	 Modalias: virtio:d00000010v554D4551
> 	 Status: FEATURES_OK ACKNOWLEDGE DRIVER DRIVER_OK
> 	 Feature: EDID
> 	 Feature: RING_INDIRECT_DESC
> 	 Feature: RING_EVENT_IDX
> 	 Feature: VERSION_1
> 	 Kernel driver in use: virtio_gpu
>          Interfaces: fb0
>  ...
> 
> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> ---
>  scripts/lsvirtio | 317 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 317 insertions(+)
>  create mode 100755 scripts/lsvirtio

Can you add an entry for the file in MAINTAINERS?

Otherwise:
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] scripts: add a script to list virtio devices in a system
  2021-05-06 19:50 ` Philippe Mathieu-Daudé
@ 2021-05-07  6:17   ` Laurent Vivier
  2021-05-11  8:33     ` Michael S. Tsirkin
  0 siblings, 1 reply; 7+ messages in thread
From: Laurent Vivier @ 2021-05-07  6:17 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Michael S. Tsirkin, Eduardo Habkost, Cleber Rosa

On 06/05/2021 21:50, Philippe Mathieu-Daudé wrote:
> On 5/6/21 9:33 PM, Laurent Vivier wrote:
>> Add "lsvirtio" that lists all virtio devices in a system
>> the same way lspci does for the PCI cards.
>>
>> For instance:
>>
>>  $ ./lsvirtio
>>  0000:01:00.0 virtio0 Red Hat, Inc. (PCI) Virtio Network Card
>> 	 Subsystem: virtio
>> 	 Modalias: virtio:d00000001v00001AF4
> 
> "ModAlias" maybe?
> 
>> 	 Status: ACKNOWLEDGE DRIVER_OK DRIVER FEATURES_OK
>> 	 Feature: CSUM
>> 	 Feature: GUEST_CSUM
>> 	 Feature: CTRL_GUEST_OFFLOADS
>> 	 Feature: MAC
>> 	 Feature: GUEST_TSO4
>> 	 Feature: GUEST_TSO6
>> 	 Feature: GUEST_ECN
>> 	 Feature: GUEST_UFO
>> 	 Feature: HOST_TSO4
>> 	 Feature: HOST_TSO6
>> 	 Feature: HOST_ECN
>> 	 Feature: HOST_UFO
>> 	 Feature: MRG_RXBUF
>> 	 Feature: STATUS
>> 	 Feature: CTRL_VQ
>> 	 Feature: CTRL_RX
>> 	 Feature: CTRL_VLAN
>> 	 Feature: GUEST_ANNOUNCE
>> 	 Feature: CTRL_MAC_ADDR
>> 	 Feature: RING_INDIRECT_DESC
>> 	 Feature: RING_EVENT_IDX
>> 	 Feature: VERSION_1
>> 	 Kernel driver in use: virtio_net
>>          Interfaces: enp1s0
>>
>>  0000:03:00.0 virtio1 Red Hat, Inc. (PCI) Virtio Console
>> 	 Subsystem: virtio
>> 	 Modalias: virtio:d00000003v00001AF4
>> 	 Status: ACKNOWLEDGE DRIVER_OK DRIVER FEATURES_OK
>> 	 Feature: MULTIPORT
>> 	 Feature: RING_INDIRECT_DESC
>> 	 Feature: RING_EVENT_IDX
>> 	 Feature: VERSION_1
>> 	 Kernel driver in use: virtio_console
>>          Interfaces: vport1p1
>>  ...
>>
>> This is useful to have the list of virtio devices when they are not
>> mapped by a PCI card:
>>
>>  $ ./lsvirtio
>>  virtio-mmio.121 virtio0 Virt (MMIO) Virtio 9P transport
>> 	 Subsystem: virtio
>> 	 Modalias: virtio:d00000009v554D4551
>> 	 Status: FEATURES_OK ACKNOWLEDGE DRIVER DRIVER_OK
>> 	 Feature: MOUNT_TAG
>> 	 Feature: RING_INDIRECT_DESC
>> 	 Feature: RING_EVENT_IDX
>> 	 Feature: VERSION_1
>> 	 Kernel driver in use: 9pnet_virtio
>>          Interfaces: home0
>>
>>  virtio-mmio.122 virtio1 Virt (MMIO) Virtio GPU Device
>> 	 Subsystem: virtio
>> 	 Modalias: virtio:d00000010v554D4551
>> 	 Status: FEATURES_OK ACKNOWLEDGE DRIVER DRIVER_OK
>> 	 Feature: EDID
>> 	 Feature: RING_INDIRECT_DESC
>> 	 Feature: RING_EVENT_IDX
>> 	 Feature: VERSION_1
>> 	 Kernel driver in use: virtio_gpu
>>          Interfaces: fb0
>>  ...
>>
>> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
>> ---
>>  scripts/lsvirtio | 317 +++++++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 317 insertions(+)
>>  create mode 100755 scripts/lsvirtio
> 
> Can you add an entry for the file in MAINTAINERS?

Yes, but where?

It would go under virtio section, but I'm not sure Michael wants to maintain it.

Perhaps "Python scripts" section?

> Otherwise:
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> 

Thanks,
Laurent



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] scripts: add a script to list virtio devices in a system
  2021-05-06 19:33 [PATCH] scripts: add a script to list virtio devices in a system Laurent Vivier
  2021-05-06 19:50 ` Philippe Mathieu-Daudé
@ 2021-05-11  8:32 ` Michael S. Tsirkin
  2021-05-11  9:17 ` Peter Maydell
  2 siblings, 0 replies; 7+ messages in thread
From: Michael S. Tsirkin @ 2021-05-11  8:32 UTC (permalink / raw)
  To: Laurent Vivier; +Cc: qemu-devel

On Thu, May 06, 2021 at 09:33:41PM +0200, Laurent Vivier wrote:
> Add "lsvirtio" that lists all virtio devices in a system
> the same way lspci does for the PCI cards.
> 
> For instance:
> 
>  $ ./lsvirtio
>  0000:01:00.0 virtio0 Red Hat, Inc. (PCI) Virtio Network Card
> 	 Subsystem: virtio
> 	 Modalias: virtio:d00000001v00001AF4
> 	 Status: ACKNOWLEDGE DRIVER_OK DRIVER FEATURES_OK
> 	 Feature: CSUM
> 	 Feature: GUEST_CSUM
> 	 Feature: CTRL_GUEST_OFFLOADS
> 	 Feature: MAC
> 	 Feature: GUEST_TSO4
> 	 Feature: GUEST_TSO6
> 	 Feature: GUEST_ECN
> 	 Feature: GUEST_UFO
> 	 Feature: HOST_TSO4
> 	 Feature: HOST_TSO6
> 	 Feature: HOST_ECN
> 	 Feature: HOST_UFO
> 	 Feature: MRG_RXBUF
> 	 Feature: STATUS
> 	 Feature: CTRL_VQ
> 	 Feature: CTRL_RX
> 	 Feature: CTRL_VLAN
> 	 Feature: GUEST_ANNOUNCE
> 	 Feature: CTRL_MAC_ADDR
> 	 Feature: RING_INDIRECT_DESC
> 	 Feature: RING_EVENT_IDX
> 	 Feature: VERSION_1
> 	 Kernel driver in use: virtio_net
>          Interfaces: enp1s0
> 
>  0000:03:00.0 virtio1 Red Hat, Inc. (PCI) Virtio Console
> 	 Subsystem: virtio
> 	 Modalias: virtio:d00000003v00001AF4
> 	 Status: ACKNOWLEDGE DRIVER_OK DRIVER FEATURES_OK
> 	 Feature: MULTIPORT
> 	 Feature: RING_INDIRECT_DESC
> 	 Feature: RING_EVENT_IDX
> 	 Feature: VERSION_1
> 	 Kernel driver in use: virtio_console
>          Interfaces: vport1p1
>  ...
> 
> This is useful to have the list of virtio devices when they are not
> mapped by a PCI card:
> 
>  $ ./lsvirtio
>  virtio-mmio.121 virtio0 Virt (MMIO) Virtio 9P transport
> 	 Subsystem: virtio
> 	 Modalias: virtio:d00000009v554D4551
> 	 Status: FEATURES_OK ACKNOWLEDGE DRIVER DRIVER_OK
> 	 Feature: MOUNT_TAG
> 	 Feature: RING_INDIRECT_DESC
> 	 Feature: RING_EVENT_IDX
> 	 Feature: VERSION_1
> 	 Kernel driver in use: 9pnet_virtio
>          Interfaces: home0
> 
>  virtio-mmio.122 virtio1 Virt (MMIO) Virtio GPU Device
> 	 Subsystem: virtio
> 	 Modalias: virtio:d00000010v554D4551
> 	 Status: FEATURES_OK ACKNOWLEDGE DRIVER DRIVER_OK
> 	 Feature: EDID
> 	 Feature: RING_INDIRECT_DESC
> 	 Feature: RING_EVENT_IDX
> 	 Feature: VERSION_1
> 	 Kernel driver in use: virtio_gpu
>          Interfaces: fb0
>  ...
> 
> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> ---
>  scripts/lsvirtio | 317 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 317 insertions(+)
>  create mode 100755 scripts/lsvirtio
> 
> diff --git a/scripts/lsvirtio b/scripts/lsvirtio
> new file mode 100755
> index 000000000000..f457d5b7344d
> --- /dev/null
> +++ b/scripts/lsvirtio
> @@ -0,0 +1,317 @@
> +#!/usr/bin/env python3
> +#
> +# Copyright (C) 2021 Red Hat, Inc.
> +#
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +import os
> +
> +# Virtual I/O Device (VIRTIO) Version 1.1
> +
> +# 2.1 Device Status Field
> +status_name = {
> +    ( 1, 'ACKNOWLEDGE' ),
> +    ( 2, 'DRIVER') ,
> +    ( 4, 'DRIVER_OK' ),
> +    ( 8, 'FEATURES_OK' ),
> +    ( 64, 'DEVICE_NEEDS_RESET' ),
> +    ( 128, 'FAILED' )
> +}
> +
> +# 5 Device Types
> +device_name = {
> +    1:'Network Card',
> +    2:'Block Device',
> +    3:'Console',
> +    4:'Entropy Source',
> +    5:'Memory Ballooning (traditional)',
> +    6:'ioMemory',
> +    7:'rpmsg',
> +    8:'SCSI host',
> +    9:'9P transport',
> +    10:'MAC80211 WLAN',
> +    11:'rproc serial',
> +    12:'CAIF',
> +    13:'Memory Balloon',
> +    16:'GPU Device',
> +    17:'Timer/Clock Device',
> +    18:'Input Device',
> +    19:'Socket Device',
> +    20:'Crypto Device',
> +    21:'Signal Distribution Module',
> +    22:'pstore Device',
> +    23:'IOMMU Device',
> +    24:'Memory Device',
> +# From linux headers
> +    26:'Filesystem',
> +    27:'pmem',
> +    29:'mac80211-hwsim',
> +}
> +
> +# 5.1 Network Device
> +# 5.1.3 Feature bits
> +net_feature_name = {
> +    0:'CSUM',
> +    1:'GUEST_CSUM',
> +    2:'CTRL_GUEST_OFFLOADS',
> +    3:'MTU',
> +    5:'MAC',
> +    6:'GSO',
> +    7:'GUEST_TSO4',
> +    8:'GUEST_TSO6',
> +    9:'GUEST_ECN',
> +    10:'GUEST_UFO',
> +    11:'HOST_TSO4',
> +    12:'HOST_TSO6',
> +    13:'HOST_ECN',
> +    14:'HOST_UFO',
> +    15:'MRG_RXBUF',
> +    16:'STATUS',
> +    17:'CTRL_VQ',
> +    18:'CTRL_RX',
> +    19:'CTRL_VLAN',
> +    21:'GUEST_ANNOUNCE',
> +    22:'MQ',
> +    23:'CTRL_MAC_ADDR',
> +    41:'GUEST_RSC4',
> +    42:'GUEST_RSC6',
> +    61:'RSC_EXT',
> +    62:'STANDBY',
> +}
> +
> +def get_feature_net(feature):
> +    return net_feature_name[feature]
> +
> +# 5.2 Block Device
> +# 5.2.3 Feature bits
> +block_feature_name = {
> +    0:'BARRIER',
> +    1:'SIZE_MAX',
> +    2:'SEG_MAX',
> +    4:'GEOMETRY',
> +    5:'RO',
> +    6:'BLK_SIZE',
> +    7:'SCSI',
> +    9:'FLUSH',
> +    10:'TOPOLOGY',
> +    11:'CONFIG_WCE',
> +    13:'DISCARD',
> +    14:'WRITE_ZEROES',
> +}
> +
> +def get_feature_block(feature):
> +    return block_feature_name[feature]
> +
> +# 5.3 Console Device
> +# 5.3.3 Feature bits
> +console_feature_name = {
> +    0:'SIZE',
> +    1:'MULTIPORT',
> +    2:'EMERG_WRITE',
> +}
> +
> +def get_feature_console(feature):
> +    return console_feature_name[feature]
> +
> +# 5.4 Entropy Device
> +# 5.4.3 Feature bits
> +# No feature bits
> +
> +# 5.5 Traditional Memory Balloon Device
> +# 5.5.3 Feature bits
> +balloon_traditional_feature_name = {
> +    0:'MUST_TELL_HOST',
> +    1:'STATS_VQ',
> +    2:'DEFLATE_ON_OOM',
> +# from linux headers
> +    3:'FREE_PAGE_HINT',
> +    4:'PAGE_POISON',
> +    5:'REPORTING',
> +}
> +
> +def get_feature_balloon_traditional(feature):
> +    return balloon_traditional_feature_name[feature]
> +
> +# 5.6 SCSI Host Device
> +# 5.6.3 Feature bits
> +scsi_feature_name = {
> +    0:'INOUT',
> +    1:'HOTPLUG',
> +    2:'CHANGE',
> +    3:'T10_PI',
> +}
> +
> +def get_feature_scsi_host(feature):
> +    return scsi_feature_name[feature]
> +
> +# 5.7 GPU Device
> +# 5.7.3 Feature bits
> +gpu_feature_name = {
> +    0:'VIRGL',
> +    1:'EDID',
> +}
> +
> +def get_feature_gpu(feature):
> +    return gpu_feature_name[feature]
> +
> +# 5.8 Input Device
> +# 5.8.3 Feature bits
> +# No feature bits
> +
> +# 5.9 Crypto Device
> +# 5.9.3 Feature bits
> +crypto_feature_name = {
> +    0:'REVISION_1',
> +    1:'CIPHER_STATELESS_MODE',
> +    2:'HASH_STATELESS_MODE',
> +    3:'MAC_STATELESS_MODE',
> +    4:'AEAD_STATELESS_MODE',
> +}
> +
> +def get_feature_crypto(feature):
> +    return crypto_feature_name[feature]
> +
> +# 5.10 Socket Device
> +# 5.10.3 Feature bits
> +# No feature bits
> +
> +# following feature bits from linux headers
> +# 9P
> +ninep_feature_name = {
> +    0:'MOUNT_TAG',
> +}
> +
> +def get_feature_9p(feature):
> +    return ninep_feature_name[feature]
> +
> +# IOMMU
> +iommu_feature_name = {
> +    0:'INPUT_RANGE',
> +    1:'DOMAIN_RANGE',
> +    2:'MAP_UNMAP',
> +    3:'BYPASS',
> +    4:'PROBE',
> +    5:'MMIO',
> +}
> +
> +def get_feature_iommu(feature):
> +    return iommu_feature_name[feature]
> +
> +# MEM
> +
> +mem_feature_name = {
> +    0:'ACPI_PXM',
> +}
> +
> +def get_feature_memory(feature):
> +    return mem_feature_name[feature]
> +
> +get_feature = {
> +    1:get_feature_net,
> +    2:get_feature_block,
> +    3:get_feature_console,
> +    5:get_feature_balloon_traditional,
> +    8:get_feature_scsi_host,
> +    9:get_feature_9p,
> +    16:get_feature_gpu,
> +    20:get_feature_crypto,
> +    23:get_feature_iommu,
> +    24:get_feature_memory,
> +}
> +
> +# 6 Reserved Feature Bits
> +reserved_feature_name = {
> +    24:'NOTIFY_ON_EMPTY',
> +    27:'ANY_LAYOUT',
> +    28:'RING_INDIRECT_DESC',
> +    29:'RING_EVENT_IDX',
> +    30:'BAD_FEATURE',
> +    32:'VERSION_1',
> +    33:'ACCESS_PLATFORM',
> +    34:'RING_PACKED',
> +    35:'IN_ORDER',
> +    36:'ORDER_PLATFORM',
> +    37:'SR_IOV',
> +    38:'NOTIFICATION_DATA'
> +}


I worry about maintaining all these feature bits though.

Can we somehow script this in scripts/update-linux-headers.sh ?


> +
> +vendor_name = {
> +    0x554D4551:'Virt (MMIO)',
> +    0x1AF4:'Red Hat, Inc. (PCI)',
> +}
> +
> +def get_status_name(status):
> +    result = ''
> +    for name in status_name:
> +        if name[0] & status:
> +            result = result + name[1] + ' '
> +    return result
> +
> +def list_interfaces(path):
> +    interfaces = ''
> +    for interface in sorted(os.listdir(path)):
> +        interfaces = interfaces + interface + ' '
> +    return interfaces
> +
> +def get_net_interfaces(path):
> +    return list_interfaces(path + '/net')
> +
> +def get_block_interfaces(path):
> +    return list_interfaces(path + '/block')
> +
> +def get_console_interfaces(path):
> +    return list_interfaces(path + '/block')
> +
> +def get_9p_interfaces(path):
> +    return open(path + '/mount_tag').read().rstrip()
> +
> +def get_gpu_interfaces(path):
> +    return list_interfaces(path + '/graphics')
> +
> +def get_input_interaces(path):
> +    return list_interfaces(path + '/input')
> +
> +get_interfaces = {
> +    1:get_net_interfaces,
> +    2:get_block_interfaces,
> +    3:get_console_interfaces,
> +    9:get_9p_interfaces,
> +    16:get_gpu_interfaces,
> +    18:get_input_interaces,
> +}
> +
> +busses = '/sys/bus/virtio'
> +devices = busses + '/devices'
> +
> +for device in sorted(os.listdir(devices)):
> +    bus = os.path.basename(os.path.dirname(os.readlink(devices + '/' + device)))
> +    path = devices + '/' + device
> +    subsystem = os.path.basename(os.readlink(path + '/subsystem'))
> +    device_id = int(open(path + '/device').read(), base = 0)
> +    vendor = int(open(path + '/vendor').read(), base = 0)
> +    driver = os.path.basename(os.readlink(path + '/driver'))
> +    modalias = open(path + '/modalias').read().rstrip()
> +    features = open(path + '/features').read().rstrip()
> +    status = open(path + '/status').read().rstrip()
> +
> +    print(bus + ' ' + device + ' ' + vendor_name[vendor] + ' Virtio ' + device_name[device_id])
> +    print('\tSubsystem: ' + subsystem)
> +    print('\tModalias: ' + modalias)
> +    print('\tStatus: ' + get_status_name(int(status, base=0)))
> +    bit=0
> +    for feature in features:
> +        if feature == '1':
> +            try:
> +                if bit >= 24:
> +                    print('\tFeature: ' + reserved_feature_name[bit])
> +                else:
> +                    print('\tFeature: ' + get_feature[device_id](bit))
> +            except:
> +                print('\tFeature: ' + str(bit))
> +        bit += 1
> +    print('\tKernel driver in use: ' + driver)
> +    try:
> +        print('\tInterfaces: ' + get_interfaces[device_id](path))
> +    except:
> +        print('\tNo interface')
> +    print('')
> -- 
> 2.31.1
> 
> 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] scripts: add a script to list virtio devices in a system
  2021-05-07  6:17   ` Laurent Vivier
@ 2021-05-11  8:33     ` Michael S. Tsirkin
  0 siblings, 0 replies; 7+ messages in thread
From: Michael S. Tsirkin @ 2021-05-11  8:33 UTC (permalink / raw)
  To: Laurent Vivier
  Cc: Philippe Mathieu-Daudé, qemu-devel, Eduardo Habkost, Cleber Rosa

On Fri, May 07, 2021 at 08:17:33AM +0200, Laurent Vivier wrote:
> On 06/05/2021 21:50, Philippe Mathieu-Daudé wrote:
> > On 5/6/21 9:33 PM, Laurent Vivier wrote:
> >> Add "lsvirtio" that lists all virtio devices in a system
> >> the same way lspci does for the PCI cards.
> >>
> >> For instance:
> >>
> >>  $ ./lsvirtio
> >>  0000:01:00.0 virtio0 Red Hat, Inc. (PCI) Virtio Network Card
> >> 	 Subsystem: virtio
> >> 	 Modalias: virtio:d00000001v00001AF4
> > 
> > "ModAlias" maybe?
> > 
> >> 	 Status: ACKNOWLEDGE DRIVER_OK DRIVER FEATURES_OK
> >> 	 Feature: CSUM
> >> 	 Feature: GUEST_CSUM
> >> 	 Feature: CTRL_GUEST_OFFLOADS
> >> 	 Feature: MAC
> >> 	 Feature: GUEST_TSO4
> >> 	 Feature: GUEST_TSO6
> >> 	 Feature: GUEST_ECN
> >> 	 Feature: GUEST_UFO
> >> 	 Feature: HOST_TSO4
> >> 	 Feature: HOST_TSO6
> >> 	 Feature: HOST_ECN
> >> 	 Feature: HOST_UFO
> >> 	 Feature: MRG_RXBUF
> >> 	 Feature: STATUS
> >> 	 Feature: CTRL_VQ
> >> 	 Feature: CTRL_RX
> >> 	 Feature: CTRL_VLAN
> >> 	 Feature: GUEST_ANNOUNCE
> >> 	 Feature: CTRL_MAC_ADDR
> >> 	 Feature: RING_INDIRECT_DESC
> >> 	 Feature: RING_EVENT_IDX
> >> 	 Feature: VERSION_1
> >> 	 Kernel driver in use: virtio_net
> >>          Interfaces: enp1s0
> >>
> >>  0000:03:00.0 virtio1 Red Hat, Inc. (PCI) Virtio Console
> >> 	 Subsystem: virtio
> >> 	 Modalias: virtio:d00000003v00001AF4
> >> 	 Status: ACKNOWLEDGE DRIVER_OK DRIVER FEATURES_OK
> >> 	 Feature: MULTIPORT
> >> 	 Feature: RING_INDIRECT_DESC
> >> 	 Feature: RING_EVENT_IDX
> >> 	 Feature: VERSION_1
> >> 	 Kernel driver in use: virtio_console
> >>          Interfaces: vport1p1
> >>  ...
> >>
> >> This is useful to have the list of virtio devices when they are not
> >> mapped by a PCI card:
> >>
> >>  $ ./lsvirtio
> >>  virtio-mmio.121 virtio0 Virt (MMIO) Virtio 9P transport
> >> 	 Subsystem: virtio
> >> 	 Modalias: virtio:d00000009v554D4551
> >> 	 Status: FEATURES_OK ACKNOWLEDGE DRIVER DRIVER_OK
> >> 	 Feature: MOUNT_TAG
> >> 	 Feature: RING_INDIRECT_DESC
> >> 	 Feature: RING_EVENT_IDX
> >> 	 Feature: VERSION_1
> >> 	 Kernel driver in use: 9pnet_virtio
> >>          Interfaces: home0
> >>
> >>  virtio-mmio.122 virtio1 Virt (MMIO) Virtio GPU Device
> >> 	 Subsystem: virtio
> >> 	 Modalias: virtio:d00000010v554D4551
> >> 	 Status: FEATURES_OK ACKNOWLEDGE DRIVER DRIVER_OK
> >> 	 Feature: EDID
> >> 	 Feature: RING_INDIRECT_DESC
> >> 	 Feature: RING_EVENT_IDX
> >> 	 Feature: VERSION_1
> >> 	 Kernel driver in use: virtio_gpu
> >>          Interfaces: fb0
> >>  ...
> >>
> >> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> >> ---
> >>  scripts/lsvirtio | 317 +++++++++++++++++++++++++++++++++++++++++++++++
> >>  1 file changed, 317 insertions(+)
> >>  create mode 100755 scripts/lsvirtio
> > 
> > Can you add an entry for the file in MAINTAINERS?
> 
> Yes, but where?
> 
> It would go under virtio section, but I'm not sure Michael wants to maintain it.

I don't have a problem with getting patches for it.

> Perhaps "Python scripts" section?
> 
> > Otherwise:
> > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> > 
> 
> Thanks,
> Laurent



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] scripts: add a script to list virtio devices in a system
  2021-05-06 19:33 [PATCH] scripts: add a script to list virtio devices in a system Laurent Vivier
  2021-05-06 19:50 ` Philippe Mathieu-Daudé
  2021-05-11  8:32 ` Michael S. Tsirkin
@ 2021-05-11  9:17 ` Peter Maydell
  2021-05-12  7:44   ` Laurent Vivier
  2 siblings, 1 reply; 7+ messages in thread
From: Peter Maydell @ 2021-05-11  9:17 UTC (permalink / raw)
  To: Laurent Vivier; +Cc: QEMU Developers

On Thu, 6 May 2021 at 20:36, Laurent Vivier <lvivier@redhat.com> wrote:
>
> Add "lsvirtio" that lists all virtio devices in a system
> the same way lspci does for the PCI cards.

This is cool, but it's not really QEMU specific -- it should
work on any Linux guest running on some hypervisor or hardware
that exposes virtio devices, right? So I'm not sure it really
belongs in QEMU's source tree...

If you're a distro packager you'd probably want to have this be in its
own package or at least not in the same package as the QEMU binaries,
for instance, because this lives in the guest, not the host.

thanks
-- PMM


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] scripts: add a script to list virtio devices in a system
  2021-05-11  9:17 ` Peter Maydell
@ 2021-05-12  7:44   ` Laurent Vivier
  0 siblings, 0 replies; 7+ messages in thread
From: Laurent Vivier @ 2021-05-12  7:44 UTC (permalink / raw)
  To: Peter Maydell; +Cc: QEMU Developers

On 11/05/2021 11:17, Peter Maydell wrote:
> On Thu, 6 May 2021 at 20:36, Laurent Vivier <lvivier@redhat.com> wrote:
>>
>> Add "lsvirtio" that lists all virtio devices in a system
>> the same way lspci does for the PCI cards.
> 
> This is cool, but it's not really QEMU specific -- it should
> work on any Linux guest running on some hypervisor or hardware
> that exposes virtio devices, right? So I'm not sure it really
> belongs in QEMU's source tree...
> 
> If you're a distro packager you'd probably want to have this be in its
> own package or at least not in the same package as the QEMU binaries,
> for instance, because this lives in the guest, not the host.
> 

Yes, I agree with that, but if it is in its own package I think it will never reach user
because no one will find it. I can try to push this into util-linux where we can find
tools like lscpu, lsblk ... but the competencies to review the code are in qemu-devel ML
not in util-linux ML.

Thanks,
Laurent



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-05-12  7:46 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-06 19:33 [PATCH] scripts: add a script to list virtio devices in a system Laurent Vivier
2021-05-06 19:50 ` Philippe Mathieu-Daudé
2021-05-07  6:17   ` Laurent Vivier
2021-05-11  8:33     ` Michael S. Tsirkin
2021-05-11  8:32 ` Michael S. Tsirkin
2021-05-11  9:17 ` Peter Maydell
2021-05-12  7:44   ` Laurent Vivier

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).