Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.0/patches/2198140/?format=api
{ "id": 2198140, "url": "http://patchwork.ozlabs.org/api/1.0/patches/2198140/?format=api", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/1.0/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": "" }, "msgid": "<20260219130334.787858-8-aesteve@redhat.com>", "date": "2026-02-19T13:03:34", "name": "[v13,7/7] vhost-user-device: Add shared memory BAR", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "f83e11817a7e4e8cd34d9be797abc4075f220844", "submitter": { "id": 85915, "url": "http://patchwork.ozlabs.org/api/1.0/people/85915/?format=api", "name": "Albert Esteve", "email": "aesteve@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260219130334.787858-8-aesteve@redhat.com/mbox/", "series": [ { "id": 492672, "url": "http://patchwork.ozlabs.org/api/1.0/series/492672/?format=api", "date": "2026-02-19T13:03:27", "name": "vhost-user: Add SHMEM_MAP/UNMAP requests", "version": 13, "mbox": "http://patchwork.ozlabs.org/series/492672/mbox/" } ], "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2198140/checks/", "tags": {}, "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=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=JEC8NZCR;\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 4fGtrZ0vq2z1xvg\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 20 Feb 2026 00:04:46 +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 1vt3hu-00007e-GN; Thu, 19 Feb 2026 08:04:38 -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 <aesteve@redhat.com>)\n id 1vt3hs-0008U8-8h\n for qemu-devel@nongnu.org; Thu, 19 Feb 2026 08:04:36 -0500", "from us-smtp-delivery-124.mimecast.com ([170.10.129.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <aesteve@redhat.com>)\n id 1vt3hq-0006P4-ET\n for qemu-devel@nongnu.org; Thu, 19 Feb 2026 08:04:36 -0500", "from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-491-r1sxKKX1PCS3tECIIoSdhg-1; Thu,\n 19 Feb 2026 08:04:30 -0500", "from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id DD6C41800581; Thu, 19 Feb 2026 13:04:28 +0000 (UTC)", "from fedora.redhat.com (unknown [10.44.33.19])\n by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 70B9019560A7; Thu, 19 Feb 2026 13:04:23 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1771506273;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=YgMuFHE4xgIPRrBqWIR+Qt/vy3i50/JPFOfHKHeqU+s=;\n b=JEC8NZCRia3p9IIdbz7MdeQe1SHCHxPpK0ArR9YkNIe4msJM5E04K5ygtLdRHFSLDwC/yC\n 2Fj7IlJ2qcco9Ld6HN2nu7OjkuJ5yPTHx/o5Bvwjo+hgkJbixXiaN1lQfDuOoFm9E+jkO6\n Ao2DnsuOnGOCGgWxBpQWliG5Zq8VNeY=", "X-MC-Unique": "r1sxKKX1PCS3tECIIoSdhg-1", "X-Mimecast-MFC-AGG-ID": "r1sxKKX1PCS3tECIIoSdhg_1771506269", "From": "Albert Esteve <aesteve@redhat.com>", "To": "qemu-devel@nongnu.org", "Cc": "Peter Xu <peterx@redhat.com>,\n Pierrick Bouvier <pierrick.bouvier@linaro.org>, mst@redhat.com,\n dbassey@redhat.com,\n =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>, =?utf-8?q?Alex?=\n\t=?utf-8?q?_Benn=C3=A9e?= <alex.bennee@linaro.org>,\n Paolo Bonzini <pbonzini@redhat.com>, Fabiano Rosas <farosas@suse.de>,\n stefanha@redhat.com, manos.pitsidianakis@linaro.org,\n Stefano Garzarella <sgarzare@redhat.com>, jasowang@redhat.com,\n Laurent Vivier <lvivier@redhat.com>, slp@redhat.com, hi@alyssa.is,\n stevensd@chromium.org", "Subject": "[PATCH v13 7/7] vhost-user-device: Add shared memory BAR", "Date": "Thu, 19 Feb 2026 14:03:34 +0100", "Message-ID": "<20260219130334.787858-8-aesteve@redhat.com>", "In-Reply-To": "<20260219130334.787858-1-aesteve@redhat.com>", "References": "<20260219130334.787858-1-aesteve@redhat.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-Scanned-By": "MIMEDefang 3.0 on 10.30.177.12", "Received-SPF": "pass client-ip=170.10.129.124; envelope-from=aesteve@redhat.com;\n helo=us-smtp-delivery-124.mimecast.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, DKIMWL_WL_HIGH=-0.045,\n DKIM_SIGNED=0.1, 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_CERTIFIED_BLOCKED=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001,\n SPF_HELO_PASS=-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": "Add shared memory BAR support to vhost-user-device-pci\nto enable direct file mapping for VIRTIO Shared\nMemory Regions.\n\nThe implementation creates a consolidated shared\nmemory BAR that contains all VIRTIO Shared\nMemory Regions as subregions. Each region is\nconfigured with its proper shmid, size, and\noffset within the BAR. The number and size of\nregions are retrieved via VHOST_USER_GET_SHMEM_CONFIG\nmessage sent by vhost-user-base during realization\nafter virtio_init().\n\nSpecifiically, it uses BAR 3 to avoid conflicts, as\nit is currently unused.\n\nThe shared memory BAR is only created when the\nbackend supports VHOST_USER_PROTOCOL_F_SHMEM and\nhas configured shared memory regions. This maintains\nbackward compatibility with backends that do not\nsupport shared memory functionality.\n\nReviewed-by: Stefan Hajnoczi <stefanha@redhat.com>\nSigned-off-by: Albert Esteve <aesteve@redhat.com>\n---\n hw/virtio/vhost-user-base.c | 46 ++++++++++++++++++++++++--\n hw/virtio/vhost-user-test-device-pci.c | 38 +++++++++++++++++++--\n 2 files changed, 79 insertions(+), 5 deletions(-)", "diff": "diff --git a/hw/virtio/vhost-user-base.c b/hw/virtio/vhost-user-base.c\nindex 01ab9ca56b..e5e8abae96 100644\n--- a/hw/virtio/vhost-user-base.c\n+++ b/hw/virtio/vhost-user-base.c\n@@ -16,6 +16,7 @@\n #include \"hw/virtio/virtio-bus.h\"\n #include \"hw/virtio/vhost-user-base.h\"\n #include \"qemu/error-report.h\"\n+#include \"migration/blocker.h\"\n \n static void vub_start(VirtIODevice *vdev)\n {\n@@ -276,7 +277,8 @@ static void vub_device_realize(DeviceState *dev, Error **errp)\n {\n VirtIODevice *vdev = VIRTIO_DEVICE(dev);\n VHostUserBase *vub = VHOST_USER_BASE(dev);\n- int ret;\n+ uint64_t memory_sizes[VIRTIO_MAX_SHMEM_REGIONS];\n+ int i, ret, nregions, regions_processed = 0;\n \n if (!vub->chardev.chr) {\n error_setg(errp, \"vhost-user-base: missing chardev\");\n@@ -319,7 +321,7 @@ static void vub_device_realize(DeviceState *dev, Error **errp)\n \n /* Allocate queues */\n vub->vqs = g_ptr_array_sized_new(vub->num_vqs);\n- for (int i = 0; i < vub->num_vqs; i++) {\n+ for (i = 0; i < vub->num_vqs; i++) {\n g_ptr_array_add(vub->vqs,\n virtio_add_queue(vdev, vub->vq_size,\n vub_handle_output));\n@@ -333,11 +335,49 @@ static void vub_device_realize(DeviceState *dev, Error **errp)\n VHOST_BACKEND_TYPE_USER, 0, errp);\n \n if (ret < 0) {\n- do_vhost_user_cleanup(vdev, vub);\n+ goto err;\n+ }\n+\n+ ret = vub->vhost_dev.vhost_ops->vhost_get_shmem_config(&vub->vhost_dev,\n+ &nregions,\n+ memory_sizes,\n+ errp);\n+\n+ if (ret < 0) {\n+ goto err;\n+ }\n+\n+ for (i = 0; i < VIRTIO_MAX_SHMEM_REGIONS && regions_processed < nregions; i++) {\n+ if (memory_sizes[i]) {\n+ regions_processed++;\n+ if (vub->vhost_dev.migration_blocker == NULL) {\n+ error_setg(&vub->vhost_dev.migration_blocker,\n+ \"Migration disabled: devices with VIRTIO Shared Memory \"\n+ \"Regions do not support migration yet.\");\n+ ret = migrate_add_blocker_normal(\n+ &vub->vhost_dev.migration_blocker,\n+ errp);\n+\n+ if (ret < 0) {\n+ goto err;\n+ }\n+ }\n+\n+ if (memory_sizes[i] % qemu_real_host_page_size() != 0) {\n+ error_setg(errp, \"Shared memory %d size must be a power of 2 \"\n+ \"no smaller than the page size\", i);\n+ goto err;\n+ }\n+\n+ virtio_new_shmem_region(vdev, i, memory_sizes[i]);\n+ }\n }\n \n qemu_chr_fe_set_handlers(&vub->chardev, NULL, NULL, vub_event, NULL,\n dev, NULL, true);\n+ return;\n+err:\n+ do_vhost_user_cleanup(vdev, vub);\n }\n \n static void vub_device_unrealize(DeviceState *dev)\ndiff --git a/hw/virtio/vhost-user-test-device-pci.c b/hw/virtio/vhost-user-test-device-pci.c\nindex 7f6d751690..22678e3277 100644\n--- a/hw/virtio/vhost-user-test-device-pci.c\n+++ b/hw/virtio/vhost-user-test-device-pci.c\n@@ -12,10 +12,13 @@\n #include \"hw/virtio/vhost-user-base.h\"\n #include \"hw/virtio/virtio-pci.h\"\n \n+#define VIRTIO_DEVICE_PCI_SHMEM_BAR 4\n+\n struct VHostUserDevicePCI {\n VirtIOPCIProxy parent_obj;\n \n VHostUserBase vub;\n+ MemoryRegion shmembar;\n };\n \n #define TYPE_VHOST_USER_TEST_DEVICE_PCI \"vhost-user-test-device-pci-base\"\n@@ -25,10 +28,41 @@ OBJECT_DECLARE_SIMPLE_TYPE(VHostUserDevicePCI, VHOST_USER_TEST_DEVICE_PCI)\n static void vhost_user_device_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)\n {\n VHostUserDevicePCI *dev = VHOST_USER_TEST_DEVICE_PCI(vpci_dev);\n- DeviceState *vdev = DEVICE(&dev->vub);\n+ DeviceState *dev_state = DEVICE(&dev->vub);\n+ VirtIODevice *vdev = VIRTIO_DEVICE(dev_state);\n+ VirtioSharedMemory *shmem, *next;\n+ uint64_t offset = 0, shmem_size = 0;\n \n+ vpci_dev->modern_mem_bar_idx = 2;\n vpci_dev->nvectors = 1;\n- qdev_realize(vdev, BUS(&vpci_dev->bus), errp);\n+ qdev_realize(dev_state, BUS(&vpci_dev->bus), errp);\n+\n+ QSIMPLEQ_FOREACH_SAFE(shmem, &vdev->shmem_list, entry, next) {\n+ if (shmem->mr.size > UINT64_MAX - shmem_size) {\n+ error_setg(errp, \"Total shared memory required overflow\");\n+ return;\n+ }\n+ shmem_size = shmem_size + shmem->mr.size;\n+ }\n+ if (shmem_size) {\n+ if (vpci_dev->flags & VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY) {\n+ error_setg(errp, \"modern-pio-notify is not supported due to PCI BAR layout limitations\");\n+ return;\n+ }\n+ memory_region_init(&dev->shmembar, OBJECT(vpci_dev),\n+ \"vhost-device-pci-shmembar\", shmem_size);\n+ QSIMPLEQ_FOREACH_SAFE(shmem, &vdev->shmem_list, entry, next) {\n+ memory_region_add_subregion(&dev->shmembar, offset, &shmem->mr);\n+ virtio_pci_add_shm_cap(vpci_dev, VIRTIO_DEVICE_PCI_SHMEM_BAR,\n+ offset, shmem->mr.size, shmem->shmid);\n+ offset = offset + shmem->mr.size;\n+ }\n+ pci_register_bar(&vpci_dev->pci_dev, VIRTIO_DEVICE_PCI_SHMEM_BAR,\n+ PCI_BASE_ADDRESS_SPACE_MEMORY |\n+ PCI_BASE_ADDRESS_MEM_PREFETCH |\n+ PCI_BASE_ADDRESS_MEM_TYPE_64,\n+ &dev->shmembar);\n+ }\n }\n \n static void vhost_user_device_pci_class_init(ObjectClass *klass,\n", "prefixes": [ "v13", "7/7" ] }