Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/1839912/?format=api
{ "id": 1839912, "url": "http://patchwork.ozlabs.org/api/patches/1839912/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20230926185738.277351-10-david@redhat.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": "<20230926185738.277351-10-david@redhat.com>", "list_archive_url": null, "date": "2023-09-26T18:57:29", "name": "[v4,09/18] memory-device, vhost: Support memory devices that dynamically consume memslots", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "8e5c48cb7f13e5bea86484939916b318e81f1cfa", "submitter": { "id": 70402, "url": "http://patchwork.ozlabs.org/api/people/70402/?format=api", "name": "David Hildenbrand", "email": "david@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20230926185738.277351-10-david@redhat.com/mbox/", "series": [ { "id": 374991, "url": "http://patchwork.ozlabs.org/api/series/374991/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=374991", "date": "2023-09-26T18:57:23", "name": "virtio-mem: Expose device memory through multiple memslots", "version": 4, "mbox": "http://patchwork.ozlabs.org/series/374991/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/1839912/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/1839912/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=fail reason=\"signature verification failed\" (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=DO81J8Y/;\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 4Rw8H20lNqz1ynX\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 27 Sep 2023 05:01:34 +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 1qlDHI-0000Ia-UY; Tue, 26 Sep 2023 14:59:24 -0400", "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 <david@redhat.com>) id 1qlDHG-0000Dm-TS\n for qemu-devel@nongnu.org; Tue, 26 Sep 2023 14:59:22 -0400", "from us-smtp-delivery-124.mimecast.com ([170.10.133.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <david@redhat.com>) id 1qlDHE-00039D-TI\n for qemu-devel@nongnu.org; Tue, 26 Sep 2023 14:59:22 -0400", "from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com\n [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n us-mta-642-kL5N-bImMhus8JdUVGCtYg-1; Tue, 26 Sep 2023 14:59:16 -0400", "from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com\n [10.11.54.4])\n (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n (No client certificate requested)\n by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 0B08C805B29;\n Tue, 26 Sep 2023 18:59:16 +0000 (UTC)", "from t14s.fritz.box (unknown [10.39.192.33])\n by smtp.corp.redhat.com (Postfix) with ESMTP id 1C8382026D4B;\n Tue, 26 Sep 2023 18:59:09 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1695754760;\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=kZcRdwyNP50tSHDs9hyBXUz08rwwVIv8MNAI/C060fQ=;\n b=DO81J8Y/fFpz3S8w1U/STlM9PwCZer9olhgLT1tOwdF5JGQggpgCocHO0iG61IJ8m8mcwT\n Nce/S6fPWnL0AsUtOZrPiE+nWm9mGRnelAv1e6jShNYvgfoMbETnukFlWfaeGw59wMIC0w\n QsFbn9Q+4PEdo2rYrfvde7g4as8Z9uQ=", "X-MC-Unique": "kL5N-bImMhus8JdUVGCtYg-1", "From": "David Hildenbrand <david@redhat.com>", "To": "qemu-devel@nongnu.org", "Cc": "David Hildenbrand <david@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>,\n Igor Mammedov <imammedo@redhat.com>,\n Xiao Guangrong <xiaoguangrong.eric@gmail.com>,\n \"Michael S. Tsirkin\" <mst@redhat.com>, Peter Xu <peterx@redhat.com>,\n\t=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>,\n Eduardo Habkost <eduardo@habkost.net>,\n Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,\n Yanan Wang <wangyanan55@huawei.com>, Michal Privoznik <mprivozn@redhat.com>,\n\t=?utf-8?q?Daniel_P_=2E_Berrang=C3=A9?= <berrange@redhat.com>,\n Gavin Shan <gshan@redhat.com>, Alex Williamson <alex.williamson@redhat.com>,\n Stefan Hajnoczi <stefanha@redhat.com>,\n \"Maciej S . Szmigiero\" <mail@maciej.szmigiero.name>, kvm@vger.kernel.org,\n \"Maciej S . Szmigiero\" <maciej.szmigiero@oracle.com>", "Subject": "[PATCH v4 09/18] memory-device,\n vhost: Support memory devices that dynamically consume memslots", "Date": "Tue, 26 Sep 2023 20:57:29 +0200", "Message-ID": "<20230926185738.277351-10-david@redhat.com>", "In-Reply-To": "<20230926185738.277351-1-david@redhat.com>", "References": "<20230926185738.277351-1-david@redhat.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-Scanned-By": "MIMEDefang 3.1 on 10.11.54.4", "Received-SPF": "pass client-ip=170.10.133.124; envelope-from=david@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.001,\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_H3=0.001, RCVD_IN_MSPIKE_WL=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-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": "We want to support memory devices that have a dynamically managed memory\nregion container as device memory region. This device memory region maps\nmultiple RAM memory subregions (e.g., aliases to the same RAM memory\nregion), whereby these subregions can be (un)mapped on demand.\n\nEach RAM subregion will consume a memslot in KVM and vhost, resulting in\nsuch a new device consuming memslots dynamically, and initially usually\n0. We already track the number of used vs. required memslots for all\nmemslots. From that, we can derive the number of reserved memslots that\nmust not be used otherwise.\n\nThe target use case is virtio-mem and the hyper-v balloon, which will\ndynamically map aliases to RAM memory region into their device memory\nregion container.\n\nProperly document what's supported and what's not and extend the vhost\nmemslot check accordingly.\n\nReviewed-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>\nSigned-off-by: David Hildenbrand <david@redhat.com>\n---\n hw/mem/memory-device.c | 29 +++++++++++++++++++++++++++--\n hw/virtio/vhost.c | 18 ++++++++++++++----\n include/hw/mem/memory-device.h | 7 +++++++\n stubs/memory_device.c | 5 +++++\n 4 files changed, 53 insertions(+), 6 deletions(-)", "diff": "diff --git a/hw/mem/memory-device.c b/hw/mem/memory-device.c\nindex d37cfbd65d..1b14ba5661 100644\n--- a/hw/mem/memory-device.c\n+++ b/hw/mem/memory-device.c\n@@ -62,19 +62,44 @@ static unsigned int memory_device_get_memslots(MemoryDeviceState *md)\n return 1;\n }\n \n+/*\n+ * Memslots that are reserved by memory devices (required but still reported\n+ * as free from KVM / vhost).\n+ */\n+static unsigned int get_reserved_memslots(MachineState *ms)\n+{\n+ if (ms->device_memory->used_memslots >\n+ ms->device_memory->required_memslots) {\n+ /* This is unexpected, and we warned already in the memory notifier. */\n+ return 0;\n+ }\n+ return ms->device_memory->required_memslots -\n+ ms->device_memory->used_memslots;\n+}\n+\n+unsigned int memory_devices_get_reserved_memslots(void)\n+{\n+ if (!current_machine->device_memory) {\n+ return 0;\n+ }\n+ return get_reserved_memslots(current_machine);\n+}\n+\n static void memory_device_check_addable(MachineState *ms, MemoryDeviceState *md,\n MemoryRegion *mr, Error **errp)\n {\n const uint64_t used_region_size = ms->device_memory->used_region_size;\n const uint64_t size = memory_region_size(mr);\n const unsigned int required_memslots = memory_device_get_memslots(md);\n+ const unsigned int reserved_memslots = get_reserved_memslots(ms);\n \n /* we will need memory slots for kvm and vhost */\n- if (kvm_enabled() && kvm_get_free_memslots() < required_memslots) {\n+ if (kvm_enabled() &&\n+ kvm_get_free_memslots() < required_memslots + reserved_memslots) {\n error_setg(errp, \"hypervisor has not enough free memory slots left\");\n return;\n }\n- if (vhost_get_free_memslots() < required_memslots) {\n+ if (vhost_get_free_memslots() < required_memslots + reserved_memslots) {\n error_setg(errp, \"a used vhost backend has not enough free memory slots left\");\n return;\n }\ndiff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c\nindex 8e84dca246..f7e1ac12a8 100644\n--- a/hw/virtio/vhost.c\n+++ b/hw/virtio/vhost.c\n@@ -23,6 +23,7 @@\n #include \"qemu/log.h\"\n #include \"standard-headers/linux/vhost_types.h\"\n #include \"hw/virtio/virtio-bus.h\"\n+#include \"hw/mem/memory-device.h\"\n #include \"migration/blocker.h\"\n #include \"migration/qemu-file-types.h\"\n #include \"sysemu/dma.h\"\n@@ -1423,7 +1424,7 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,\n VhostBackendType backend_type, uint32_t busyloop_timeout,\n Error **errp)\n {\n- unsigned int used;\n+ unsigned int used, reserved, limit;\n uint64_t features;\n int i, r, n_initialized_vqs = 0;\n \n@@ -1529,9 +1530,18 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,\n } else {\n used = used_memslots;\n }\n- if (used > hdev->vhost_ops->vhost_backend_memslots_limit(hdev)) {\n- error_setg(errp, \"vhost backend memory slots limit is less\"\n- \" than current number of present memory slots\");\n+ /*\n+ * We assume that all reserved memslots actually require a real memslot\n+ * in our vhost backend. This might not be true, for example, if the\n+ * memslot would be ROM. If ever relevant, we can optimize for that --\n+ * but we'll need additional information about the reservations.\n+ */\n+ reserved = memory_devices_get_reserved_memslots();\n+ limit = hdev->vhost_ops->vhost_backend_memslots_limit(hdev);\n+ if (used + reserved > limit) {\n+ error_setg(errp, \"vhost backend memory slots limit (%d) is less\"\n+ \" than current number of used (%d) and reserved (%d)\"\n+ \" memory slots for memory devices.\", limit, used, reserved);\n r = -EINVAL;\n goto fail_busyloop;\n }\ndiff --git a/include/hw/mem/memory-device.h b/include/hw/mem/memory-device.h\nindex b51a579fb9..c7b624da6a 100644\n--- a/include/hw/mem/memory-device.h\n+++ b/include/hw/mem/memory-device.h\n@@ -46,6 +46,12 @@ typedef struct MemoryDeviceState MemoryDeviceState;\n * single RAM memory region or a memory region container with subregions\n * that are RAM memory regions or aliases to RAM memory regions. Other\n * memory regions or subregions are not supported.\n+ *\n+ * If the device memory region returned via @get_memory_region is a\n+ * memory region container, it's supported to dynamically (un)map subregions\n+ * as long as the number of memslots returned by @get_memslots() won't\n+ * be exceeded and as long as all memory regions are of the same kind (e.g.,\n+ * all RAM or all ROM).\n */\n struct MemoryDeviceClass {\n /* private */\n@@ -125,6 +131,7 @@ struct MemoryDeviceClass {\n \n MemoryDeviceInfoList *qmp_memory_device_list(void);\n uint64_t get_plugged_memory_size(void);\n+unsigned int memory_devices_get_reserved_memslots(void);\n void memory_device_pre_plug(MemoryDeviceState *md, MachineState *ms,\n const uint64_t *legacy_align, Error **errp);\n void memory_device_plug(MemoryDeviceState *md, MachineState *ms);\ndiff --git a/stubs/memory_device.c b/stubs/memory_device.c\nindex e75cac62dc..318a5d4187 100644\n--- a/stubs/memory_device.c\n+++ b/stubs/memory_device.c\n@@ -10,3 +10,8 @@ uint64_t get_plugged_memory_size(void)\n {\n return (uint64_t)-1;\n }\n+\n+unsigned int memory_devices_get_reserved_memslots(void)\n+{\n+ return 0;\n+}\n", "prefixes": [ "v4", "09/18" ] }