Dear all:
I found a bug of qemu: hot-pluging a vhost-net may cause virtual machine crash in following steps:
1. Starting a vm without any net device.
2. Hot-pluging 70 memory devices.
3. Hot-pluging a vhost-net device.
After the 3rd step, the qemu crashed with following messages:
vhost backend memory slots limit is less than current number of present memory slots
warning: vhost-net requested but could not be initialized
qemu-system-x86_64: ../net/net.c:1106: net_client_init1: Assertion `nc' failed.
2022-12-05 03:14:08.794+0000: shutting down, reason=crashed
This commit is used to fix the mentioned problem. It is based on commit a33c25399f9bc3dcf83064adeba2a82e61bf4608 of master branch.
Kind regards.
From b2bca483212f04b9b021753aec1fcaeaf41385d1 Mon Sep 17 00:00:00 2001
From: Ming Yang <yangming73@huawei.com>
Date: Fri, 25 Nov 2022 10:45:52 +0800
Subject: [PATCH] net/net.c: Fix qemu crash when hot-pluging a vhost-net failed.
Hot-pluging a vhost-net may cause virtual machine crash in following steps:
1. Starting a vm without net devices.
2. Hot-pluging 70 memory devices.
3. Hot-pluging a vhost-net device.
The reason is : if hotplug a vhost-net failed, the nc cannot be found via function qemu_find_netdev, as
it has been cleaned up through function qemu_cleanup_net_client. Which leads to the result
that assert(nc) failed, then qemu crashed.
While, the root reason is that, in commit 46d4d36d0bf2 if not both has_vhostforce and vhostforce flags
are true, the errp would not be set. Then net_init_tap would not return a negative value, fallowed by founding nc
and assert nc.
In this patch, asserting nc is replaced with setting an error message.
Fixes: 46d4d36d0bf2("tap: setting error appropriately when calling net_init_tap_one()")
Signed-off-by: Ming Yang <yangming73@huawei.com>
Signed-off-by: Liang Zhang <zhangliang5@huawei.com>
---
net/net.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/net/net.c b/net/net.c
index 840ad9dca5..1d1d7e54c4 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1103,7 +1103,16 @@ static int net_client_init1(const Netdev *netdev, bool is_netdev, Error **errp)
if (is_netdev) {
nc = qemu_find_netdev(netdev->id);
- assert(nc);
+ /*
+ * If the tap of hotpluged net device do not has both has_vhostforce flag and vhostforce flags,
+ * when error occurs, the error messags will be report but not set to errp. Thus net_client_init_fun
+ * will not return a negatave value. Therefore the value of nc might be NULL. To make qemu robust,
+ * it is better to judge if nc is NULL.
+ */
+ if (!nc) {
+ error_setg(errp, "Device '%s' could not be initialized", netdev->id);
+ return -1;
+ }
nc->is_netdev = true;
}
--
2.33.0
On Mon, Dec 5, 2022 at 2:23 PM Yangming <yangming73@huawei.com> wrote: > > Dear all: > > > > I found a bug of qemu: hot-pluging a vhost-net may cause virtual machine crash in following steps: > 1. Starting a vm without any net device. > 2. Hot-pluging 70 memory devices. > 3. Hot-pluging a vhost-net device. > > > > After the 3rd step, the qemu crashed with following messages: > > > > vhost backend memory slots limit is less than current number of present memory slots > > warning: vhost-net requested but could not be initialized > > qemu-system-x86_64: ../net/net.c:1106: net_client_init1: Assertion `nc' failed. > > 2022-12-05 03:14:08.794+0000: shutting down, reason=crashed > > > > This commit is used to fix the mentioned problem. It is based on commit a33c25399f9bc3dcf83064adeba2a82e61bf4608 of master branch. Thanks for the patch, would you please send a formal patch (not as an attachment), you can do it via git-send-email. Thanks > > > > Kind regards. > >
On 5/12/22 07:37, Jason Wang wrote: > On Mon, Dec 5, 2022 at 2:23 PM Yangming <yangming73@huawei.com> wrote: >> >> Dear all: >> >> >> >> I found a bug of qemu: hot-pluging a vhost-net may cause virtual machine crash in following steps: >> 1. Starting a vm without any net device. >> 2. Hot-pluging 70 memory devices. >> 3. Hot-pluging a vhost-net device. >> >> >> >> After the 3rd step, the qemu crashed with following messages: >> >> >> >> vhost backend memory slots limit is less than current number of present memory slots >> >> warning: vhost-net requested but could not be initialized >> >> qemu-system-x86_64: ../net/net.c:1106: net_client_init1: Assertion `nc' failed. >> >> 2022-12-05 03:14:08.794+0000: shutting down, reason=crashed >> >> >> >> This commit is used to fix the mentioned problem. It is based on commit a33c25399f9bc3dcf83064adeba2a82e61bf4608 of master branch. > > Thanks for the patch, would you please send a formal patch (not as an > attachment), you can do it via git-send-email. You can find some help on how to proceed here: https://www.qemu.org/docs/master/devel/submitting-a-patch.html
© 2016 - 2024 Red Hat, Inc.