get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2196981,
    "url": "http://patchwork.ozlabs.org/api/patches/2196981/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260216191213.2556073-19-dmitry.osipenko@collabora.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/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": "<20260216191213.2556073-19-dmitry.osipenko@collabora.com>",
    "list_archive_url": null,
    "date": "2026-02-16T19:12:13",
    "name": "[v17,18/18] virtio-gpu: Support mapping hostmem blobs with map_fixed",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "d71a8cd23efd8550d8562fc02b00bf1c18fe5e11",
    "submitter": {
        "id": 83453,
        "url": "http://patchwork.ozlabs.org/api/people/83453/?format=api",
        "name": "Dmitry Osipenko",
        "email": "dmitry.osipenko@collabora.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260216191213.2556073-19-dmitry.osipenko@collabora.com/mbox/",
    "series": [
        {
            "id": 492344,
            "url": "http://patchwork.ozlabs.org/api/series/492344/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=492344",
            "date": "2026-02-16T19:11:55",
            "name": "Support virtio-gpu DRM native context and MAP_FIXED API",
            "version": 17,
            "mbox": "http://patchwork.ozlabs.org/series/492344/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2196981/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2196981/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 (1024-bit key;\n unprotected) header.d=collabora.com header.i=dmitry.osipenko@collabora.com\n header.a=rsa-sha256 header.s=zohomail header.b=dL4GGhuI;\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 (lists.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 4fFCF11S4pz1xtN\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 17 Feb 2026 06:16:37 +1100 (AEDT)",
            "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 1vs43q-0001lC-Q4; Mon, 16 Feb 2026 14:15:15 -0500",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <dmitry.osipenko@collabora.com>)\n id 1vs43b-0001cb-Ex\n for qemu-devel@nongnu.org; Mon, 16 Feb 2026 14:14:57 -0500",
            "from sender4-pp-f112.zoho.com ([136.143.188.112])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <dmitry.osipenko@collabora.com>)\n id 1vs43Z-0003eW-Io\n for qemu-devel@nongnu.org; Mon, 16 Feb 2026 14:14:55 -0500",
            "by mx.zohomail.com with SMTPS id 1771269275839527.6168215559057;\n Mon, 16 Feb 2026 11:14:35 -0800 (PST)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; t=1771269278; cv=none;\n d=zohomail.com; s=zohoarc;\n b=ZKVacDiNmUjWYqsoBa6S0BwQ6kaw/llYJd2s2rOSL65p4d06NGnONvpyXP2aI3PNKJv/wR4qYggWHt53islcPp7UrYAV/H/8/6jViV4x/xu8afdnJUu2V9Jr3yzDu3N2IP+lHxPaJToylUDnMjB80ce3FuJdZ6jzSsGqNXcch8M=",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com;\n s=zohoarc; t=1771269278;\n h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To;\n bh=f33EyM850Pwg8IoPfEFrVAH8hkLh8qSKlEOC99ZgHrc=;\n b=oFkOcCnbfkTFXPyMRsuaqgpj8+N1dqYuYg/8tpWyMwF5vaKL986qQsqD12Qzblhhp6nXzYfY5WK3R++7UbTtpdZYu5osxEI2SjnfKUddTrUBJRqUyPAV39o5z+szlrnYgy7W/n/KLWh/MBZ2V1lysjNMLocH45I6ZWH+82QaDok=",
        "ARC-Authentication-Results": "i=1; mx.zohomail.com;\n dkim=pass  header.i=collabora.com;\n spf=pass  smtp.mailfrom=dmitry.osipenko@collabora.com;\n dmarc=pass header.from=<dmitry.osipenko@collabora.com>",
        "DKIM-Signature": "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1771269278;\n s=zohomail; d=collabora.com; i=dmitry.osipenko@collabora.com;\n h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To;\n bh=f33EyM850Pwg8IoPfEFrVAH8hkLh8qSKlEOC99ZgHrc=;\n b=dL4GGhuIHzUz29iJqMxaLVm9scnFy6Jizsu6MbPVNPt6i78ysMeVmLQKaYpK1fEV\n 1xjrj1CcYAOtp0pHCxCYPbrXA9V8IQ3+yV/ZpOuoR7W6xGwflWja1rbrJP0wc3VQWix\n GSzWsKA+9q2UjH/KFPDALXCtMqrkXHS86ahKeS5I=",
        "From": "Dmitry Osipenko <dmitry.osipenko@collabora.com>",
        "To": "Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>,\n Huang Rui <ray.huang@amd.com>,\n =?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n\t=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>,\n Gerd Hoffmann <kraxel@redhat.com>,\n =?utf-8?q?Alex_Benn=C3=A9e?= <alex.bennee@linaro.org>,\n Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>,\n \"Michael S . Tsirkin\" <mst@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>,\n Yiwei Zhang <zzyiwei@gmail.com>, Sergio Lopez Pascual <slp@redhat.com>",
        "Cc": "Gert Wollny <gert.wollny@collabora.com>, qemu-devel@nongnu.org,\n Gurchetan Singh <gurchetansingh@chromium.org>, Alyssa Ross <hi@alyssa.is>,\n\t=?utf-8?q?Roger_Pau_Monn=C3=A9?= <roger.pau@citrix.com>,\n Alex Deucher <alexander.deucher@amd.com>,\n Stefano Stabellini <stefano.stabellini@amd.com>, =?utf-8?q?Christian_K?=\n\t=?utf-8?q?=C3=B6nig?= <christian.koenig@amd.com>,\n Xenia Ragiadakou <xenia.ragiadakou@amd.com>,\n Honglei Huang <honglei1.huang@amd.com>, Julia Zhang <julia.zhang@amd.com>,\n Chen Jiqian <Jiqian.Chen@amd.com>, Rob Clark <robdclark@gmail.com>,\n Robert Beckett <bob.beckett@collabora.com>",
        "Subject": "[PATCH v17 18/18] virtio-gpu: Support mapping hostmem blobs with\n map_fixed",
        "Date": "Mon, 16 Feb 2026 22:12:13 +0300",
        "Message-ID": "<20260216191213.2556073-19-dmitry.osipenko@collabora.com>",
        "X-Mailer": "git-send-email 2.52.0",
        "In-Reply-To": "<20260216191213.2556073-1-dmitry.osipenko@collabora.com>",
        "References": "<20260216191213.2556073-1-dmitry.osipenko@collabora.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-ZohoMailClient": "External",
        "Received-SPF": "pass client-ip=136.143.188.112;\n envelope-from=dmitry.osipenko@collabora.com; helo=sender4-pp-f112.zoho.com",
        "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, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_NONE=0.001, 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": "Support mapping virgl blobs to a fixed location of a hostmem memory\nregion using new virglrenderer MAP_FIXED API.\n\nThis new feature closes multiple problems for virtio-gpu on QEMU:\n\n- Having dedicated memory region for each mapped blob works notoriously\nslow due to QEMU's memory region software design built around RCU that\nisn't optimized for frequent removal of the regions\n\n- KVM isn't optimized for a frequent slot changes too\n\n- QEMU/KVM has a limit for a total number of created memory regions,\ncrashing QEMU when limit is reached\n\nThis patch makes virtio-gpu-gl to pre-create a single anonymous memory\nregion covering whole hostmem area to which blobs will be mapped using\nthe MAP_FIXED API.\n\nNot all virgl resources will support mapping at a fixed memory address. For\nthem, we will continue to create individual nested memory sub-regions. In\nparticular, vrend resources may not have MAP_FIXED capability.\n\nVenus and DRM native contexts will largely benefit from the MAP_FIXED\nfeature in terms of performance and stability improvement.\n\nTested-by: Yiwei Zhang <zzyiwei@gmail.com>\nSigned-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>\n---\n hw/display/virtio-gpu-gl.c     | 40 ++++++++++++++++++++++-\n hw/display/virtio-gpu-virgl.c  | 59 +++++++++++++++++++++++++++++++++-\n include/hw/virtio/virtio-gpu.h |  3 ++\n 3 files changed, 100 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/hw/display/virtio-gpu-gl.c b/hw/display/virtio-gpu-gl.c\nindex 8b71dd6fc26f..48eeea32547c 100644\n--- a/hw/display/virtio-gpu-gl.c\n+++ b/hw/display/virtio-gpu-gl.c\n@@ -13,6 +13,7 @@\n \n #include \"qemu/osdep.h\"\n #include \"qemu/iov.h\"\n+#include \"qemu/mmap-alloc.h\"\n #include \"qemu/module.h\"\n #include \"qemu/error-report.h\"\n #include \"qapi/error.h\"\n@@ -106,7 +107,12 @@ static void virtio_gpu_gl_reset(VirtIODevice *vdev)\n static void virtio_gpu_gl_device_realize(DeviceState *qdev, Error **errp)\n {\n     ERRP_GUARD();\n-    VirtIOGPU *g = VIRTIO_GPU(qdev);\n+    VirtIOGPUBase *b = VIRTIO_GPU_BASE(qdev);\n+    VirtIOGPU *g = VIRTIO_GPU(b);\n+#if !defined(CONFIG_WIN32)\n+    VirtIOGPUGL *gl = VIRTIO_GPU_GL(g);\n+    void *map;\n+#endif\n \n #if HOST_BIG_ENDIAN\n     error_setg(errp, \"virgl is not supported on bigendian platforms\");\n@@ -136,7 +142,28 @@ static void virtio_gpu_gl_device_realize(DeviceState *qdev, Error **errp)\n     g->parent_obj.conf.flags |= 1 << VIRTIO_GPU_FLAG_CONTEXT_INIT_ENABLED;\n #endif\n \n+#if !defined(CONFIG_WIN32)\n+    if (virtio_gpu_hostmem_enabled(b->conf)) {\n+        map = qemu_ram_mmap(-1, b->conf.hostmem, qemu_real_host_page_size(),\n+                            0, 0);\n+        if (map == MAP_FAILED) {\n+            error_setg_errno(errp, errno,\n+                             \"virgl hostmem region could not be initialized\");\n+            return;\n+        }\n+\n+        gl->hostmem_mmap = map;\n+        memory_region_init_ram_ptr(&gl->hostmem_background, NULL,\n+                                   \"hostmem-background\", b->conf.hostmem,\n+                                   gl->hostmem_mmap);\n+        memory_region_add_subregion(&b->hostmem, 0, &gl->hostmem_background);\n+    }\n+#endif\n+\n     virtio_gpu_device_realize(qdev, errp);\n+    if (*errp) {\n+        return;\n+    }\n }\n \n static const Property virtio_gpu_gl_properties[] = {\n@@ -172,6 +199,17 @@ static void virtio_gpu_gl_device_unrealize(DeviceState *qdev)\n     gl->renderer_state = RS_START;\n \n     g_array_unref(g->capset_ids);\n+\n+    /*\n+     * It is not guaranteed that the memory region will be finalized\n+     * immediately with memory_region_del_subregion(), there can be\n+     * a remaining reference to gl->hostmem_mmap. VirtIO-GPU is not\n+     * hotpluggable, hence no need to worry about the leaked mapping.\n+     *\n+     * The memory_region_del_subregion(gl->hostmem_background) is unnecessary\n+     * because b->hostmem  and gl->hostmem_background belong to the same\n+     * device and will be gone at the same time.\n+     */\n }\n \n static void virtio_gpu_gl_class_init(ObjectClass *klass, const void *data)\ndiff --git a/hw/display/virtio-gpu-virgl.c b/hw/display/virtio-gpu-virgl.c\nindex 3f77946c7a3a..093ab8942805 100644\n--- a/hw/display/virtio-gpu-virgl.c\n+++ b/hw/display/virtio-gpu-virgl.c\n@@ -41,9 +41,13 @@\n      VIRGL_VERSION_MICRO >= (micro))\n #endif\n \n+#define VIRGL_HAS_MAP_FIXED \\\n+    (VIRGL_CHECK_VERSION(1, 3, 0) && !IS_ENABLED(CONFIG_WIN32))\n+\n struct virtio_gpu_virgl_resource {\n     struct virtio_gpu_simple_resource base;\n     MemoryRegion *mr;\n+    void *map_fixed;\n };\n \n static struct virtio_gpu_virgl_resource *\n@@ -155,6 +159,9 @@ virtio_gpu_virgl_map_resource_blob(VirtIOGPU *g,\n     g_autofree char *name = NULL;\n     struct virtio_gpu_virgl_hostmem_region *vmr;\n     VirtIOGPUBase *b = VIRTIO_GPU_BASE(g);\n+#if VIRGL_HAS_MAP_FIXED\n+    VirtIOGPUGL *gl = VIRTIO_GPU_GL(g);\n+#endif\n     MemoryRegion *mr;\n     uint64_t size;\n     void *data;\n@@ -165,6 +172,41 @@ virtio_gpu_virgl_map_resource_blob(VirtIOGPU *g,\n         return -EOPNOTSUPP;\n     }\n \n+#if VIRGL_HAS_MAP_FIXED\n+    /*\n+     * virgl_renderer_resource_map_fixed() allows to create multiple\n+     * mappings of the same resource, while virgl_renderer_resource_map()\n+     * not. Don't allow mapping same resource twice.\n+     */\n+    if (res->map_fixed || res->mr) {\n+        qemu_log_mask(LOG_GUEST_ERROR,\n+                      \"%s: failed to map(fixed) virgl resource: already mapped\\n\",\n+                      __func__);\n+        return -EBUSY;\n+    }\n+\n+    ret = virgl_renderer_resource_map_fixed(res->base.resource_id,\n+                                            gl->hostmem_mmap + offset);\n+    switch (ret) {\n+    case 0:\n+        res->map_fixed = gl->hostmem_mmap + offset;\n+        return 0;\n+\n+    case -EOPNOTSUPP:\n+        /*\n+         * MAP_FIXED is unsupported by this resource.\n+         * Mapping falls back to a blob subregion method in that case.\n+         */\n+        break;\n+\n+    default:\n+        qemu_log_mask(LOG_GUEST_ERROR,\n+                      \"%s: failed to map(fixed) virgl resource: %s\\n\",\n+                      __func__, strerror(-ret));\n+        return ret;\n+    }\n+#endif\n+\n     ret = virgl_renderer_resource_map(res->base.resource_id, &data, &size);\n     if (ret) {\n         qemu_log_mask(LOG_GUEST_ERROR, \"%s: failed to map virgl resource: %s\\n\",\n@@ -181,7 +223,7 @@ virtio_gpu_virgl_map_resource_blob(VirtIOGPU *g,\n \n     mr = &vmr->mr;\n     memory_region_init_ram_ptr(mr, OBJECT(vmr), \"mr\", size, data);\n-    memory_region_add_subregion(&b->hostmem, offset, mr);\n+    memory_region_add_subregion_overlap(&b->hostmem, offset, mr, 1);\n \n     res->mr = mr;\n \n@@ -200,6 +242,21 @@ virtio_gpu_virgl_unmap_resource_blob(VirtIOGPU *g,\n     MemoryRegion *mr = res->mr;\n     int ret;\n \n+#if VIRGL_HAS_MAP_FIXED\n+    if (res->map_fixed) {\n+        if (mmap(res->map_fixed, res->base.blob_size, PROT_READ | PROT_WRITE,\n+                 MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,\n+                 -1, 0) == MAP_FAILED) {\n+            ret = -errno;\n+            error_report(\"%s: failed to unmap(fixed) virgl resource: %s\",\n+                          __func__, strerror(-ret));\n+            return ret;\n+        }\n+\n+        res->map_fixed = NULL;\n+    }\n+#endif\n+\n     if (!mr) {\n         return 0;\n     }\ndiff --git a/include/hw/virtio/virtio-gpu.h b/include/hw/virtio/virtio-gpu.h\nindex 1f509d0d5beb..a48b50d4c825 100644\n--- a/include/hw/virtio/virtio-gpu.h\n+++ b/include/hw/virtio/virtio-gpu.h\n@@ -263,6 +263,9 @@ struct VirtIOGPUGL {\n \n     QEMUBH *async_fence_bh;\n     QSLIST_HEAD(, virtio_gpu_virgl_context_fence) async_fenceq;\n+\n+    MemoryRegion hostmem_background;\n+    void *hostmem_mmap;\n };\n \n struct VhostUserGPU {\n",
    "prefixes": [
        "v17",
        "18/18"
    ]
}