get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.2/patches/2221383/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2221383,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/2221383/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260409104756.465294-2-john.levon@nutanix.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.2/projects/14/?format=api",
        "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": "<20260409104756.465294-2-john.levon@nutanix.com>",
    "list_archive_url": null,
    "date": "2026-04-09T10:47:54",
    "name": "[1/3] vfio-user: support VFIO_USER_DEVICE_FEATURE",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "751782cd2b47b201df8a55655a76502ca741fe1c",
    "submitter": {
        "id": 80631,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/80631/?format=api",
        "name": "John Levon",
        "email": "john.levon@nutanix.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260409104756.465294-2-john.levon@nutanix.com/mbox/",
    "series": [
        {
            "id": 499273,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/499273/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=499273",
            "date": "2026-04-09T10:47:53",
            "name": "vfio-user fixes",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/499273/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2221383/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2221383/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=LYrFWWU9;\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=A1cdbkRI;\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 4frxWK3BSqz1xy1\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 20:49:01 +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 1wAmvt-0006ID-Bn; Thu, 09 Apr 2026 06:48:21 -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 1wAmvg-00061c-Gu\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 06:48:10 -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 1wAmvd-0006Rh-Vr\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 06:48:08 -0400",
            "from pps.filterd (m0127839.ppops.net [127.0.0.1])\n by mx0a-002c1b01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 6397XvLU3824063; Thu, 9 Apr 2026 03:48:03 -0700",
            "from ph0pr06cu001.outbound.protection.outlook.com\n (mail-westus3azon11021095.outbound.protection.outlook.com [40.107.208.95])\n by mx0a-002c1b01.pphosted.com (PPS) with ESMTPS id 4ddutasxq7-1\n (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT);\n Thu, 09 Apr 2026 03:48:03 -0700 (PDT)",
            "from CH2PR02MB6760.namprd02.prod.outlook.com (2603:10b6:610:7f::9)\n by SJ0PR02MB7597.namprd02.prod.outlook.com (2603:10b6:a03:319::8) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.17; Thu, 9 Apr\n 2026 10:48:02 +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; Thu, 9 Apr 2026\n 10:48:01 +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=7WwzSZpm59dDZGQ5wct/YP9hJmQL2sowM3tOrdwWw\n Hg=; b=LYrFWWU9TM6toeCyf9hqOXk5RrglwAoIl31c7KgdOCRoT8pGtizLeg6a/\n hWW6IhWopLaxrmzIZrk+2UpUwbhMf6j0uXkkKYYXiklYMrgRAmsjzmjHRwWrmBEy\n eLkhzOQDhg9UeHS5dy67KX+OHwDp+VBSz0FUh9znhLIEddtH7sNI8U5/byREIt1W\n UG5LEF5D8FfCN6Xp/U9+POncYR0Io9fpxILcw6HyWEq+rmIxsk0SjBKKv/RzqzJm\n dHMT2RgzxXFzOT8JBOAx9zjgAR/sdUTZ0vv7Xp1eHnWrmlPyH9tIpnj7Rv4XAKqX\n cPChAYFuY1f1jvGGASOwNdzsuvxJQ==",
            "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=7WwzSZpm59dDZGQ5wct/YP9hJmQL2sowM3tOrdwWwHg=;\n b=A1cdbkRIW8juO+1Gwsap48jSjfha8W/OLskseolRdG1omrekqh3e75GOdx/dbckp7y8v9b6R7xWpXVuDnVaOr7XW/hExliQLWkpak9XXetratNs3RNPxcH3o0xHkLRBf5btJneBCUwhVoN4TPT0mk1nb8KfVJwiRye+kZxl0BrhbNpQs77tMrqP1kfg7NCR3c41lw9ay+2XM28nAn9c7hrlnTHgpVAUUiQfKZi8rzwLWpbuDtnaU/BKBb/sBUXMzcOZb5x6SRoIen4L/cnjLJC4hYv7DCeLfJN2X92xsufmJZaefpiUt3AetdFh77dT0FquQ15Xwxu8lNo3iYEJ60g=="
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=mHZEEQoGsMRLiAzrZX/H1neULiGLTJYJ7r76s+0mBXzHjh5fhVXgf1q3cIdpgmSpkNfITw/dHQU+2vbChqw3vNtjSd8+vzrv3Rx58kJ2lRoQ/4h824e6Q8+gQDB1BaXuNr6PaogYhibtkZ8lvQAdELrhN2i93K4WxbLkwpk7HMDxKanaZDNGBfoazE/0Qc9RwT4xdZmCiwFQVxBj5Lmb/UeyQlf/n8v1O7A+BcFMl4/woZFGCFmBZwm30k0km8DbgZDX4pvyc6GL4olwM8nRGR/w4fczCqtyN5CHgwzjhJYZuhOvfp8aDeJVyudLy2Pc0l9uPMjFIog7KCCXV0bN/Q==",
        "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=7WwzSZpm59dDZGQ5wct/YP9hJmQL2sowM3tOrdwWwHg=;\n b=KMTB0gLFvVb8KR/8ow9f4CXyPVb3o7cO6HNFe0tRIJovHFx3GmzLF0mDWQgFok4PGshZbqZJrTZmyBrRWbjHeWMzI3zyfxklNEsupp/mAEDl/DMrb/ZLntVCGEK9i02ouNu/U/oJER2OBIA3vIVow6OzTDxAM4VyRLECegbBuAT4E8AKgf8XPpCMKTMHoLsBdPg5AAngyl/OzF9EC1qrv3ENjpFII9sD64Tnwz9fzL4na0nK3HymDDuQZSEFqgdPX7rcs4wdpI91Bfn70nUWrPCPKXKelduIJ81/3+nLSDadXXc4hQfAiS71UFsjjg2BNWYcZLJl99oSJlGdEmpgFw==",
        "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": "Thanos Makatos <thanos.makatos@nutanix.com>,\n Pierrick Bouvier <pierrick.bouvier@linaro.org>, =?utf-8?q?C=C3=A9dric_Le_Go?=\n\t=?utf-8?q?ater?= <clg@redhat.com>, John Levon <john.levon@nutanix.com>",
        "Subject": "[PATCH 1/3] vfio-user: support VFIO_USER_DEVICE_FEATURE",
        "Date": "Thu,  9 Apr 2026 11:47:54 +0100",
        "Message-ID": "<20260409104756.465294-2-john.levon@nutanix.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20260409104756.465294-1-john.levon@nutanix.com>",
        "References": "<20260409104756.465294-1-john.levon@nutanix.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "LO2P123CA0057.GBRP123.PROD.OUTLOOK.COM\n (2603:10a6:600:1::21) 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_|SJ0PR02MB7597:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "54199af5-e850-4359-effd-08de9625787b",
        "x-proofpoint-crosstenant": "true",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;\n ARA:13230040|366016|376014|1800799024|22082099003|18002099003|56012099003;",
        "X-Microsoft-Antispam-Message-Info": "\n ryECLaGA52H0+GKm3iex0iYMGHAOjUtgn5PiCpUMMQxifN66uUK3+BodaUVzA2qK7Bf20w2lc1rk6HpiMAg6ychOWIb0Ld+ycZo2eRC9JRsoIZTKfsT573JxOZyA2lGqXBLdsrWctKznHl0EXaLsS2tCGTjnp9fxuPJG6BRCUwC6Gv6bFnHdh/tV1tjc8k+C2y7LyFXeegiSZgPbdsRgIKKVh0Aerlk/DDZTtnZe2qklfKwqPjoi46I8w35tYkZd9cX62JPZxJ2cO3A9qmOZFQ9fHCT31eh3iKiMqOouAVxN7m4nOTLv4bsy6oe9JiKqbjw9PTSdQWk/Sz943SmwbbsxzZN5krpf4UbFYQAv2h7RE28gUc6O2v1Iy4USFHH8OR4mUEM5iEH29ULM0d/QlCGnwa27XMELAbtseiZFxEpvuMTXGlg0Rlz/1P5Sc9Gh/E9BGJQDrwbghurk6LGwMbjejPYoZw3FzBspM/p4smLIbT5Zs/spy+s7mQjV9r/BFjd0Vp5L4rPYwkpv6o6sfYIaVmB7REzFFVTg/ZZEGmw3Pq4rWU7STA2DG7TerwEFr9du8UGD6nhDNSR46T08oFZIWtTg9MI56c0ExITsIe8RcBHcYgs9Fhy5rjhe3NkB+xKq1j8aqq/V0p1BsEclweU+XGhL0t9aC7/R3mNN52l8narb/18RFczT7XNpGfU28cE/iot+ldCLmQwzI8DgXZFrAb98jbFcjXrJ4k3yRwc=",
        "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)(376014)(1800799024)(22082099003)(18002099003)(56012099003);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n bleZe9ToNGDL9Gff+YfBpCZtgib17bLY+dasuxt0vPfNMQl+tZIw0BOXExcNwFlxPYGCyoPsUT76N8jtObnn//R4ahGgzuXqkGRGCa8LwCH6e0mAN9eLy5hQhCkY881funSnb2ksziiUPt2iYwevTbgejjoc+hhMNUKkxGfYPsjeNiPk0lrIZo/Pd/y+l4BIDIa2SqG3mrWEkC2SuPygDjSs/wpmhdiqMogYpVgqSzu9KOVtvn9ceJCJlo7L4Z5Hd6R7RO8uWgxKFnp67Is7VAlr2Zj4u78hqxsWB5Z4kTgEOffUTlA/sh0CnBEQBFARtN00yvGMBTk0++K49CY+ySiHVwyy/mn766Ed5Thy/K4QNveQegyQsEJcmKh/Iu+KqYztd4cXgvU1PK4JEe7WAgxdhsahd8m2hkFMuqEA8hbKNN1qxD+9bgI1WP15aOB8zuMSJ9NqW1dClXFmX5JzI19mQTdos6D19ZxemlQxPttcry0t/4DuzTe6YsK4+V7wT66ayrmn1xfnsaiu4mOxI3SPkA9bl7na+yE91fzHXqrh6M29+5xr9zj0b7Y9Gez/mySghgGHXPH5nCGH6Vz8ndp58kQ8nZvmYOLpZ7p+9hITEkGJ7Ox3Mc2tktG5FzzdYwXHVZvRVHRa3t6TZy5nxWeiYMdFggNUuKUD8TI6GEny+8OzPa7V++ujzzaD7vpJixavSlibpt3GuPEhwD6JkqKdRMBQSpVdneFgc6wZn8Oz0WD1VXg7Xy9snA4Zcx4jGVnaPPmTTDTKp0df3n44MGRQh+xKKCSHhz3L+i6EGvA3WXl2ysipN+fONMLkclKMsNkE6nGsfxRnxAjEnytCu6tKovgexrx/6YiBUNToJJYLL5Xo/TCzVLXo0sq7EmeM7Y7683iKh6gkN9DoAeAMDJI5cbWrAwz4EORg2ZR/6XNzYV+3S1NIAbnqa76d9bm+PYGjlp+dA08TltdFKj/d9nL7oyk7P19jE/s0E5cYlIKctr+GqvHSyS37H8Xy8yZVPFdxlDmxCUAbw5KDq7OljI1NGBQKgDteBtgQb833V80P18oRYf0w4EE3ZTFDEYNwqVp2cIEOPopO2W440/sfFvFJwRFgkYW6iPWIlXii+xxaT3HlE1CQFTwU2JI9r4enH1pEIQ4cYufJBVvBrM99SIgjjRhcihKV+1qfrX0xcZP9W1cO6ekX1pM11ba5Ron9WZDP6FbJFwyAMaSRZXEELGyKq/bfKr33zhVMzEfWDLDYnBUthjQq4EmfUQEcVMzwUntmyzXqX8AIEBDAFJRf3HZQOSUXsh+/rXJFZbRv5NThSeFhPp0hurTT7px4bOSg2YrzlpeIE/SgZnbbvsh7c+eFxgJY4A7+4GMsHBaf/lTN3Pe7y9vUxgcudb0uWUsAJ+aV13iB34kJ70T53cOqdUGgZDGL70yot3v3gKI/L47uNXtZs38b8btEwMJZHS5NBReaanMfbUhdkz6k7QV4PTLSXF6iAYmYXMfWsk9hZDBZSql7g6ykGUotDuOk5hLIse3tBepo1DDBY9b4vk/aOqzB+itDtXNVm6Dmdu3MqYbJjV9vXsWkQc1qQaqlIiM3YQhn3E85M1MkanBHnsXpAbZVLMxCphma8hxvstEyWcfoJt4ktamJXhKice5zkuR2qvQAcAE/FkZSl2fyFosR4T8Vp2KGpJ+WDKYDqLD2FfTssotjXKB3NXxMtMi9ed90v1P+ke+foAvjBLQDyzQWYg==",
        "X-Exchange-RoutingPolicyChecked": "\n Z3EcrduOlz+K0Z+DN1Dyx0F/EvIQ8iOcZwq4izatcR6pHehjoQO7suTsJYQYw/JW4eBjk+WxfJfIPWt0cYIY00FvYYUuAw7jga85mBhZvl6pzZhpxPd9XDWYjjrajBRzmlz0h8ZiJRXznbvaU1d5drq2qoNT6hsJW2hC83NLP6RNYLZFj47Kf/hTxVgzddi8vWKuc1vfoGnky+olKJlV+NaDNWiSLpQWZgZ9LdCuebaYYbfp/qhld/CIe5MElgG9zQz5670wVz5FJbfWDUJzAQUl/REv0nWuXhWDuJik2JTxaT5put/AnQk35hq54yTo5GyNiZGXbzHVAPMbuwXR/w==",
        "X-OriginatorOrg": "nutanix.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 54199af5-e850-4359-effd-08de9625787b",
        "X-MS-Exchange-CrossTenant-AuthSource": "CH2PR02MB6760.namprd02.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "09 Apr 2026 10:48:01.7014 (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 7QSDROtUJJnFxI1QL5UZri4NFTRtdx7CtAT/uwLYsme7FJdW4pB6i4Ry8YOInaRRmfwfeSRZf/kwk1sAEZLFMA==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SJ0PR02MB7597",
        "X-Authority-Analysis": "v=2.4 cv=StugLvO0 c=1 sm=1 tr=0 ts=69d783e3 cx=c_pps\n a=skfC1x1gg3P3nT2FkZteTA==: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=y4UcunY2MAxhM4LwGdWI:22\n a=64Cc0HZtAAAA:8 a=P6-GAGG-IN1-BGcB38EA:9",
        "X-Proofpoint-GUID": "tkOwU5iIe7bveukNs1low5SC5V8FPxhP",
        "X-Proofpoint-ORIG-GUID": "tkOwU5iIe7bveukNs1low5SC5V8FPxhP",
        "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwNDA5MDA5NyBTYWx0ZWRfX0h3lllCfzEwf\n O0q3Dik843VZQUA00vvVJ9LGMAvFN13BSspd60IgiLUH8M65FJ5JgeIzDh4ajt7kWfwkysHFrY6\n Rrm3HR39LM64GhCKhVFRvteYtULTPENa3+qzIkGt2rsYcIU3SU21U4WwD1e8wsR8UH/jJvnK6K3\n ffCnufO5N1ljpa7KEwl41UP23/8y0weUtU7IaOAEaIrZO4deVqUAu5ySjD/T6zGL5Pm16tIq8XR\n Ly0/bVmZF4/ITIW7SxpH7Ny0rkCsxmeBQCeC4WM+1cHSVt6jeQIGeaIz2DZNCKQ/3aGyep8g4Ak\n tE/8954oiaGNj61pGtoGBvUonErgHKBoJvOK1QjI0m7Ury821AAFmqVbeDJaEIYhSXIaI4XYSmP\n Fx5P4J8EFoUgwjALmMFAEIkSuKhA61Lbcoznlxrb7JCuJVWFs5UUcYJXUe6uFHcgJqZYmzHwCvY\n 2BuUQb8C6NzcdGm5Omw==",
        "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-09_03,2026-04-09_01,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..84714781cf 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);\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": [
        "1/3"
    ]
}