From patchwork Thu May 7 13:47:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 1285292 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=2001:470:142::17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=c2zsuSC7; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:470:142::17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49HvzM6sv5z9sSc for ; Thu, 7 May 2020 23:52:31 +1000 (AEST) Received: from localhost ([::1]:43986 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jWgwv-0008OQ-2P for incoming@patchwork.ozlabs.org; Thu, 07 May 2020 09:52:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34398) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jWgt7-0003Qb-Fa for qemu-devel@nongnu.org; Thu, 07 May 2020 09:48:33 -0400 Received: from us-smtp-2.mimecast.com ([207.211.31.81]:27589 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jWgt5-0002pg-7x for qemu-devel@nongnu.org; Thu, 07 May 2020 09:48:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1588859309; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=bm434Sx8fMyA8/6E2+2m2ygOFIlCsDp5bXTvEQyeQa0=; b=c2zsuSC73Uz3b6jglEUa28KVF4vQkHwVYYROTgB2PA3e1C4HMD52pu4FWoZX/5szbf7Z1n FS2vnlSpw5r9JcmQS0dCJAxyq5mzODTLo3KpsvPZMwdQOe3Vqb79h+vZhjHlP0IixHCP9P RNnqur4XLpibgtxfXzCg5rd8xx4sED8= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-205-j3XifsDtNZGn9WqltWnhCA-1; Thu, 07 May 2020 09:48:26 -0400 X-MC-Unique: j3XifsDtNZGn9WqltWnhCA-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 49DBFEC1B3; Thu, 7 May 2020 13:48:25 +0000 (UTC) Received: from thinkpad.redhat.com (ovpn-114-199.ams2.redhat.com [10.36.114.199]) by smtp.corp.redhat.com (Postfix) with ESMTP id E0CD510013BD; Thu, 7 May 2020 13:48:01 +0000 (UTC) From: Laurent Vivier To: lvivier@redhat.com, qemu-devel@nongnu.org Subject: [RFC v4 0/6] hmp,qmp: Add some commands to introspect virtio devices Date: Thu, 7 May 2020 15:47:54 +0200 Message-Id: <20200507134800.10837-1-lvivier@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=207.211.31.81; envelope-from=lvivier@redhat.com; helo=us-smtp-delivery-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/05/07 00:55:34 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , Thomas Huth , Michael Roth , qemu-block@nongnu.org, Amit Shah , Jason Wang , "Michael S. Tsirkin" , David Hildenbrand , Markus Armbruster , "Dr. David Alan Gilbert" , Eric Auger , Gerd Hoffmann , Stefan Hajnoczi , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This series introduces new QMP/HMP commands to dump the status of a a virtio device at different levels. 1. Main command HMP Only: x-debug-virtio [subcommand] Example: List all sub-commands: (qemu) x-debug-virtio x-debug-virtio query -- List all available virtio devices x-debug-virtio status path -- Display status of a given virtio device x-debug-virtio queue-status path queue -- Display status of a given virtio queue x-debug-virtio queue-element path queue [index] -- Display element of a given virtio queue 2. List available virtio devices in the machine HMP Form: x-debug-virtio query Example: (qemu) x-debug-virtio query /machine/peripheral-anon/device[3]/virtio-backend [virtio-net] /machine/peripheral-anon/device[1]/virtio-backend [virtio-serial] /machine/peripheral-anon/device[0]/virtio-backend [virtio-blk] QMP Form: { 'command': 'x-debug-query-virtio', 'returns': ['VirtioInfo'] } Example: -> { "execute": "x-debug-query-virtio" } <- { "return": [ { "path": "/machine/peripheral-anon/device[3]/virtio-backend", "type": "virtio-net" }, { "path": "/machine/peripheral-anon/device[1]/virtio-backend", "type": "virtio-serial" }, { "path": "/machine/peripheral-anon/device[0]/virtio-backend", "type": "virtio-blk" } ] } 3. Display status of a given virtio device HMP Form: x-debug-virtio status Example: (qemu) x-debug-virtio status /machine/peripheral-anon/device[3]/virtio-backend /machine/peripheral-anon/device[3]/virtio-backend: Device Id: 1 Guest features: event-idx, indirect-desc, version-1 ctrl-mac-addr, guest-announce, ctrl-vlan, ctrl-rx, ctrl-vq, status, mrg-rxbuf, host-ufo, host-ecn, host-tso6, host-tso4, guest-ufo, guest-ecn, guest-tso6, guest-tso4, mac, ctrl-guest-offloads, guest-csum, csum Host features: event-idx, indirect-desc, bad-feature, version-1, any-layout, notify-on-empty gso, ctrl-mac-addr, guest-announce, ctrl-rx-extra, ctrl-vlan, ctrl-rx, ctrl-vq, status, mrg-rxbuf, host-ufo, host-ecn, host-tso6, host-tso4, guest-ufo, guest-ecn, guest-tso6, guest-tso4, mac, ctrl-guest-offloads, guest-csum, csum Backend features: Endianness: little VirtQueues: 3 QMP Form: { 'command': 'x-debug-virtio-status', 'data': { 'path': 'str' }, 'returns': 'VirtioStatus' } Example: -> { "execute": "x-debug-virtio-status", "arguments": { "path": "/machine/peripheral-anon/device[3]/virtio-backend" } } <- { "return": { "device-endian": "little", "device-id": 1, "backend-features": { "device": { "type": "virtio-net", "data": [] }, "unknown": 0, "transport": [] }, "num-vqs": 3, "guest-features": { "device": { "type": "virtio-net", "data": [ "ctrl-mac-addr", "guest-announce", "ctrl-vlan", "ctrl-rx", "ctrl-vq", "status", "mrg-rxbuf", "host-ufo", "host-ecn", "host-tso6", "host-tso4", "guest-ufo", "guest-ecn", "guest-tso6", "guest-tso4", "mac", "ctrl-guest-offloads", "guest-csum", "csum" ] }, "unknown": 0, "transport": [ "event-idx", "indirect-desc", "version-1" ] }, "host-features": { "device": { "type": "virtio-net", "data": [ "gso", "ctrl-mac-addr", "guest-announce", "ctrl-rx-extra", "ctrl-vlan", "ctrl-rx", "ctrl-vq", "status", "mrg-rxbuf", "host-ufo", "host-ecn", "host-tso6", "host-tso4", "guest-ufo", "guest-ecn", "guest-tso6", "guest-tso4", "mac", "ctrl-guest-offloads", "guest-csum", "csum" ] }, "unknown": 0, "transport": [ "event-idx", "indirect-desc", "bad-feature", "version-1", "any-layout", "notify-on-empty" ] } } } 4. Display status of a given virtio queue HMP Form: x-debug-virtio queue-status Example: (qemu) x-debug-virtio queue-status /machine/peripheral-anon/device[3]/virtio-backend 0 /machine/peripheral-anon/device[3]/virtio-backend: index: 0 inuse: 0 last_avail_idx: 61 shadow_avail_idx: 292 signalled_used: 61 signalled_used_valid: 1 VRing: num: 256 num_default: 256 align: 4096 desc: 0x000000006c352000 avail: 0x000000006c353000 used: 0x000000006c353240 QMP Form: { 'command': 'x-debug-virtio-queue-status', 'data': { 'path': 'str', 'queue': 'uint16' }, 'returns': 'VirtQueueStatus' } Example: -> { "execute": "x-debug-virtio-queue-status", "arguments": { "path": "/machine/peripheral-anon/device[3]/virtio-backend", "queue": 0 } } <- { "return": { "signalled_used": 373, "inuse": 0, "vring_desc": 864411648, "vring_num_default": 256, "signalled_used_valid": 1, "vring_avail": 864415744, "last_avail_idx": 373, "queue_index": 0, "vring_used": 864416320, "shadow_avail_idx": 619, "used_idx": 373, "vring_num": 256, "vring_align": 4096 } } 5. Display element of a given virtio queue HMP Form: x-debug-virtio queue-element [index] Example: Dump the information of the head element of the first queue of the first virtio device:: (qemu) x-debug-virtio queue-element/machine/peripheral-anon/device[3]/virtio-backend 0 index: 67 ndescs: 1 descs: addr 0x6fe69800 len 1536 (write) (qemu) xp/128bx 0x6fe69800 000000006fe69800: 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 000000006fe69808: 0x00 0x00 0x01 0x00 0x52 0x54 0x00 0x12 000000006fe69810: 0x34 0x56 0x52 0x54 0x00 0x09 0x51 0xde 000000006fe69818: 0x08 0x00 0x45 0x00 0x00 0x4c 0x8f 0x32 device[3] is a virtio-net device and we can see in the element buffer the MAC address of the card:: [root@localhost ~]# ip link show ens4 2: ens4: mtu 1500 qdisc fq_codel state UP m0 link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff and the MAC address of the gateway:: [root@localhost ~]# arp -a _gateway (192.168.122.1) at 52:54:00:09:51:de [ether] on ens4 QMP Form: { 'command': 'x-debug-virtio-queue-element', 'data': { 'path': 'str', 'queue': 'uint16', '*index': 'uint16' }, 'returns': 'VirtioQueueElement' } Example: -> { "execute": "x-debug-virtio-queue-element", "arguments": { "path": "/machine/peripheral-anon/device[3]/virtio-backend", "queue": 0 } } -> { "return": { "index": 109, "ndescs": 1, "descs": [ { "flags": [ "write" ], "len": 1536, "addr": 853145600 } ] } } v4: re-send series as v3 didn't reach qemu-devel v3: use qapi_free_VirtioInfoList() on the head of the list, not on the tail prefix the commands with x-debug- v2: introduce VirtioType enum use an enum for the endianness change field names to stick to naming conventions (s/_/-/) add a patch to decode feature bits don't check if the queue is empty to allow to displa old elements use enum for desc flags manage indirect desc decode device features in the HMP command Laurent Vivier (6): qmp: add QMP command x-debug-query-virtio qmp: add QMP command x-debug-virtio-status qmp: decode feature bits in virtio-status qmp: add QMP command x-debug-virtio-queue-status qmp: add QMP command x-debug-virtio-queue-element hmp: add x-debug-virtio commands Makefile | 2 +- Makefile.target | 7 +- docs/system/monitor.rst | 2 + hmp-commands-virtio.hx | 160 +++++++++++ hmp-commands.hx | 10 + hw/block/virtio-blk.c | 23 ++ hw/char/virtio-serial-bus.c | 11 + hw/display/virtio-gpu-base.c | 10 + hw/net/virtio-net.c | 35 +++ hw/scsi/virtio-scsi.c | 12 + hw/virtio/Makefile.objs | 2 + hw/virtio/virtio-balloon.c | 13 + hw/virtio/virtio-iommu.c | 14 + hw/virtio/virtio-stub.c | 34 +++ hw/virtio/virtio.c | 542 +++++++++++++++++++++++++++++++++++ include/hw/virtio/virtio.h | 14 + include/monitor/hmp.h | 4 + monitor/misc.c | 17 ++ qapi/Makefile.objs | 2 +- qapi/qapi-schema.json | 1 + qapi/virtio.json | 502 ++++++++++++++++++++++++++++++++ tests/qtest/qmp-cmd-test.c | 1 + 22 files changed, 1414 insertions(+), 4 deletions(-) create mode 100644 hmp-commands-virtio.hx create mode 100644 hw/virtio/virtio-stub.c create mode 100644 qapi/virtio.json