{"id":2221750,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2221750/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260410085716.877185-2-john.levon@nutanix.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.2/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260410085716.877185-2-john.levon@nutanix.com>","list_archive_url":null,"date":"2026-04-10T08:57:14","name":"[v2,1/3] vfio-user: support VFIO_USER_DEVICE_FEATURE","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"c02e5b09bc83817174056c5ac704be7aa4435f98","submitter":{"id":80631,"url":"http://patchwork.ozlabs.org/api/1.2/people/80631/?format=json","name":"John Levon","email":"john.levon@nutanix.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260410085716.877185-2-john.levon@nutanix.com/mbox/","series":[{"id":499428,"url":"http://patchwork.ozlabs.org/api/1.2/series/499428/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=499428","date":"2026-04-10T08:57:15","name":"vfio-user fixes","version":2,"mbox":"http://patchwork.ozlabs.org/series/499428/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2221750/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2221750/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=nutanix.com header.i=@nutanix.com header.a=rsa-sha256\n header.s=proofpoint20171006 header.b=b4X5DVhT;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=nutanix.com header.i=@nutanix.com header.a=rsa-sha256\n header.s=selector1 header.b=d7Ap2uFJ;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fsW1F7500z1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 18:58:25 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wB7g9-0004c8-GR; Fri, 10 Apr 2026 04:57:29 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <john.levon@nutanix.com>)\n id 1wB7g8-0004b0-68\n for qemu-devel@nongnu.org; Fri, 10 Apr 2026 04:57:28 -0400","from mx0a-002c1b01.pphosted.com ([148.163.151.68])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <john.levon@nutanix.com>)\n id 1wB7g6-0003HT-4i\n for qemu-devel@nongnu.org; Fri, 10 Apr 2026 04:57:27 -0400","from pps.filterd (m0127840.ppops.net [127.0.0.1])\n by mx0a-002c1b01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 63A6DD1W2662394; Fri, 10 Apr 2026 01:57:23 -0700","from dm5pr21cu001.outbound.protection.outlook.com\n (mail-centralusazon11021083.outbound.protection.outlook.com [52.101.62.83])\n by mx0a-002c1b01.pphosted.com (PPS) with ESMTPS id 4def2k1re1-1\n (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT);\n Fri, 10 Apr 2026 01:57:23 -0700 (PDT)","from CH2PR02MB6760.namprd02.prod.outlook.com (2603:10b6:610:7f::9)\n by IA1PR02MB9256.namprd02.prod.outlook.com (2603:10b6:208:424::16) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.17; Fri, 10 Apr\n 2026 08:57:21 +0000","from CH2PR02MB6760.namprd02.prod.outlook.com\n ([fe80::dbc1:9766:c58d:4887]) by CH2PR02MB6760.namprd02.prod.outlook.com\n ([fe80::dbc1:9766:c58d:4887%6]) with mapi id 15.20.9769.035; Fri, 10 Apr 2026\n 08:57:21 +0000"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; h=\n cc:content-transfer-encoding:content-type:date:from:in-reply-to\n :message-id:mime-version:references:subject:to; s=\n proofpoint20171006; bh=geXBTcFkUK4cPRoKb8fpHXGO2hmlo/SzoMwzOyCpL\n OI=; b=b4X5DVhTMK44ZFpNZOBYeNC6E7Pk0PnAqRKsHdZw6WyZo9Mn/luj3/+QG\n SeO+M2fJRcOqLwS3V6DD6KIoadAbIxIB7IO5y5oBS3FizMWZYtuyqBZumK0YMnhp\n RKuc3iGDrEtl9CSSuMPW24zZoIoSvt1QQDvA9b27gRSVmTbT6yxOT9xYUI4FITrg\n CoppocwZ6se2nMNX6rDyJf/zpiXHIptCyhlodJpKw+Qu7xQ4I5BHmVyj2GlT0Uob\n oNd+L5ivqHcfmdAxuh0FLTjKpiTOb7PsKcs/og4z/aPyATT9IKqjwZJEEMBRVJk1\n vRfdG98XJGWkx8yZh40z2O1mI8P3w==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=geXBTcFkUK4cPRoKb8fpHXGO2hmlo/SzoMwzOyCpLOI=;\n b=d7Ap2uFJsZxq4eX4MZC9Sy1gqQ08714VSOULFdekExg4lFUYLr/7zLZ7MqS7UQfR1FfA+CwLGRMhvhFAsBQM8cpejrxvHn26zqaPz/PQYu9DVmF3+dqE9N4dA72vCFJRqFlk2x+AAv56vXG1gNyXJhYGo4gf9Mlwi1G47Q7DhQH/lhH+mVZ9hBlYGELiu3nfQFe0Ev2FI8SpDzuvb3dezkcsyoUmXEsf4/ECN8gGrJ0FU+qpqfxSz8ItEsSZyspYd9wZG5uu7QJN/6Nnpv5vQemTI9CC4ghF8afFyc2E9KaiBJJjt17W1u4hLeShTXfvAfNhGhFWCeBdTSbGulyxhg=="],"ARC-Seal":"i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=MNp3Xy9KHwGE+pLq+hj2qQ1EnRaVOXVm4mzjKjbHExgv/B8YOAM0oUqYWXZrKEwGRIUeHqNYW1AMj5PZXzFogmhHL7oZKLJ7KInmSASp71VZW2FeBoDsXEZtf0WvHiuDPapOvD2n0chBdjXSbstxrMkeA5o2nB/D8IielE0QxBTbAXJ2CJEIibgy3bUeiDKv4TZX96y5LZLx4ds3eHAHtAJOP5HK/uR/S4thtaN1FrzG+EsQrmjzIvXTMwx5ZhAkx/1xfENoarzZ0oSYUpYs/ZRcfM44Y2w0jT66Wv6MtdvBNtwRwUTJUJWiYAUZWK7MPbakVk3y5g1ai6Y4kLLYtw==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=geXBTcFkUK4cPRoKb8fpHXGO2hmlo/SzoMwzOyCpLOI=;\n b=WfjKpdtBY7xMk+rnVpAPIF6y8XyvCh1leBqNUWm4bM28TpLoeGfUPoNOC2ZpGHHfOnBL4W2a/3NNNkzcWgGX+2YLRPLLlnE7/NJqbxg5G48jBqKtI4KHjLKuMTZLcZW6zhaXSaGCv79VmfYjCNydGZBv1pQSrnzhHXn0r714yDXGAIbJ3FdaBCFgxvck/zC4dVw6NAQ2RerwwraOv92km5Yg8wc+A8M4yp/SJy5igldn9Yer9qHHkUDnRpL4OQGoO4VgeIvCP+rD+tr9yuSjYCCMfzbwpfMqc7shSRZO8TUb5VQcH89l2TlCtn97Tz2rHJbQbvOb8uke6g5ARVD+vA==","ARC-Authentication-Results":"i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=nutanix.com; dmarc=pass action=none header.from=nutanix.com;\n dkim=pass header.d=nutanix.com; arc=none","From":"John Levon <john.levon@nutanix.com>","To":"qemu-devel@nongnu.org","Cc":"Pierrick Bouvier <pierrick.bouvier@linaro.org>,\n Thanos Makatos <thanos.makatos@nutanix.com>, =?utf-8?q?C=C3=A9dric_Le_Goate?=\n\t=?utf-8?q?r?= <clg@redhat.com>, John Levon <john.levon@nutanix.com>","Subject":"[PATCH v2 1/3] vfio-user: support VFIO_USER_DEVICE_FEATURE","Date":"Fri, 10 Apr 2026 09:57:14 +0100","Message-ID":"<20260410085716.877185-2-john.levon@nutanix.com>","X-Mailer":"git-send-email 2.43.0","In-Reply-To":"<20260410085716.877185-1-john.levon@nutanix.com>","References":"<20260410085716.877185-1-john.levon@nutanix.com>","Content-Transfer-Encoding":"8bit","Content-Type":"text/plain","X-ClientProxiedBy":"LO2P265CA0404.GBRP265.PROD.OUTLOOK.COM\n (2603:10a6:600:f::32) To CH2PR02MB6760.namprd02.prod.outlook.com\n (2603:10b6:610:7f::9)","MIME-Version":"1.0","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"CH2PR02MB6760:EE_|IA1PR02MB9256:EE_","X-MS-Office365-Filtering-Correlation-Id":"a4f9b01a-d38b-4e2f-bdae-08de96df2d35","x-proofpoint-crosstenant":"true","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"BCL:0;\n ARA:13230040|366016|1800799024|376014|18002099003|22082099003|56012099003;","X-Microsoft-Antispam-Message-Info":"\n c49+KgfehcyTtupRzM9K+ZXMWAxkxcz5sk6Vt/2Sy+nPxJh8cMcNX/jt388z0HpvmlB11inEfy+CE+0jlNN9zfSgWq/wYtNHDBHvMpYiPIciQtnuSk8Fe5cVvYAOvCFhCXq+xkj9ycJkNPT1G5HGQPyOUW93O+zoHjnbbRlN9bC6DRxhUX0wNDtswNLw+GbniScbRzuIXzFOUeyvqdZMl9rgjf8xB9PFsBiymZWgSUowas9CHbMQxJE524wTE62tSvBPhPVM2h3s52U3DFHk/pX1E8lU/rYNIT4Hvzd5+7sH8rAhM9cwmuhTM+yD9JsxnlO5eO1cd+43BY7RAy6MdUCm85VdwlAkYfIUuXtTThAwseAqezU7KLWzV8RgKcNlpK3F8W5/ZyL1GvmhpALaiOILrVrvccGmNatkyLEOV+Hj2X3UyIV09DYDw52q6rMRk0cePfJ7D9DHfErqW2WpGvKjBPu+GDGFLMu6aIwsAwCYgpp1nOFkNad/4jMveXybP/TwWbsgxaZwxeZOJKhT82ru05fpyo+ubuh0PQs2bWIpzgq2QfuLi1osIJT3NpPCPvMaKqEWw818nm7YsYcNta0h+YHykIUyixnb+7hdjLiHQVVF1Zmb4kEwB6BsFvoU1dNPrxGVxX+tFwMauwYh+DhtuNzSZMpHGW4eVm+8CxISRNmbZ4MAhR7Rb2b8zBZzsv+2HkVpgAK8E17lyJ4JeJS6dYDgYtR73P8xh7FhVUk=","X-Forefront-Antispam-Report":"CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:CH2PR02MB6760.namprd02.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230040)(366016)(1800799024)(376014)(18002099003)(22082099003)(56012099003);\n DIR:OUT; SFP:1102;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"\n nM+OQQCWpoCzmnQTkIVUOPDHmHrArHdazLzhs1ebV3hSPfXxfEy1o4Gr9P9/pp4lIkPEk/2LKkFhdeuuuB6q0FNA0mrcpdKVY8OmAdRHE3y/MflHtJasl6SzTorBXVU8rYFVmoqFVUz5Tg0olJIXqIkh4qTlf6BdYmAh5D9dZz5CZB5UckvocsX6z3bfYkJG2CPyHtK2tGyC2gxHCFrnXZZk0b8IMgu2hgVNgrYmVIa+w0yhiWFeuHdobxgeZEjVFrC8dFmeHcMXub/wDtYfSEdePXArriVqRij55ZtHTAbAONSOvH3nAtCGO/hDjh+FBdUM2OK/cG0wzHEmOV9yRWNdZl2ccWbteEJKz7TqM6YECYj54bL4mjNUHq2gJI4ElvUUAu+WT279vRFDi6oNxcrmfY7tRj1qoYXwE1V1OAl4tx79Uh6gz+3x5eD1s1ilKNHkd6SMzz5kjEYOUzaorK5sXqiE9Nn74U765y/Z3sXbwQqeZogmpEK7bAhbFXWhetCm8T5IDHdRPqG4fw9K24sImEJPKdWV0mUUFhE1xKTazNWmqxVIDf4WrpoogAXdRktoVymubv61MrCipf0Y2p/WOoHITyAnIE7fJuhzZrItw7egzq1xv9aTcjq0K7iDf1S1iyDNgVg/q+4R/Rr6IqF67KnXzvR2rFUO+VWteM+kvEaxv8w7ZpTzESTA+JBGW7KF5GLDWf43Z4/0h6ho5P3JAO9L/Jola+4tV46I9PEXoFrDYP9GOn6Sw189VKsbCDkrXhRnOaTTPzkWGQNbfIdrLWwAni0mVtVDqKMT7J4c5ig3p62UtKrIhQSERmlhdvEhdm9AO1ZSqDqFPuT2ldTmiAA2b5FwbJpnsEQq8YdBnHuXviNpiqFJhGNLekdEY3xAW2PHa08UtSCiAxBPSGiDSEDEy2/DP4a9TM74w8EviyPmAwg6AOURLhdnAGu8qkpu+t0n5d7pZZI8Te71jQXOvNkDWgFHCdFu80FmZl8i+VtH6o61EsQbjHPb3+5uNzwvDT2GvrryJ7rRlB2h0uQRfh6UVdPMBjgWDpYeP2lTp4bD1bgWQPtesB8Ha1QKNxfEH8QvKSzOG7o8NSbIxCXFBzk1zvtaB3dHj96SgJuCWHPR64FI0l3p6eelb69EPHnToifCQ++bclOtZQFrB99Jwp5ISRc9VgDjPrBAZ1aCCTN4WL+cHxp6B1Khd2w1X5L1aObSZbRcvCCdXh3g5TRJLH5K0iBEI/oNfhO3YuXul4ugXbY5sny7ez70Y6YyWYBo7cAnilXeZm+avBMJORb+UPg0lfMcmTJ8mDF8DgBXBHJxqmSlnRMr6zlEB8K+tQBsrGOlNpt7TjNByT7NzJ2OKd9QZtz7FYv8YbhGYSBzyxuKIldeHCDoGqXz33f0inaLP1+U+Jnd82yYtWq8HsfCtmuKTci/EXtQcUN+HKOweq8D001ahYNvyFm4xiKkAHGWc34Dtq5MwVCJSPfimCjqLbj4u68yORNl42XT8wR5YLLitEjLGNmUe5BCYgwgrujBIlhbqdt9i3uXzANRMknoe/yznXIKd8c/MD/ZYjgs6USv2jAA0BU/xvw0X6RmeuUgdT6pLpRDas5q4nkjaxvZ2UFnBQcNHp3b0wPWPA4KcZYA1c+nTfADtscY7A+2hQy0V5Jyq6govHHzdeGtgSGqutzVJbnvcgT0EHYH6HTJfMrD1ApoNjzIPr9a52UZ1uHVks7VMIgB5GT/4BSBTA==","X-Exchange-RoutingPolicyChecked":"\n YcD6MZSMCONWw8x+BbjvbCs8vtVU7+5wNb6ZTXc7ud9QVhiGoQClBIVVkmdwPUExg0uYpwGnRDgtzLW/JmPbIfj33LZso0MaTzIemMDO8Du+eaec7uXvVSbJcukbAXcjFKJK5rosiDQt1MeUSIqR+huQiJs2TAiynb6qgUYHR2/RQbdgexFufpYVFqTDr+jBwOX0BHsK6MO+Cqhmt45KHKpz4oBxJkzwWDYSfNKRS8kPH8RWWCAfB7xqu6F3M351UkFL3+ONQF+HjxtetKhQ9wLOWdtIP1PQvKewLSM40BRAFhZ0c4WTbLCgflCGh7VCqyK87rOXOaNGiCoU4h6V4Q==","X-OriginatorOrg":"nutanix.com","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n a4f9b01a-d38b-4e2f-bdae-08de96df2d35","X-MS-Exchange-CrossTenant-AuthSource":"CH2PR02MB6760.namprd02.prod.outlook.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"10 Apr 2026 08:57:21.5085 (UTC)","X-MS-Exchange-CrossTenant-FromEntityHeader":"Hosted","X-MS-Exchange-CrossTenant-Id":"bb047546-786f-4de1-bd75-24e5b6f79043","X-MS-Exchange-CrossTenant-MailboxType":"HOSTED","X-MS-Exchange-CrossTenant-UserPrincipalName":"\n zj1bcJsjxxv07c6Cr8UZC7hLao57ZEsZRTwwGq6NCXE2EsDIy4cS7VLl46Orjheiab7vpXxJiiLWcuGeRoE+Lw==","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"IA1PR02MB9256","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDEwMDA4MiBTYWx0ZWRfX8eTD7LIQwxOv\n Jq/SXnVqwnJippXHF69UzxmkNGT8IzFbnjWyvJ/TfxBXDBfK+WgzV/0uduUlyiY+Yws25sI1wC2\n NB1UfP+Ktp4x5YgHMvt0LI8zTYSA9p9/C0wqbEqvj527PfpAKVkyvPWGxEsA87j61WaUVvPdxLQ\n 0/zLhbDaTQR9/aeYls0UYF7i9Q+ADWN8fZPXTeWCuYhVgMj/moM7lXsyR0Ne5gTbsyaymet0GxH\n jxkcyxO0O0ELEfP088T5fShFdcEw5s1nINT0IbnsXP7MpXUrZUOFODLDRqdr6nchDWkPCmU6qfu\n yP+3IXdbJiB0tkqSVLr2+xO8ZbVLsrbrO2OEou5mWGNAIToscokivRorK8b3K55I88dNQRPCvIx\n a1cbKJFTGhJyTAn61jFqrKPcDilETJq6DCfpc0cGl3AMWjZVdo9fHyIGQIply3Ty0MKHx2UbgE6\n a5hkXwkgxm5iG15DZ6A==","X-Proofpoint-ORIG-GUID":"Av4Mngm7XN31zF3rFlykTrzmNoS94q4l","X-Authority-Analysis":"v=2.4 cv=fKgJG5ae c=1 sm=1 tr=0 ts=69d8bb73 cx=c_pps\n a=f6P8eh4LYcQUHlEOLA+94w==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19\n a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19\n a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=0kUYKlekyDsA:10\n a=VkNPw1HP01LnGYTKEx00:22 a=VofLwUrZ8Iiv6rRUPXIb:22 a=_-M8LpHI31CeLmyZm6wg:22\n a=64Cc0HZtAAAA:8 a=P6-GAGG-IN1-BGcB38EA:9","X-Proofpoint-GUID":"Av4Mngm7XN31zF3rFlykTrzmNoS94q4l","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-10_02,2026-04-09_02,2025-10-01_01","X-Proofpoint-Spam-Reason":"safe","Received-SPF":"pass client-ip=148.163.151.68;\n envelope-from=john.levon@nutanix.com; helo=mx0a-002c1b01.pphosted.com","X-Spam_score_int":"-32","X-Spam_score":"-3.3","X-Spam_bar":"---","X-Spam_report":"(-3.3 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.54,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001,\n RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"Plumb through vfio_device_get_feature to the vfio-user server. Note that\nwe translate EINVAL into ENOTTY, as the existing generic vfio code is\nexpecting the latter to mean \"unsupported\".\n\nAs part of adding a trace point, clean up the trace file.\n\nSigned-off-by: John Levon <john.levon@nutanix.com>\n---\n hw/vfio-user/protocol.h   | 12 +++++++++++\n hw/vfio-user/device.c     | 42 +++++++++++++++++++++++++++++++++++++++\n hw/vfio-user/trace-events | 23 +++++++++++----------\n 3 files changed, 67 insertions(+), 10 deletions(-)","diff":"diff --git a/hw/vfio-user/protocol.h b/hw/vfio-user/protocol.h\nindex 3249a4a6b6..2a0c31e7c5 100644\n--- a/hw/vfio-user/protocol.h\n+++ b/hw/vfio-user/protocol.h\n@@ -40,6 +40,7 @@ enum vfio_user_command {\n     VFIO_USER_DEVICE_RESET              = 13,\n     VFIO_USER_DIRTY_PAGES               = 14,\n     VFIO_USER_REGION_WRITE_MULTI        = 15,\n+    VFIO_USER_DEVICE_FEATURE            = 16,\n     VFIO_USER_MAX,\n };\n \n@@ -239,4 +240,15 @@ typedef struct {\n     VFIOUserWROne wrs[VFIO_USER_MULTI_MAX];\n } VFIOUserWRMulti;\n \n+/*\n+ * VFIO_USER_DEVICE_FEATURE\n+ * imported from struct vfio_device_feature\n+ */\n+typedef struct {\n+    VFIOUserHdr hdr;\n+    uint32_t argsz;\n+    uint32_t flags;\n+    char data[];\n+} VFIOUserDeviceFeature;\n+\n #endif /* VFIO_USER_PROTOCOL_H */\ndiff --git a/hw/vfio-user/device.c b/hw/vfio-user/device.c\nindex 64ef35b320..b8d2b7c1a8 100644\n--- a/hw/vfio-user/device.c\n+++ b/hw/vfio-user/device.c\n@@ -74,6 +74,47 @@ void vfio_user_device_reset(VFIOUserProxy *proxy)\n     }\n }\n \n+static int\n+vfio_user_device_io_device_feature(VFIODevice *vbasedev,\n+                                   struct vfio_device_feature *feature)\n+{\n+    g_autofree VFIOUserDeviceFeature *msgp = NULL;\n+    int size = sizeof(VFIOUserHdr) + feature->argsz;\n+    VFIOUserProxy *proxy = vbasedev->proxy;\n+    Error *local_err = NULL;\n+\n+    msgp = g_malloc0(size);\n+\n+    vfio_user_request_msg(&msgp->hdr, VFIO_USER_DEVICE_FEATURE, size, 0);\n+\n+    memcpy(&msgp->argsz, &feature->argsz, feature->argsz);\n+\n+    if (!vfio_user_send_wait(proxy, &msgp->hdr, NULL, size, &local_err)) {\n+        error_prepend(&local_err, \"%s: \", __func__);\n+        error_report_err(local_err);\n+        return -EFAULT;\n+    }\n+\n+    if (msgp->hdr.flags & VFIO_USER_ERROR) {\n+        /*\n+         * Client expects ENOTTY for \"not supported\", but the protocol may\n+         * return EINVAL (which should only occur in the case the feature isn't\n+         * actually supported on the server).\n+         */\n+        if (msgp->hdr.error_reply == EINVAL) {\n+            return -ENOTTY;\n+        }\n+\n+        return -msgp->hdr.error_reply;\n+    }\n+\n+    memcpy(feature, &msgp->argsz, feature->argsz);\n+\n+    trace_vfio_user_device_io_device_feature(msgp->argsz, msgp->flags);\n+\n+    return 0;\n+}\n+\n static int vfio_user_get_region_info(VFIOUserProxy *proxy,\n                                      struct vfio_region_info *info,\n                                      VFIOUserFDs *fds)\n@@ -432,6 +473,7 @@ static int vfio_user_device_io_region_write(VFIODevice *vbasedev, uint8_t index,\n  * Socket-based io_ops\n  */\n VFIODeviceIOOps vfio_user_device_io_ops_sock = {\n+    .device_feature = vfio_user_device_io_device_feature,\n     .get_region_info = vfio_user_device_io_get_region_info,\n     .get_irq_info = vfio_user_device_io_get_irq_info,\n     .set_irqs = vfio_user_device_io_set_irqs,\ndiff --git a/hw/vfio-user/trace-events b/hw/vfio-user/trace-events\nindex abb67f4c11..503e1c82d4 100644\n--- a/hw/vfio-user/trace-events\n+++ b/hw/vfio-user/trace-events\n@@ -2,19 +2,22 @@\n #\n # SPDX-License-Identifier: GPL-2.0-or-later\n \n-# common.c\n+# container.c\n+vfio_user_dma_map(uint64_t iova, uint64_t size, uint64_t off, uint32_t flags, bool async_ops) \" iova 0x%\"PRIx64\" size 0x%\"PRIx64\" off 0x%\"PRIx64\" flags 0x%x async_ops %d\"\n+vfio_user_dma_unmap(uint64_t iova, uint64_t size, uint32_t flags,  bool async_ops) \" iova 0x%\"PRIx64\" size 0x%\"PRIx64\" flags 0x%x async_ops %d\"\n+\n+# device.c\n+vfio_user_device_io_device_feature(uint32_t argsz, uint32_t flags) \" argsz 0x%x flags 0x%x\"\n+vfio_user_get_info(uint32_t nregions, uint32_t nirqs) \" #regions %d #irqs %d\"\n+vfio_user_get_irq_info(uint32_t index, uint32_t flags, uint32_t count) \" index %d flags 0x%x count %d\"\n+vfio_user_set_irqs(uint32_t index, uint32_t start, uint32_t count, uint32_t flags) \" index %d start %d count %d flags 0x%x\"\n+vfio_user_get_region_info(uint32_t index, uint32_t flags, uint64_t size) \" index %d flags 0x%x size 0x%\"PRIx64\n+vfio_user_region_rw(uint32_t region, uint64_t off, uint32_t count) \" region %d offset 0x%\"PRIx64\" count %d\"\n+\n+# proxy.c\n vfio_user_recv_hdr(const char *name, uint16_t id, uint16_t cmd, uint32_t size, uint32_t flags) \" (%s) id 0x%x cmd 0x%x size 0x%x flags 0x%x\"\n vfio_user_recv_read(uint16_t id, int read) \" id 0x%x read 0x%x\"\n vfio_user_recv_request(uint16_t cmd) \" command 0x%x\"\n vfio_user_send_write(uint16_t id, int wrote) \" id 0x%x wrote 0x%x\"\n vfio_user_version(uint16_t major, uint16_t minor, const char *caps) \" major %d minor %d caps: %s\"\n-vfio_user_get_info(uint32_t nregions, uint32_t nirqs) \" #regions %d #irqs %d\"\n-vfio_user_get_region_info(uint32_t index, uint32_t flags, uint64_t size) \" index %d flags 0x%x size 0x%\"PRIx64\n-vfio_user_region_rw(uint32_t region, uint64_t off, uint32_t count) \" region %d offset 0x%\"PRIx64\" count %d\"\n-vfio_user_get_irq_info(uint32_t index, uint32_t flags, uint32_t count) \" index %d flags 0x%x count %d\"\n-vfio_user_set_irqs(uint32_t index, uint32_t start, uint32_t count, uint32_t flags) \" index %d start %d count %d flags 0x%x\"\n vfio_user_wrmulti(const char *s, uint64_t wr_cnt) \" %s count 0x%\"PRIx64\n-\n-# container.c\n-vfio_user_dma_map(uint64_t iova, uint64_t size, uint64_t off, uint32_t flags, bool async_ops) \" iova 0x%\"PRIx64\" size 0x%\"PRIx64\" off 0x%\"PRIx64\" flags 0x%x async_ops %d\"\n-vfio_user_dma_unmap(uint64_t iova, uint64_t size, uint32_t flags,  bool async_ops) \" iova 0x%\"PRIx64\" size 0x%\"PRIx64\" flags 0x%x async_ops %d\"\n","prefixes":["v2","1/3"]}