From patchwork Sun Dec 17 20:25:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Dakinevich X-Patchwork-Id: 849684 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="S4SjVO5W"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3z0FzY6Fw8z9sNV for ; Mon, 18 Dec 2017 07:25:45 +1100 (AEDT) Received: from localhost ([::1]:55375 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQfVH-0005Ft-Pt for incoming@patchwork.ozlabs.org; Sun, 17 Dec 2017 15:25:43 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55207) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQfUR-00059b-FD for qemu-devel@nongnu.org; Sun, 17 Dec 2017 15:24:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eQfUM-000343-Pv for qemu-devel@nongnu.org; Sun, 17 Dec 2017 15:24:51 -0500 Received: from mail-eopbgr50113.outbound.protection.outlook.com ([40.107.5.113]:42048 helo=EUR03-VE1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eQfUM-00033J-AY; Sun, 17 Dec 2017 15:24:46 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=10y+W1vAjAv66QeHIMZDtF5y4cXYwTL0UNyu2Gx13U8=; b=S4SjVO5WjSTabc8d9vGR5N2IOSxepdJlYRIhRo8XXYCwkyyqOrRRLKnzcxPjzGZXzvv8kKuW/JwHItaPWN9MpEh5EiftSqJ/a+BcNITl0wz3kFgvUkgAx/lWrro3uoWj8VlJ9k1QiidoSVOC/wr+ui8AHQYQzoxiDNi3NyPlHSQ= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=jan.dakinevich@virtuozzo.com; Received: from localhost.localdomain (194.28.30.174) by HE1PR0801MB2746.eurprd08.prod.outlook.com (2a01:111:e400:7baf::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.323.15; Sun, 17 Dec 2017 20:24:41 +0000 From: Jan Dakinevich To: qemu-devel@nongnu.org Date: Sun, 17 Dec 2017 23:25:54 +0300 Message-Id: <1513542355-28203-2-git-send-email-jan.dakinevich@virtuozzo.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1513542355-28203-1-git-send-email-jan.dakinevich@virtuozzo.com> References: <1513542355-28203-1-git-send-email-jan.dakinevich@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [194.28.30.174] X-ClientProxiedBy: VI1PR0202CA0006.eurprd02.prod.outlook.com (2603:10a6:803:14::19) To HE1PR0801MB2746.eurprd08.prod.outlook.com (2a01:111:e400:7baf::26) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f8e33aab-c80d-44aa-3b52-08d5458c3506 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603307); SRVR:HE1PR0801MB2746; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 3:hNwC9zqMHTyTtDYmkLeSSBH+eLcl2RDag+1yM8Nb4K+EUl92M9fCCPMhS/TqaGWPZoQXw2ghDmDhnOHfezCRYbbpDhxtrW+rIfv47WnT5wsYPPAeFismaWJvGVcg0i9T/0gkxeSMDfclrnfRZT7HqDYlpxffncDXCqSfuDQxkKwiIdSZpCUobTMYTarEhkBcR3tJjG1ViSCfdPShsKpnS7tlOiZ6Wn4k/TYrdr8kDQxnkOIQ1Fd63Km3Wi2QDSo2; 25:jE4xRMhFXrKtdOq33MybSoYUMIEVXeEg3H5E1SZbbWs8TxiPgXBf7W1NaLtVsvEwMxxhytQtteLGJWpqJYIKH0qYbz3DRWbwGWxLEu6gJTdhouDVD6HYWb3vNbEopBNsL3wF/xbgknZl70XF9Ia9uZ5q8TgZgYFQtblQPA4ifIZ0nO7R3bolRMRkeCg78uuuhQSrV+6D/z85eeaVMuaLuD/lM+iSJTt4Dj/Gx9VV3ypCMIUvlQ3CejQHt86POd1QmI6HQV2WTU4HVZ0HOxAn9hOeKq1rK6eZShFg2nh9YQYXhXfJnaQvAVKvL5LX76Y03D2Tl11BNZeKJtfFIxhulw==; 31:igKoS5FU0RRJJji1eGugy11qsCJkrI7+Ok1uJESJ9G8DRxLoa27pjFroWpNk1Hb8LcFWtMdKV/EBHm6jW2+83kW8P9cfNo2pMfwcMIPEDENbcMsHKatkAwMkrjNF6cJd36pn0UW3WejGoq5fyJL3yGtO5rz3OOQnmc36sLf6v22eFWJex48/K8Zu7fpgzxjOXgiPtgkrFINgsOjJW8fyIjlKGfDShiETAe2yCHJiz7w= X-MS-TrafficTypeDiagnostic: HE1PR0801MB2746: X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 20:qLv/2L9thpFuf1llP18xBT2TBZkySKEsgKwe/uHC1hghUYhY1/BkfAXGWMb9yqad0uAeRoOKF/K2ZazuNGRC9enBRWoYNBaDeyzTIq++dAVKQ827c01NUWmFgbK4flUs1eq4SMGu+7ZO9mKiT15Lx2E0JaoRYu1r48LuPQb1XL6wZa4tjo7aAsTR1s71fBtMqZWrOlYVXPq1GvcEV0rIUALci81cXdgUq4oCTSCeUB8KGVyfybm1Wg9dKgS9fSntRcZiLlufay+0gs5FdbOjf6KaMuSszojURjDvCVd61SYIqp61USD/xkriNEer0+9ryhFQmcuH2UQdIpP0jUvbWSLyOHizNo3w2weWrTCRtyks3pxx0cHiRifBl3ldhL+dn6ICQskFe2rv///G7yccLHIDulnTaSthpvTlJS9zuYQ=; 4:pYcfjZ2MG3TizrAjdGf9JlkM5t+axSH+7hHLt45QyqT0CNXi+EndBuCI2akoCJLeeqPqDIDnv+tGZrq8/2bma5bJz9hH6YNv4mkqkEzKl1Xg3jj4pt8vGSQPsJyOyFspVlLzlb2t5gCzwxkhQlFgIlgGiA87RWFrrmgTjgytFi8nmIotI6fdRNxeH0340qUH3CgjHYlhWgPNlqeP0nNa0dgQO+OPoRBPLVUn7vYL3wb7DSTjqzpUSBHUC+Qk4Jd3kbZU+OUYyARXGi5tr22eUw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(2401047)(5005006)(8121501046)(3002001)(10201501046)(3231023)(93006095)(93001095)(6041248)(20161123562025)(20161123555025)(20161123560025)(20161123558100)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:HE1PR0801MB2746; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:HE1PR0801MB2746; X-Forefront-PRVS: 05245CA661 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6069001)(346002)(376002)(366004)(396003)(39840400004)(199004)(189003)(478600001)(25786009)(6916009)(2950100002)(97736004)(6666003)(105586002)(4326008)(86362001)(47776003)(66066001)(5660300001)(53936002)(6506007)(59450400001)(386003)(7416002)(575784001)(6116002)(3846002)(2906002)(81156014)(48376002)(68736007)(36756003)(8676002)(51416003)(7736002)(16526018)(6486002)(8936002)(16586007)(6512007)(54906003)(81166006)(76176011)(52116002)(2361001)(2351001)(106356001)(5890100001)(305945005)(50226002)(50466002)(316002)(81973001); DIR:OUT; SFP:1102; SCL:1; SRVR:HE1PR0801MB2746; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0801MB2746; 23:vWnddDHa7jEua9cqbil5fgUx4OFnDhze0uQ6D+0?= O12NLML3EBlK7tNSMyy9EIInD0WT2JJqnLw/tPIbejQL1qp3AFxYDbH1CW81ANqM8G42sjEDC1wb9XeYJQO16RJr08p6QU7Xjpy3hIODtpYyEutSaK/FU3ZNEZzswlmA0ThvSE95g8y6YvHt/9cTOab7L+jVpTU6VxJLsptiQtoahOoSQNDnCGDeHVQtOTGb02+4O3sSfwQXVydAG7kttiCuyE3Aaz9gl0JiMdsXonhL0SARI4+h0BcJuyEWCmQPcl6clDE+tMylpZguq3g74M+44MP4YS9dpAF42XVpOp1AsGBcc9jflpU7SQL7MrnriqPzg9ofVVDH/XxoMRsvJLwt+432dZ7IBxi4MAj7Gx2iibQ5O9TWPp5IzyaSida6dAcSDNu85JuVoRQ7Fp86luyANaN5+0lPFwHXBzFJ8nnc4050+zcB8QFrFH9I3p36rzBJ6U5UBtNLOAAerSb5e3D3cJL8itEV+w8AWxRH/MmBkVY/zil2ydD4Xr/lM+j6GXicSCTpUj98TdrAFhOtnM2ePA/c1yMaTLqrjLNKV6+F3kBLejo+U7RRHn/BTzKXXIvG5ScIE/4iwgQa2dYh7OkardrCThyTwSblqt8rhy8euctQ7lcxLL2l/ICic0p/uDPHe5d0uviycPHMMimuUA1R10aJS/8V9LqXsZBoCBWP1OfKoltuMoMYGkdtLbGJ09siSzMhzdOPSYEezxnbBtsuLXVkMs6hCdKqgyNgImHOwwW/EO/g/mK26y84ixSnZmHt/FXH3uRWF8UsiDBEdcl3XI5Ouwl06Sygn+KNnCMpt5wfVgOQ2vRSNHRd+BE9cI62n7+TRfk6T7JAFkzXCE1lYoS3gYhBeI7luqMkUbJEB9Rvz6NiRvdZac5lHW9+D2qNGltptqlmZeLfIT+HV9BfzivwPH2aDQnQ+5+ksofH6fY9dYNu1OiFwWVriNoJFKUWBPyV4zRDES44tIVOlb0CknTkggl8X4U0SSELzWDr95qFZ33VAaA2o+lw+Hurjf2lCDKqthPdPyGpP7Ac97bQ9sV5WuHSdw9aFvsYSr6by0xgMUQwdSlSE+sJypx+X3dB35SV3SGvN9CAMCf1BN8BaX49FxUEyi0q92FxPKpyVdIC3NfAwdTRsEScRUu33uPy+POzZydkQEOtYlAF0Rlx1AJIqaoJSh4tClUc5LHlsFh860mSzj8++HNsmtHtxKQc= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 6:C6bePrvysM5rvKJkifvVkqODozkYrCD2n4WbxkA3+MCKpQoFkfOtCPFe2hazzPDuHiS24uIARPR4oMj3cgtiHTqum/H8z+76mHSU0U+WJkGzS0VV2hbrq2An5o6aygPwgtCY3MXTw0fv66WS2ZLTj3h9LVqDR7OvlkPfxtDr36t/KUSZrAvDfgyV0+IDRdt23jRLFGdQ3ZuUqbYE6BQFUTrfqfzsxNEZGnkOi3/9u85zz0M4tCAQD14WEKYhNF3ldzhz8EF4r1+PBhgWvR0dmIkZJ+/qqMIHWuv+6gq07gVG3HDTgdns0UyiRKsjr784GG9YcXon4k+ggdWI3rdjxJ+Rln8/mA8JKeZRnhbP8N4=; 5:9xl09jMU+ewKhs1FU/jVn4WQz1b4EyHNU1wydXR+HzNjHxm2z2Yg0bHybs+oPZfVIvYMxAfygGFpd9SBRRs6hkfNnzeOuApkxIXisO6GeB43n9QxkKadQqZIYSKKBBTMxIN/3nuyn9u7LaMtkPxPZ7v7izjrL0I/Be5aoOhbew4=; 24:YPk5tgXmT9urVkWFu94ciDK2hSH5h5eYnmBBs8uEfPwYvI+WbL4Mk6Ni2xFhFXCHMoLUhbGADaWB/BlidDCXSzWd85A0hi10gGylSScnxbQ=; 7:ChEBKzN2vuJMtZe+GWJYyjYqBviYygXjfc2btU+bnkZ+3GSJsC3DmTr4pLeXJcPOaNdS6OHpdERjLfs0R8DimGerJzft+6DoVN60KRDPjVwjksqPjafmQKYbuFa9fd5n5pTYhDrO2WqMFqzWtpkAryNz6sP4UVIKr5ZunhNBxIFl8H2/V1bJABjdrR/TfoIPXHVby4FEHLDsD4marpyaE2O90aSQYcy/MtMBMvIjfYZa0OPyb40N+JF35BMynSnt SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 20:c9tuRs6B7uRBzf3mMl+IpF6VuLb4bQX3iINMLpZoHs5FHaUCdN3wjjsujG+fHf1LnLpfQMdCItbgWeIvhLSqXxqyomPqZ7pqH3sL8XQLlyfzxyxvruPG4GPkjnZbP2S+1wB9zCRpoirsL4hn/Ysk9nW9AVD8OykhPbOLgOeVRKY= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Dec 2017 20:24:41.0131 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f8e33aab-c80d-44aa-3b52-08d5458c3506 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB2746 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.5.113 Subject: [Qemu-devel] [RFC v6 1/2] virtio: introduce `query-virtio' QMP command X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Denis V. Lunev" , qemu-block@nongnu.org, Amit Shah , Jason Wang , Cornelia Huck , "Dr. David Alan Gilbert" , Markus Armbruster , Jan Dakinevich , "Michael S. Tsirkin" , Stefan Hajnoczi , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" The command is intended for gathering virtio information such as status, feature bits, negotiation status. It is convenient and useful for debug purpose. The commands returns generic virtio information for virtio such as common feature names and status bits names and information for all attached to current machine devices. To retrieve names of device-specific features `tell_feature_name' callback in VirtioDeviceClass also was introduced. Cc: Denis V. Lunev Signed-off-by: Jan Dakinevich --- hw/block/virtio-blk.c | 20 +++++++ hw/char/virtio-serial-bus.c | 14 +++++ hw/display/virtio-gpu.c | 12 ++++ hw/net/virtio-net.c | 34 +++++++++++ hw/scsi/virtio-scsi.c | 15 +++++ hw/virtio/Makefile.objs | 3 + hw/virtio/virtio-balloon.c | 14 +++++ hw/virtio/virtio-qmp.c | 134 ++++++++++++++++++++++++++++++++++++++++++++ hw/virtio/virtio-stub.c | 9 +++ hw/virtio/virtio.c | 41 ++++++++++++++ include/hw/virtio/virtio.h | 6 ++ qapi-schema.json | 70 +++++++++++++++++++++++ 12 files changed, 372 insertions(+) create mode 100644 hw/virtio/virtio-qmp.c create mode 100644 hw/virtio/virtio-stub.c diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index 05d1440..2ffd949 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -1017,6 +1017,25 @@ static Property virtio_blk_properties[] = { DEFINE_PROP_END_OF_LIST(), }; +static const char *virtio_blk_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_BLK_F_BARRIER); + FBIT(VIRTIO_BLK_F_SIZE_MAX); + FBIT(VIRTIO_BLK_F_SEG_MAX); + FBIT(VIRTIO_BLK_F_RO); + FBIT(VIRTIO_BLK_F_BLK_SIZE); + FBIT(VIRTIO_BLK_F_SCSI); + FBIT(VIRTIO_BLK_F_TOPOLOGY); + FBIT(VIRTIO_BLK_F_FLUSH); + FBIT(VIRTIO_BLK_F_MQ); + } +#undef FBIT + return NULL; +} + static void virtio_blk_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -1030,6 +1049,7 @@ static void virtio_blk_class_init(ObjectClass *klass, void *data) vdc->get_config = virtio_blk_update_config; vdc->set_config = virtio_blk_set_config; vdc->get_features = virtio_blk_get_features; + vdc->tell_feature_name = virtio_blk_tell_feature_name; vdc->set_status = virtio_blk_set_status; vdc->reset = virtio_blk_reset; vdc->save = virtio_blk_save_device; diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c index 9470bd7..1d4678b 100644 --- a/hw/char/virtio-serial-bus.c +++ b/hw/char/virtio-serial-bus.c @@ -1156,6 +1156,19 @@ static Property virtio_serial_properties[] = { DEFINE_PROP_END_OF_LIST(), }; +static const char *virtio_serial_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_CONSOLE_F_SIZE); + FBIT(VIRTIO_CONSOLE_F_MULTIPORT); + FBIT(VIRTIO_CONSOLE_F_EMERG_WRITE); + }; +#undef FBIT + return NULL; +} + static void virtio_serial_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -1170,6 +1183,7 @@ static void virtio_serial_class_init(ObjectClass *klass, void *data) vdc->realize = virtio_serial_device_realize; vdc->unrealize = virtio_serial_device_unrealize; vdc->get_features = get_features; + vdc->tell_feature_name = virtio_serial_tell_feature_name; vdc->get_config = get_config; vdc->set_config = set_config; vdc->set_status = set_status; diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 274e365..1906b68 100644 --- a/hw/display/virtio-gpu.c +++ b/hw/display/virtio-gpu.c @@ -1317,6 +1317,17 @@ static Property virtio_gpu_properties[] = { DEFINE_PROP_END_OF_LIST(), }; +static const char *virtio_gpu_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_GPU_F_VIRGL); + }; +#undef FBIT + return NULL; +} + static void virtio_gpu_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -1327,6 +1338,7 @@ static void virtio_gpu_class_init(ObjectClass *klass, void *data) vdc->get_config = virtio_gpu_get_config; vdc->set_config = virtio_gpu_set_config; vdc->get_features = virtio_gpu_get_features; + vdc->tell_feature_name = virtio_gpu_tell_feature_name; vdc->set_features = virtio_gpu_set_features; vdc->reset = virtio_gpu_reset; diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 38674b0..0fbd055 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -2163,6 +2163,39 @@ static Property virtio_net_properties[] = { DEFINE_PROP_END_OF_LIST(), }; +static const char *virtio_net_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_NET_F_CSUM); + FBIT(VIRTIO_NET_F_GUEST_CSUM); + FBIT(VIRTIO_NET_F_CTRL_GUEST_OFFLOADS); + FBIT(VIRTIO_NET_F_MTU); + FBIT(VIRTIO_NET_F_MAC); + FBIT(VIRTIO_NET_F_GSO); + FBIT(VIRTIO_NET_F_GUEST_TSO4); + FBIT(VIRTIO_NET_F_GUEST_TSO6); + FBIT(VIRTIO_NET_F_GUEST_ECN); + FBIT(VIRTIO_NET_F_GUEST_UFO); + FBIT(VIRTIO_NET_F_HOST_TSO4); + FBIT(VIRTIO_NET_F_HOST_TSO6); + FBIT(VIRTIO_NET_F_HOST_ECN); + FBIT(VIRTIO_NET_F_HOST_UFO); + FBIT(VIRTIO_NET_F_MRG_RXBUF); + FBIT(VIRTIO_NET_F_STATUS); + FBIT(VIRTIO_NET_F_CTRL_VQ); + FBIT(VIRTIO_NET_F_CTRL_RX); + FBIT(VIRTIO_NET_F_CTRL_VLAN); + FBIT(VIRTIO_NET_F_CTRL_RX_EXTRA); + FBIT(VIRTIO_NET_F_GUEST_ANNOUNCE); + FBIT(VIRTIO_NET_F_MQ); + FBIT(VIRTIO_NET_F_CTRL_MAC_ADDR); + }; +#undef FBIT + return NULL; +} + static void virtio_net_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -2178,6 +2211,7 @@ static void virtio_net_class_init(ObjectClass *klass, void *data) vdc->get_features = virtio_net_get_features; vdc->set_features = virtio_net_set_features; vdc->bad_features = virtio_net_bad_features; + vdc->tell_feature_name = virtio_net_tell_feature_name; vdc->reset = virtio_net_reset; vdc->set_status = virtio_net_set_status; vdc->guest_notifier_mask = virtio_net_guest_notifier_mask; diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index 3aa9971..4be5df8 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -942,6 +942,20 @@ static const VMStateDescription vmstate_virtio_scsi = { }, }; +static const char *virtio_scsi_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_SCSI_F_INOUT); + FBIT(VIRTIO_SCSI_F_HOTPLUG); + FBIT(VIRTIO_SCSI_F_CHANGE); + FBIT(VIRTIO_SCSI_F_T10_PI); + }; +#undef FBIT + return NULL; +} + static void virtio_scsi_common_class_init(ObjectClass *klass, void *data) { VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); @@ -964,6 +978,7 @@ static void virtio_scsi_class_init(ObjectClass *klass, void *data) vdc->unrealize = virtio_scsi_device_unrealize; vdc->set_config = virtio_scsi_set_config; vdc->get_features = virtio_scsi_get_features; + vdc->tell_feature_name = virtio_scsi_tell_feature_name; vdc->reset = virtio_scsi_reset; vdc->start_ioeventfd = virtio_scsi_dataplane_start; vdc->stop_ioeventfd = virtio_scsi_dataplane_stop; diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs index 765d363..3524aa7 100644 --- a/hw/virtio/Makefile.objs +++ b/hw/virtio/Makefile.objs @@ -3,12 +3,15 @@ common-obj-y += virtio-rng.o common-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o common-obj-y += virtio-bus.o common-obj-y += virtio-mmio.o +common-obj-y += virtio-qmp.o obj-y += virtio.o virtio-balloon.o obj-$(CONFIG_LINUX) += vhost.o vhost-backend.o vhost-user.o obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock.o obj-y += virtio-crypto.o obj-$(CONFIG_VIRTIO_PCI) += virtio-crypto-pci.o +else +obj-y += virtio-stub.o endif common-obj-$(call lnot,$(CONFIG_LINUX)) += vhost-stub.o diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c index 37cde38..d97c8ce 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c @@ -509,6 +509,19 @@ static Property virtio_balloon_properties[] = { DEFINE_PROP_END_OF_LIST(), }; +static const char *virtio_balloon_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_BALLOON_F_MUST_TELL_HOST); + FBIT(VIRTIO_BALLOON_F_STATS_VQ); + FBIT(VIRTIO_BALLOON_F_DEFLATE_ON_OOM); + }; +#undef FBIT + return NULL; +} + static void virtio_balloon_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -523,6 +536,7 @@ static void virtio_balloon_class_init(ObjectClass *klass, void *data) vdc->get_config = virtio_balloon_get_config; vdc->set_config = virtio_balloon_set_config; vdc->get_features = virtio_balloon_get_features; + vdc->tell_feature_name = virtio_balloon_tell_feature_name; vdc->set_status = virtio_balloon_set_status; vdc->vmsd = &vmstate_virtio_balloon_device; } diff --git a/hw/virtio/virtio-qmp.c b/hw/virtio/virtio-qmp.c new file mode 100644 index 0000000..6eaef9a --- /dev/null +++ b/hw/virtio/virtio-qmp.c @@ -0,0 +1,134 @@ +#include "qemu/osdep.h" +#include "qemu-common.h" +#include "qmp-commands.h" + +#include "hw/virtio/virtio.h" + +static VirtioInfoList *qmp_query_virtio_one(VirtIODevice *vdev) +{ + VirtioInfoList *info_list; + VirtioInfo *info; + unsigned int idx; + + info_list = g_new0(VirtioInfoList, 1); + info_list->value = g_new0(VirtioInfo, 1); + + info = info_list->value; + info->qom_path = object_get_canonical_path(OBJECT(vdev)); + info->status = vdev->status; + info->host_features = vdev->host_features; + info->guest_features = vdev->guest_features; + + for (idx = 8; idx--; ) { + const char *name = virtio_tell_status_name(vdev, idx); + strList *status; + + if (!name) { + continue; + } + if (!(vdev->status & (1 << idx))) { + continue; + } + + status = g_new(strList, 1); + status->value = g_strdup(name); + + status->next = info->status_names; + info->status_names = status; + } + + for (idx = 64; idx--; ) { + const char *name = virtio_tell_device_feature_name(vdev, idx); + VirtioFeatureList **head = &info->device_features_names; + VirtioFeatureList *feature; + + if (!name) { + name = virtio_tell_common_feature_name(vdev, idx); + head = &info->common_features_names; + } + if (!name) { + continue; + } + if (!virtio_host_has_feature(vdev, idx)) { + continue; + } + + feature = g_new0(VirtioFeatureList, 1); + feature->value = g_new0(VirtioFeature, 1); + + feature->value->name = g_strdup(name); + feature->value->acked = virtio_vdev_has_feature(vdev, idx); + + feature->next = *head; + *head = feature; + } + + return info_list; +} + +typedef struct QueryVirtioEntry { + VirtIODevice *vdev; + QTAILQ_ENTRY(QueryVirtioEntry) link; +} QueryVirtioEntry; + +typedef QTAILQ_HEAD(, QueryVirtioEntry) QueryVirtioHead; + +static void qmp_query_virtio_recursive(QueryVirtioHead *head, BusState *bus) +{ + BusChild *kid; + + QTAILQ_FOREACH(kid, &bus->children, sibling) { + DeviceState *dev = kid->child; + BusState *child; + + if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_DEVICE)) { + QueryVirtioEntry *entry = g_new0(QueryVirtioEntry, 1); + + entry->vdev = VIRTIO_DEVICE(dev); + QTAILQ_INSERT_TAIL(head, entry, link); + } + QLIST_FOREACH(child, &dev->child_bus, sibling) { + qmp_query_virtio_recursive(head, child); + } + } +} + +VirtioInfoList *qmp_query_virtio(bool has_path, const char *path, Error **errp) +{ + BusState *bus = sysbus_get_default(); + VirtioInfoList *list = NULL; + + if (!bus) { + return NULL; + } + + if (has_path) { + Object *obj = object_resolve_path(path, NULL); + if (!obj) { + return NULL; + } + if (!object_dynamic_cast(OBJECT(obj), TYPE_VIRTIO_DEVICE)) { + return NULL; + } + + list = qmp_query_virtio_one(VIRTIO_DEVICE(obj)); + } else { + QueryVirtioHead head; + QueryVirtioEntry *query, *tmp; + + QTAILQ_INIT(&head); + qmp_query_virtio_recursive(&head, bus); + + QTAILQ_FOREACH_SAFE(query, &head, link, tmp) { + VirtioInfoList *entry = qmp_query_virtio_one(query->vdev); + + QTAILQ_REMOVE(&head, query, link); + g_free(query); + + entry->next = list; + list = entry; + } + } + + return list; +} diff --git a/hw/virtio/virtio-stub.c b/hw/virtio/virtio-stub.c new file mode 100644 index 0000000..185d4bd --- /dev/null +++ b/hw/virtio/virtio-stub.c @@ -0,0 +1,9 @@ +#include "qemu/osdep.h" +#include "qmp-commands.h" +#include "qapi/qmp/qerror.h" + +VirtioInfoList *qmp_query_virtio(bool has_path, const char *path, Error **errp) +{ + error_setg(errp, QERR_UNSUPPORTED); + return NULL; +} diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index ad564b0..23b33db 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -2198,6 +2198,47 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id) return 0; } +const char *virtio_tell_status_name(VirtIODevice *vdev, unsigned sbit) +{ +#define SBIT(sbit) case sbit: return #sbit + switch (1 << sbit) { + SBIT(VIRTIO_CONFIG_S_ACKNOWLEDGE); + SBIT(VIRTIO_CONFIG_S_DRIVER); + SBIT(VIRTIO_CONFIG_S_DRIVER_OK); + SBIT(VIRTIO_CONFIG_S_FEATURES_OK); + SBIT(VIRTIO_CONFIG_S_NEEDS_RESET); + SBIT(VIRTIO_CONFIG_S_FAILED); + } +#undef SBIT + return NULL; +} + +const char *virtio_tell_common_feature_name(VirtIODevice *vdev, unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_F_NOTIFY_ON_EMPTY); + FBIT(VIRTIO_F_ANY_LAYOUT); + FBIT(VIRTIO_RING_F_INDIRECT_DESC); + FBIT(VIRTIO_RING_F_EVENT_IDX); + FBIT(VIRTIO_F_BAD_FEATURE); + FBIT(VIRTIO_F_VERSION_1); + FBIT(VIRTIO_F_IOMMU_PLATFORM); + } +#undef FBIT + return NULL; +} + +const char *virtio_tell_device_feature_name(VirtIODevice *vdev, unsigned fbit) +{ + VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev); + + if (vdc->tell_feature_name) { + return vdc->tell_feature_name(vdev, fbit); + } + return NULL; +} + void virtio_cleanup(VirtIODevice *vdev) { qemu_del_vm_change_state_handler(vdev->vmstate); diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index 098bdaa..25f47da 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -141,6 +141,8 @@ typedef struct VirtioDeviceClass { void (*save)(VirtIODevice *vdev, QEMUFile *f); int (*load)(VirtIODevice *vdev, QEMUFile *f, int version_id); const VMStateDescription *vmsd; + /* Tells the name of device specific feature */ + const char *(*tell_feature_name)(VirtIODevice *vdev, unsigned fbit); } VirtioDeviceClass; void virtio_instance_init_common(Object *proxy_obj, void *data, @@ -292,6 +294,10 @@ void virtio_queue_aio_set_host_notifier_handler(VirtQueue *vq, AioContext *ctx, VirtQueue *virtio_vector_first_queue(VirtIODevice *vdev, uint16_t vector); VirtQueue *virtio_vector_next_queue(VirtQueue *vq); +const char *virtio_tell_status_name(VirtIODevice *vdev, unsigned sbit); +const char *virtio_tell_common_feature_name(VirtIODevice *vdev, unsigned fbit); +const char *virtio_tell_device_feature_name(VirtIODevice *vdev, unsigned fbit); + static inline void virtio_add_feature(uint64_t *features, unsigned int fbit) { assert(fbit < 64); diff --git a/qapi-schema.json b/qapi-schema.json index 1845795..51cd0f3 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3200,3 +3200,73 @@ # Since: 2.11 ## { 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogAction'} } + +## +# @VirtioFeature: +# +# Virtio feature bit with negotiation status +# +# @name: name of feature bit +# +# @acked: negotiation status, `true' if guest acknowledged the feature +# +# Since: 2.12 +## +{ + 'struct': 'VirtioFeature', + 'data': { + 'name': 'str', + 'acked': 'bool' + } +} + +## +# @VirtioInfo: +# +# Information about virtio device +# +# @qom-path: QOM path of the device +# +# @status: status bitmask +# +# @host-features: bitmask of features, exposed by device +# +# @guest-features: bitmask of features, acknowledged by guest +# +# @status-names: names of checked bits in status bitmask +# +# @common-features-names: names exposed features and negotiation status, +# that are common to all devices +# +# @device-features-names: names exposed features and negotiation status, +# that are specific to this device +# +# Since: 2.12 +## +{ + 'struct': 'VirtioInfo', + 'data': { + 'qom-path': 'str', + + 'status': 'uint8', + 'host-features': 'uint64', + 'guest-features': 'uint64', + + 'status-names': ['str'], + 'common-features-names': ['VirtioFeature'], + 'device-features-names': ['VirtioFeature'] + } +} + +## +# @query-virtio: +# +# Returns virtio information such as device status and features +# +# Since: 2.12 +## +{ + 'command': 'query-virtio', + 'data': {'*path': 'str'}, + 'returns': ['VirtioInfo'] +} From patchwork Sun Dec 17 20:25:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Dakinevich X-Patchwork-Id: 849683 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="JniHIfzW"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3z0FzX4Y6Nz9sDB for ; Mon, 18 Dec 2017 07:25:44 +1100 (AEDT) Received: from localhost ([::1]:55376 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQfVG-0005Fw-Io for incoming@patchwork.ozlabs.org; Sun, 17 Dec 2017 15:25:42 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55223) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQfUV-0005CH-9s for qemu-devel@nongnu.org; Sun, 17 Dec 2017 15:25:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eQfUQ-00036C-Md for qemu-devel@nongnu.org; Sun, 17 Dec 2017 15:24:55 -0500 Received: from mail-eopbgr50129.outbound.protection.outlook.com ([40.107.5.129]:59082 helo=EUR03-VE1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eQfUQ-00035K-A8; Sun, 17 Dec 2017 15:24:50 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Mo6LWgc2kEgw66EF6EOq417d9bycjedJHXWEHt3lwnY=; b=JniHIfzWEkxjxMrvforicmi3C/XoaDUAJ1Q14PIiYyEWJY+GtGWoFTKFgnuGaVdpVrGgq4WheXyCyV/WkBMid0bq3JnRyilb2DFLbHHnfi2umdrbONwRMJtJG20/zp0DQ78M9qgh5TAaXkxZPES6RP8/henVKhu2jcKhfWHqpzE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=jan.dakinevich@virtuozzo.com; Received: from localhost.localdomain (194.28.30.174) by HE1PR0801MB2746.eurprd08.prod.outlook.com (2a01:111:e400:7baf::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.323.15; Sun, 17 Dec 2017 20:24:45 +0000 From: Jan Dakinevich To: qemu-devel@nongnu.org Date: Sun, 17 Dec 2017 23:25:55 +0300 Message-Id: <1513542355-28203-3-git-send-email-jan.dakinevich@virtuozzo.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1513542355-28203-1-git-send-email-jan.dakinevich@virtuozzo.com> References: <1513542355-28203-1-git-send-email-jan.dakinevich@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [194.28.30.174] X-ClientProxiedBy: VI1PR0202CA0006.eurprd02.prod.outlook.com (2603:10a6:803:14::19) To HE1PR0801MB2746.eurprd08.prod.outlook.com (2a01:111:e400:7baf::26) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2a22e956-84c4-453a-0ec9-08d5458c377e X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603307); SRVR:HE1PR0801MB2746; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 3:HJTD8iJAQgLBKoYTWAk127dz2GQuf+I1XguarP9tw3H5NyGZYgSE4m7tCWFY4uvHeH4FeaVRuc1VCfJhhB3i8MEP+PQlesHzgPHIkfL8kYMwWrcSV+VG6h9hkXEOPkgI3WOBv372pR0jjsntS3w5F6I1bRWVNDwTa9xCaT7RSuw1xrllAGII4fH+Qa1CUN6d+nw2SJzM7H12KCGEN6yMCevTmRl+OkIOkL4jymnC9T6YmQBLgPg1VIM2lbFAuSEM; 25:F65s4AGrfBgXmSNmjN3Q+qbBTTj8zpGb3Y1Zi5STp6ZT36YsV2bCWo/ocMZMbpurrhKj6h/YhhPGfdJN1Sd4HGeCSG5m3aRFfCiAVMK5h8MEXjA7dKw+JNI+D/nlBHFUrVbz8g0Bb+NqxmEezlXdmk+NpZ7AOw8csPVH9VNsrP2yr2QpidmzQTIOXNNxlWArDrdENeW2Pb/pcXspDW4VdeL/GJb+5Q+yXhpNrA+67Zg+7X1rnqOozjiS2kCD940+wpSgr40hBquwyot4hotWkw9YFJyiAgrnij5GiuiuL4vc7k94Mu4bLpVe244emOL4VbEQtp+spsqXPRdHBQ7h2w==; 31:8DAUs0NozU25pSrYX5hAY+9HNzTJOpmMLPmQvvN7K7/wMV5hwymu/90sUEKhY+eEknsS2+XO5L+zjjH1OrretanKt0HfNOyVqf9HQHIzaRjvlcZYwCPYBMoLxNAM2ZTxhBBLI7jXN+9vIVLwczbtPeNnTKhbJ40OpZtb5N8SRcJnaJFeAP2yrCPrlWS7ceuOwCMaQ/nOkcLfXZWnRFEMGyCWAxG0YbflfSoQPkmEaMk= X-MS-TrafficTypeDiagnostic: HE1PR0801MB2746: X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 20:FwdscpsRXokH4TmYFnsB2/7aQlCGbH3pusmzGlrCFcFgcfoZmrKwLxt+3FWfVIuvtjflozoVu9Jr2b8RW9RHdVc2Vrb7FRuGV9pzuX9xNro/B7OZDY6fY4r8ESAsJUDct5KcPqZOp/Tt253PX3YsQiOAzojoOeWI4uJi0RI2EwAISrZI4FFMb7h2sRJJqH93WNVqW9aF/C99/nPVVGGFn4oK3NZvM2TQjhEoZVTZYSR8+lq85uoUy2AyGVvzZdoMyqMTF7UTKFsxoSE9uwr8T0CXI8kImPXeA+ZWGtxe2GXWEfGriQ2yxcryY/Q1WqWBdZtSfakmSSyDoDcoyhd95j0szg6al/ahaw8oJlZUOJKFpWS5FRtwyexEBrLxe7nCB7MrVTd8ELxP7f6pPBIEpy3VBVL4ayqBRpgadmKKTG0=; 4:7by6xkT+ftyxTAbmgK990Z8fkbU2HQm2wg38U5q5cXJ3w92E6173L+IVCgvhc+lbdetImWAzPNrLHt4JPwJPkMF0xkbUUaGZQaUbZ2p0yYTTXDffbi9hD1RZc7Y7h6y8h4LIOHODle/tvpoQZzpDVgVPIzTKjZ1G04vx0SYkWIkv4plLqTSn1Q2cSg4P7lIQVmwclrcZC0wphQvJ0rhP3zjW4U6txu8/xDuOf4gPrLh2oFBTAGnsZMbvvcDvDALTJP2zp48dX2SyM2jsXlR1Ww== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(2401047)(5005006)(8121501046)(3002001)(10201501046)(3231023)(93006095)(93001095)(6041248)(20161123562025)(20161123555025)(20161123560025)(20161123558100)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:HE1PR0801MB2746; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:HE1PR0801MB2746; X-Forefront-PRVS: 05245CA661 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6069001)(346002)(376002)(366004)(396003)(39840400004)(199004)(189003)(478600001)(25786009)(6916009)(2950100002)(97736004)(6666003)(105586002)(4326008)(86362001)(47776003)(66066001)(5660300001)(53936002)(6506007)(386003)(7416002)(6116002)(3846002)(2906002)(81156014)(48376002)(68736007)(36756003)(8676002)(51416003)(7736002)(16526018)(6486002)(8936002)(16586007)(6512007)(54906003)(81166006)(76176011)(52116002)(2361001)(2351001)(106356001)(305945005)(50226002)(50466002)(316002)(81973001); DIR:OUT; SFP:1102; SCL:1; SRVR:HE1PR0801MB2746; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0801MB2746; 23:gJLUA60mEFtzE6m6cC10SBGcr8/ZJlmJXDz3IEp?= vcoivMrY1dmu2NGeAfOnwNhE178OjBu3A8v3slxZmQFnN8/q2i+75YliC5MMD6gdfhpUNEjLEDlRXsAYtXEJGHRE2yQlmsqQZs3IuzkjmcxESD7TTN0TXSBXJ8ESarb9U+ffKDYWnVgGVe7zp/lPFK+yFR+YMyj+WilMG7sScwfybj4alkXakycZ4Eqj0h1mATKma3GjLlnbIFqbun4oe9EaFX5lv1klgt7nB0uQvtbnmJPBREWuIKuttnbqJ7OoWgTJhnjrFEj6dNgDfAAI9F0DK4wQ1i3dHdwudOQfGzIvBoGbNhz0lT3QR+xNJpyEPfecTqj2kzq+qoGAAz0xEvGes1ktmmuZ34zmTSW2FchdNVdLUVtS2iosttD5PI4OqcQdGc/Oj9qPysYC2uReZJB8Z8P/30WDrN2SzpTNe0dmFfyAwbrsZnLW1ChplkzF25bg3ODL66c6A/MhNLfYzNzdO56OGvuwDdTW0fZNrjlObW/ieln3rzJ1KLZmpBIdOGuy0G9S6t4Tpe4R71/KfNwUOKMZvDiZaSFQor0p4EnRye0MVKFmwreeaLlGFPgysLaT1dG1k0rgmfMg0FBiPrWXulh6s64JN+05YItslCAR+QAU4suSjttEwvR7C0dR6Pj+eRxkfqY7RnO8e37FVYAV1aE6RKd1kXEW0RuI8mtyMpYEvmRtifHlXwIlp+N0qnwkLGnngm5T2IiDUaPhyxAPlwymIWnDRv0I08PWOrNybKOg0biE89kk0X2+pKShpxBk6BRPUYGiApCCV61fr6gDjNF7YueXm8cwpfEx9klIGkoFkd6lPX5Cf6IGjSD+vCUjXgbyv2HgTBZnz9tIh4Yv4hjTlZjtbOt+MiXsBS9V0zZxEYfViwhyTZSCyAqWF3YSRn18sBTdhM0L0x1Bn1VAcNRXt8QzxMd3xcair8IPZt2g3/HV/tMkjnzL+uWw3hPo8pe92wwmonHo0pZatfY2Meft5SwxslRAdkLSwyMl+JIQAAzI8h6sdw/N+I7eHNzNil5pDAHrSCYsjy+R8/KslxBG9Lvwh9Kl7ObgwVo+aN2rneAMU/TKTxst8hyTyS0lv58oZNb8CyYK50+QUaUD2KNQLccAQMgBVQHLugD/fmg== X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 6:Oumduu5vkRfDGg3um+88oaT0Be4nhu2mcppSp7ItSurQUaSA44RZe7O/7jU/Kuc/o7sMCgzPQuJ3difNMLiSNHUi9lS/lvGMavQ657kzQKcEBMuzE9kA3gmF+rUSp2ftnerNe4Ib8bi/Nl17OlRh1iEGAOAKCpMaGApNUOEQfzsDLxtnRrx6EexHK4LtAOw8kKSOt4G/MykUmyi4YrhuxUoKy8+a755wm0rpPttL9y0NMhKVxQ3ljg6di2FHHNtxNfAdVPAiLYBetbeclhnVgNydWDGgET+jYxM1vAHH6h+Fh1wVk0vbPyVZrVvaey4MGm2K2+FIlwzQDUwY0cXd+St/CacOfte32ejTvS0HmeU=; 5:1yzf4rfENI91BurWRNXIluxhjKGHDh3k5ePH8oE9YdQ0jzIJnlvAJoBztoXQVzga2p575z8GwzbPJtPBkr9iVKxbMt2WFVFbmFDTfhXCrHVeLW00m85FHx1ZG//fJRB8t5X3X0N3x20xAozPO4xiSx/3c+sI7y3rt5F9DLETpsg=; 24:vz1CZMFzYM0IqifDK9zihJWC2yTSNQ5PybGCkibhA7uQgGsqleZAtcXviEtsU1B5kQtPfqIOrK8XJU7gzivi9s6RBFzY3gwOzge8rsza63A=; 7:p1FABcePGYRxiNAdGZdtokLzIqBWCry6H6RB8SmDANlPm7RcY+DBF59JL0IHgOoqRtBY2qPFvgVovoetcdXWm8qDr/PTx9d/OHIeRdW2PkQQJb6AJe/e8xwVqhK18OzE1E57Um1yPeAPQUYyzwLr8PS8roOn5PE9nBJAzg66H9/TvuaBhBcH9fHk7XXYmp/toUqNR75HYeLU2r9GfX8dyaPzxHpNzhjGS73HCtsf//JIN1ykUaYChSz9O9do4DWx SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 20:2jxzAyUKTFfejZppAMLs6xkTMjgMlkHB3f14DCBpVkG1hVVWaLLzT6Ebo69gfZJFkd2l6yGDEJYGGnz6t6T1VQNGOSshMSA0HLptAg4Xw+YI9fT7WcK/ztGUiZJlz8vMRBWGcGOwtm0tQ86Cg6OCK/7DicInVfDeHGATb/98EWI= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Dec 2017 20:24:45.2320 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2a22e956-84c4-453a-0ec9-08d5458c377e X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB2746 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.5.129 Subject: [Qemu-devel] [RFC v6 2/2] virtio: add `info virtio' HMP command X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Denis V. Lunev" , qemu-block@nongnu.org, Amit Shah , Jason Wang , Cornelia Huck , "Dr. David Alan Gilbert" , Markus Armbruster , Jan Dakinevich , "Michael S. Tsirkin" , Stefan Hajnoczi , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" The command prints data from `query-virtio' QMP in human-readable format. Cc: Denis V. Lunev Signed-off-by: Jan Dakinevich --- hmp-commands-info.hx | 14 ++++++++++ hmp.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++ hmp.h | 1 + 3 files changed, 89 insertions(+) diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx index 54c3e5e..292280a 100644 --- a/hmp-commands-info.hx +++ b/hmp-commands-info.hx @@ -868,6 +868,20 @@ enabled) memory in bytes. ETEXI STEXI +@item info virtio +@findex virtio +Display guest and host fetures for all virtio devices. +ETEXI + + { + .name = "virtio", + .args_type = "path:s?", + .params = "[path]", + .help = "show virtio info", + .cmd = hmp_info_virtio, + }, + +STEXI @end table ETEXI diff --git a/hmp.c b/hmp.c index 35a7041..786782b 100644 --- a/hmp.c +++ b/hmp.c @@ -43,6 +43,7 @@ #include "hw/intc/intc.h" #include "migration/snapshot.h" #include "migration/misc.h" +#include "hw/virtio/virtio.h" #ifdef CONFIG_SPICE #include @@ -2918,3 +2919,76 @@ void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict) } hmp_handle_error(mon, &err); } + +#define HMP_INFO_VIRTIO_INDENT 2 +#define HMP_INFO_VIRTIO_FEATURE 40 + +static void hmp_info_virtio_print(Monitor *mon, VirtioInfo *info) +{ + Object *obj = object_resolve_path(info->qom_path, NULL); + char *path = qdev_get_dev_path(DEVICE(obj)); + VirtioFeatureList *feat; + strList *status; + + monitor_printf(mon, "%s at %s\n", object_get_typename(obj), path); + g_free(path); + + monitor_printf(mon, "%*sQOM path: %s\n", + HMP_INFO_VIRTIO_INDENT, "", info->qom_path); + + /* device status */ + monitor_printf(mon, "%*sstatus: 0x%02"PRIx8"\n", + HMP_INFO_VIRTIO_INDENT, "", info->status); + for (status = info->status_names; status; status = status->next) { + monitor_printf(mon, "%*s%s\n", + HMP_INFO_VIRTIO_INDENT * 2, "", status->value); + } + + + /* host and guest feature */ + monitor_printf(mon, "%*shost features: 0x%016"PRIx64"\n", + HMP_INFO_VIRTIO_INDENT, "", info->host_features); + monitor_printf(mon, "%*sguest features: 0x%016"PRIx64"\n", + HMP_INFO_VIRTIO_INDENT, "", info->guest_features); + + /* common features */ + monitor_printf(mon, "%*scommon features:%s\n", + HMP_INFO_VIRTIO_INDENT, "", + info->common_features_names ? "" : " (none)"); + for (feat = info->common_features_names; feat; feat = feat->next) { + monitor_printf(mon, "%*s%-*s%s\n", + HMP_INFO_VIRTIO_INDENT * 2, "", + HMP_INFO_VIRTIO_FEATURE, feat->value->name, + feat->value->acked ? " acked" : ""); + } + + /* device features */ + monitor_printf(mon, "%*sdevice features:%s\n", + HMP_INFO_VIRTIO_INDENT, "", + info->device_features_names ? "" : " (none)"); + for (feat = info->device_features_names; feat; feat = feat->next) { + monitor_printf(mon, "%*s%-*s%s\n", + HMP_INFO_VIRTIO_INDENT * 2, "", + HMP_INFO_VIRTIO_FEATURE, feat->value->name, + feat->value->acked ? " acked" : ""); + } +} + +void hmp_info_virtio(Monitor *mon, const QDict *qdict) +{ + const char *path = qdict_get_try_str(qdict, "path"); + Error *err = NULL; + VirtioInfoList *head, *info; + + + head = qmp_query_virtio(!!path, path, &err); + if (err) { + return; + } + + for (info = head; info; info = info->next) { + hmp_info_virtio_print(mon, info->value); + } + + qapi_free_VirtioInfoList(head); +} diff --git a/hmp.h b/hmp.h index a6f56b1..156293e 100644 --- a/hmp.h +++ b/hmp.h @@ -147,5 +147,6 @@ void hmp_info_ramblock(Monitor *mon, const QDict *qdict); void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict); void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict); void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict); +void hmp_info_virtio(Monitor *mon, const QDict *qdict); #endif