vhost-user: quit infinite loop while used memslots is more than the backend limit
When used memslots is more than the backend limit, the vhost-user netcard would attach fail and quit infinite loop. Signed-off-by: Jinhua Cao <caojinhua1@huawei.com>
This commit is contained in:
parent
ca34c7a2fe
commit
3b29064bd8
88
vhost-user-quit-infinite-loop-while-used-memslots-is.patch
Normal file
88
vhost-user-quit-infinite-loop-while-used-memslots-is.patch
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
From f46191f24706a6200cfe607a902b3da45f57c9ad Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jinhua Cao <caojinhua1@huawei.com>
|
||||||
|
Date: Fri, 11 Feb 2022 19:24:30 +0800
|
||||||
|
Subject: [PATCH] vhost-user: quit infinite loop while used memslots is more
|
||||||
|
than the backend limit
|
||||||
|
|
||||||
|
When used memslots is more than the backend limit,
|
||||||
|
the vhost-user netcard would attach fail and quit
|
||||||
|
infinite loop.
|
||||||
|
|
||||||
|
Signed-off-by: Jinhua Cao <caojinhua1@huawei.com>
|
||||||
|
---
|
||||||
|
hw/virtio/vhost.c | 9 +++++++++
|
||||||
|
include/hw/virtio/vhost.h | 1 +
|
||||||
|
net/vhost-user.c | 6 ++++++
|
||||||
|
3 files changed, 16 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
|
||||||
|
index e4809777bc..4c4072951c 100644
|
||||||
|
--- a/hw/virtio/vhost.c
|
||||||
|
+++ b/hw/virtio/vhost.c
|
||||||
|
@@ -48,6 +48,8 @@ static struct vhost_log *vhost_log_shm;
|
||||||
|
static QLIST_HEAD(, vhost_dev) vhost_devices =
|
||||||
|
QLIST_HEAD_INITIALIZER(vhost_devices);
|
||||||
|
|
||||||
|
+bool used_memslots_exceeded;
|
||||||
|
+
|
||||||
|
bool vhost_has_free_slot(void)
|
||||||
|
{
|
||||||
|
struct vhost_dev *hdev;
|
||||||
|
@@ -1336,9 +1338,11 @@ static bool vhost_dev_used_memslots_is_exceeded(struct vhost_dev *hdev)
|
||||||
|
hdev->vhost_ops->vhost_backend_memslots_limit(hdev)) {
|
||||||
|
error_report("vhost backend memory slots limit is less"
|
||||||
|
" than current number of present memory slots");
|
||||||
|
+ used_memslots_exceeded = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ used_memslots_exceeded = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1895,3 +1899,8 @@ int vhost_net_set_backend(struct vhost_dev *hdev,
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+bool used_memslots_is_exceeded(void)
|
||||||
|
+{
|
||||||
|
+ return used_memslots_exceeded;
|
||||||
|
+}
|
||||||
|
diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h
|
||||||
|
index 58a73e7b7a..86f36f0106 100644
|
||||||
|
--- a/include/hw/virtio/vhost.h
|
||||||
|
+++ b/include/hw/virtio/vhost.h
|
||||||
|
@@ -154,4 +154,5 @@ int vhost_dev_set_inflight(struct vhost_dev *dev,
|
||||||
|
struct vhost_inflight *inflight);
|
||||||
|
int vhost_dev_get_inflight(struct vhost_dev *dev, uint16_t queue_size,
|
||||||
|
struct vhost_inflight *inflight);
|
||||||
|
+bool used_memslots_is_exceeded(void);
|
||||||
|
#endif
|
||||||
|
diff --git a/net/vhost-user.c b/net/vhost-user.c
|
||||||
|
index d1aefcb9aa..f910a286e4 100644
|
||||||
|
--- a/net/vhost-user.c
|
||||||
|
+++ b/net/vhost-user.c
|
||||||
|
@@ -20,6 +20,7 @@
|
||||||
|
#include "qemu/error-report.h"
|
||||||
|
#include "qemu/option.h"
|
||||||
|
#include "trace.h"
|
||||||
|
+#include "include/hw/virtio/vhost.h"
|
||||||
|
|
||||||
|
#define VHOST_USER_RECONNECT_TIME (3)
|
||||||
|
|
||||||
|
@@ -369,6 +370,11 @@ static int net_vhost_user_init(NetClientState *peer, const char *device,
|
||||||
|
qemu_chr_fe_set_handlers(&s->chr, NULL, NULL,
|
||||||
|
net_vhost_user_event, NULL, nc0->name, NULL,
|
||||||
|
true);
|
||||||
|
+ if (used_memslots_is_exceeded()) {
|
||||||
|
+ error_report("used memslots exceeded the backend limit, quit "
|
||||||
|
+ "loop");
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
} while (!s->started);
|
||||||
|
|
||||||
|
assert(s->vhost_net);
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user