From nobody Mon May 6 01:00:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 15133277788452.2737518502159446; Fri, 15 Dec 2017 00:49:38 -0800 (PST) Received: from localhost ([::1]:45145 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ePlgK-0005jd-3z for importer@patchew.org; Fri, 15 Dec 2017 03:49:24 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47164) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ePldQ-0003iP-7T for qemu-devel@nongnu.org; Fri, 15 Dec 2017 03:46:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ePldN-0003JD-Bo for qemu-devel@nongnu.org; Fri, 15 Dec 2017 03:46:24 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:2122 helo=huawei.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ePldM-0003CF-P9 for qemu-devel@nongnu.org; Fri, 15 Dec 2017 03:46:21 -0500 Received: from DGGEMS403-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id 6845CBC6F7C07; Fri, 15 Dec 2017 16:46:06 +0800 (CST) Received: from localhost (10.177.19.14) by DGGEMS403-HUB.china.huawei.com (10.3.19.203) with Microsoft SMTP Server id 14.3.361.1; Fri, 15 Dec 2017 16:45:57 +0800 From: Jay Zhou To: , Date: Fri, 15 Dec 2017 16:45:54 +0800 Message-ID: <1513327555-17520-2-git-send-email-jianjay.zhou@huawei.com> X-Mailer: git-send-email 2.6.1.windows.1 In-Reply-To: <1513327555-17520-1-git-send-email-jianjay.zhou@huawei.com> References: <1513327555-17520-1-git-send-email-jianjay.zhou@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.177.19.14] X-CFilter-Loop: Reflected X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 45.249.212.190 Subject: [Qemu-devel] [PATCH v2 1/2] vhost: add used memslot number for vhost-user and vhost-kernel separately X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: weidong.huang@huawei.com, wangxinxin.wang@huawei.com, dgilbert@redhat.com, gary.liuzhe@huawei.com, arei.gonglei@huawei.com, jianjay.zhou@huawei.com, imammedo@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Used_memslots is equal to dev->mem->nregions now, it is true for vhost kernel, but not for vhost user, which uses the memory regions that have file descriptor. In fact, not all of the memory regions have file descriptor. It is usefully in some scenarios, e.g. used_memslots is 8, and only 5 memory slots can be used by vhost user, it is failed to hot plug a new memory RAM because vhost_has_free_slot just returned false, but we can hot plug it safely in fact. Signed-off-by: Jay Zhou Signed-off-by: Zhe Liu --- hw/virtio/vhost-backend.c | 14 ++++++++++++++ hw/virtio/vhost-user.c | 31 +++++++++++++++++++++++++++++++ hw/virtio/vhost.c | 16 +++++++++------- include/hw/virtio/vhost-backend.h | 4 ++++ 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c index 7f09efa..866718c 100644 --- a/hw/virtio/vhost-backend.c +++ b/hw/virtio/vhost-backend.c @@ -15,6 +15,8 @@ #include "hw/virtio/vhost-backend.h" #include "qemu/error-report.h" =20 +static unsigned int vhost_kernel_used_memslots; + static int vhost_kernel_call(struct vhost_dev *dev, unsigned long int requ= est, void *arg) { @@ -233,6 +235,16 @@ static void vhost_kernel_set_iotlb_callback(struct vho= st_dev *dev, qemu_set_fd_handler((uintptr_t)dev->opaque, NULL, NULL, NULL); } =20 +static void vhost_kernel_set_used_memslots(struct vhost_dev *dev) +{ + vhost_kernel_used_memslots =3D dev->mem->nregions; +} + +static unsigned int vhost_kernel_get_used_memslots(void) +{ + return vhost_kernel_used_memslots; +} + static const VhostOps kernel_ops =3D { .backend_type =3D VHOST_BACKEND_TYPE_KERNEL, .vhost_backend_init =3D vhost_kernel_init, @@ -264,6 +276,8 @@ static const VhostOps kernel_ops =3D { #endif /* CONFIG_VHOST_VSOCK */ .vhost_set_iotlb_callback =3D vhost_kernel_set_iotlb_callback, .vhost_send_device_iotlb_msg =3D vhost_kernel_send_device_iotlb_ms= g, + .vhost_set_used_memslots =3D vhost_kernel_set_used_memslots, + .vhost_get_used_memslots =3D vhost_kernel_get_used_memslots, }; =20 int vhost_set_backend_type(struct vhost_dev *dev, VhostBackendType backend= _type) diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index 093675e..58a4cec 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -122,6 +122,8 @@ static VhostUserMsg m __attribute__ ((unused)); /* The version of the protocol we support */ #define VHOST_USER_VERSION (0x1) =20 +static unsigned int vhost_user_used_memslots; + struct vhost_user { CharBackend *chr; int slave_fd; @@ -922,6 +924,33 @@ static void vhost_user_set_iotlb_callback(struct vhost= _dev *dev, int enabled) /* No-op as the receive channel is not dedicated to IOTLB messages. */ } =20 +static void vhost_user_set_used_memslots(struct vhost_dev *dev) +{ + int counter =3D 0; + int i; + + for (i =3D 0; i < dev->mem->nregions; ++i) { + struct vhost_memory_region *reg =3D dev->mem->regions + i; + ram_addr_t offset; + MemoryRegion *mr; + int fd; + + assert((uintptr_t)reg->userspace_addr =3D=3D reg->userspace_addr); + mr =3D memory_region_from_host((void *)(uintptr_t)reg->userspace_a= ddr, + &offset); + fd =3D memory_region_get_fd(mr); + if (fd > 0) { + counter++; + } + } + vhost_user_used_memslots =3D counter; +} + +static unsigned int vhost_user_get_used_memslots(void) +{ + return vhost_user_used_memslots; +} + const VhostOps user_ops =3D { .backend_type =3D VHOST_BACKEND_TYPE_USER, .vhost_backend_init =3D vhost_user_init, @@ -948,4 +977,6 @@ const VhostOps user_ops =3D { .vhost_net_set_mtu =3D vhost_user_net_set_mtu, .vhost_set_iotlb_callback =3D vhost_user_set_iotlb_callback, .vhost_send_device_iotlb_msg =3D vhost_user_send_device_iotlb_msg, + .vhost_set_used_memslots =3D vhost_user_set_used_memslots, + .vhost_get_used_memslots =3D vhost_user_get_used_memslots, }; diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index e4290ce..59a32e9 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -43,20 +43,21 @@ static struct vhost_log *vhost_log; static struct vhost_log *vhost_log_shm; =20 -static unsigned int used_memslots; static QLIST_HEAD(, vhost_dev) vhost_devices =3D QLIST_HEAD_INITIALIZER(vhost_devices); =20 bool vhost_has_free_slot(void) { - unsigned int slots_limit =3D ~0U; struct vhost_dev *hdev; =20 QLIST_FOREACH(hdev, &vhost_devices, entry) { - unsigned int r =3D hdev->vhost_ops->vhost_backend_memslots_limit(h= dev); - slots_limit =3D MIN(slots_limit, r); + if (hdev->vhost_ops->vhost_get_used_memslots() >=3D + hdev->vhost_ops->vhost_backend_memslots_limit(hdev)) { + return false; + } } - return slots_limit > used_memslots; + + return true; } =20 static void vhost_dev_sync_region(struct vhost_dev *dev, @@ -606,7 +607,7 @@ static void vhost_set_memory(MemoryListener *listener, dev->mem_changed_start_addr =3D MIN(dev->mem_changed_start_addr, start= _addr); dev->mem_changed_end_addr =3D MAX(dev->mem_changed_end_addr, start_add= r + size - 1); dev->memory_changed =3D true; - used_memslots =3D dev->mem->nregions; + dev->vhost_ops->vhost_set_used_memslots(dev); } =20 static bool vhost_section(MemoryRegionSection *section) @@ -1251,7 +1252,8 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaq= ue, goto fail; } =20 - if (used_memslots > hdev->vhost_ops->vhost_backend_memslots_limit(hdev= )) { + if (hdev->vhost_ops->vhost_get_used_memslots() > + hdev->vhost_ops->vhost_backend_memslots_limit(hdev)) { error_report("vhost backend memory slots limit is less" " than current number of present memory slots"); r =3D -1; diff --git a/include/hw/virtio/vhost-backend.h b/include/hw/virtio/vhost-ba= ckend.h index a7a5f22..19961b5 100644 --- a/include/hw/virtio/vhost-backend.h +++ b/include/hw/virtio/vhost-backend.h @@ -84,6 +84,8 @@ typedef void (*vhost_set_iotlb_callback_op)(struct vhost_= dev *dev, int enabled); typedef int (*vhost_send_device_iotlb_msg_op)(struct vhost_dev *dev, struct vhost_iotlb_msg *imsg= ); +typedef void (*vhost_set_used_memslots_op)(struct vhost_dev *dev); +typedef unsigned int (*vhost_get_used_memslots_op)(void); =20 typedef struct VhostOps { VhostBackendType backend_type; @@ -118,6 +120,8 @@ typedef struct VhostOps { vhost_vsock_set_running_op vhost_vsock_set_running; vhost_set_iotlb_callback_op vhost_set_iotlb_callback; vhost_send_device_iotlb_msg_op vhost_send_device_iotlb_msg; + vhost_set_used_memslots_op vhost_set_used_memslots; + vhost_get_used_memslots_op vhost_get_used_memslots; } VhostOps; =20 extern const VhostOps user_ops; --=20 1.8.3.1 From nobody Mon May 6 01:00:26 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513327714597448.4484233077583; Fri, 15 Dec 2017 00:48:34 -0800 (PST) Received: from localhost ([::1]:45140 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ePlex-0004qJ-GZ for importer@patchew.org; Fri, 15 Dec 2017 03:47:59 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47165) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ePldQ-0003iR-7r for qemu-devel@nongnu.org; Fri, 15 Dec 2017 03:46:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ePldN-0003IR-4v for qemu-devel@nongnu.org; Fri, 15 Dec 2017 03:46:24 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:2121 helo=huawei.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ePldM-00039x-PI for qemu-devel@nongnu.org; Fri, 15 Dec 2017 03:46:21 -0500 Received: from DGGEMS402-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 2628DBF99F519; Fri, 15 Dec 2017 16:46:04 +0800 (CST) Received: from localhost (10.177.19.14) by DGGEMS402-HUB.china.huawei.com (10.3.19.202) with Microsoft SMTP Server id 14.3.361.1; Fri, 15 Dec 2017 16:45:58 +0800 From: Jay Zhou To: , Date: Fri, 15 Dec 2017 16:45:55 +0800 Message-ID: <1513327555-17520-3-git-send-email-jianjay.zhou@huawei.com> X-Mailer: git-send-email 2.6.1.windows.1 In-Reply-To: <1513327555-17520-1-git-send-email-jianjay.zhou@huawei.com> References: <1513327555-17520-1-git-send-email-jianjay.zhou@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.177.19.14] X-CFilter-Loop: Reflected X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 45.249.212.190 Subject: [Qemu-devel] [PATCH v2 2/2] vhost: double check used memslots number X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: weidong.huang@huawei.com, wangxinxin.wang@huawei.com, dgilbert@redhat.com, gary.liuzhe@huawei.com, arei.gonglei@huawei.com, jianjay.zhou@huawei.com, imammedo@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If the VM already has N(N>8) available memory slots for vhost user, the VM will be crashed in vhost_user_set_mem_table if we try to hotplug the first vhost user NIC. This patch checks if memslots number exceeded or not after updating vhost_user_used_memslots. Signed-off-by: Jay Zhou --- hw/virtio/vhost.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 59a32e9..e45f5e2 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -1234,6 +1234,18 @@ static void vhost_virtqueue_cleanup(struct vhost_vir= tqueue *vq) event_notifier_cleanup(&vq->masked_notifier); } =20 +static bool vhost_dev_used_memslots_is_exceeded(struct vhost_dev *hdev) +{ + if (hdev->vhost_ops->vhost_get_used_memslots() > + hdev->vhost_ops->vhost_backend_memslots_limit(hdev)) { + error_report("vhost backend memory slots limit is less" + " than current number of present memory slots"); + return true; + } + + return false; +} + int vhost_dev_init(struct vhost_dev *hdev, void *opaque, VhostBackendType backend_type, uint32_t busyloop_timeou= t) { @@ -1252,10 +1264,7 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opa= que, goto fail; } =20 - if (hdev->vhost_ops->vhost_get_used_memslots() > - hdev->vhost_ops->vhost_backend_memslots_limit(hdev)) { - error_report("vhost backend memory slots limit is less" - " than current number of present memory slots"); + if (vhost_dev_used_memslots_is_exceeded(hdev)) { r =3D -1; goto fail; } @@ -1341,6 +1350,16 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opa= que, hdev->memory_changed =3D false; memory_listener_register(&hdev->memory_listener, &address_space_memory= ); QLIST_INSERT_HEAD(&vhost_devices, hdev, entry); + + if (vhost_dev_used_memslots_is_exceeded(hdev)) { + r =3D -1; + if (busyloop_timeout) { + goto fail_busyloop; + } else { + goto fail; + } + } + return 0; =20 fail_busyloop: --=20 1.8.3.1