Revert "tap: setting error appropriately when calling net_init_tap_one()"
This reverts commit46d4d36d0b
. The reverted commit changed to emit warnings instead of errors when vhost is requested but vhost initialization fails if vhostforce option is not set. However, vhostforce is not meant to ignore vhost errors. It was once introduced as an option to commit5430a28fe4
("vhost: force vhost off for non-MSI guests") to force enabling vhost for non-MSI guests, which will have worse performance with vhost. The option was deprecated with commit1e7398a140
("vhost: enable vhost without without MSI-X") and changed to behave identical with the vhost option for compatibility. Worse, commitbf769f742c
("virtio: del net client if net_init_tap_one failed") changed to delete the client when vhost fails even when the failure only results in a warning. The leads to an assertion failure for the -netdev command line option. The reverted commit was intended to avoid that the vhost initialization failure won't result in a corrupted netdev. This problem should have been fixed by deleting netdev when the initialization fails instead of ignoring the failure with an arbitrary option. Fortunately, commitbf769f742c
("virtio: del net client if net_init_tap_one failed"), mentioned earlier, implements this behavior. Restore the correct semantics and fix the assertion failure for the -netdev command line option by reverting the problematic commit. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
decfde6b0e
commit
d9b33018a0
|
@ -4,9 +4,6 @@
|
|||
#include "net/net.h"
|
||||
#include "hw/virtio/vhost-backend.h"
|
||||
|
||||
#define VHOST_NET_INIT_FAILED \
|
||||
"vhost-net requested but could not be initialized"
|
||||
|
||||
struct vhost_net;
|
||||
typedef struct vhost_net VHostNetState;
|
||||
|
||||
|
|
22
net/tap.c
22
net/tap.c
|
@ -743,11 +743,7 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
|
|||
if (vhostfdname) {
|
||||
vhostfd = monitor_fd_param(monitor_cur(), vhostfdname, &err);
|
||||
if (vhostfd == -1) {
|
||||
if (tap->has_vhostforce && tap->vhostforce) {
|
||||
error_propagate(errp, err);
|
||||
} else {
|
||||
warn_report_err(err);
|
||||
}
|
||||
error_propagate(errp, err);
|
||||
goto failed;
|
||||
}
|
||||
if (!g_unix_set_fd_nonblocking(vhostfd, true, NULL)) {
|
||||
|
@ -758,13 +754,8 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
|
|||
} else {
|
||||
vhostfd = open("/dev/vhost-net", O_RDWR);
|
||||
if (vhostfd < 0) {
|
||||
if (tap->has_vhostforce && tap->vhostforce) {
|
||||
error_setg_errno(errp, errno,
|
||||
"tap: open vhost char device failed");
|
||||
} else {
|
||||
warn_report("tap: open vhost char device failed: %s",
|
||||
strerror(errno));
|
||||
}
|
||||
error_setg_errno(errp, errno,
|
||||
"tap: open vhost char device failed");
|
||||
goto failed;
|
||||
}
|
||||
if (!g_unix_set_fd_nonblocking(vhostfd, true, NULL)) {
|
||||
|
@ -777,11 +768,8 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
|
|||
|
||||
s->vhost_net = vhost_net_init(&options);
|
||||
if (!s->vhost_net) {
|
||||
if (tap->has_vhostforce && tap->vhostforce) {
|
||||
error_setg(errp, VHOST_NET_INIT_FAILED);
|
||||
} else {
|
||||
warn_report(VHOST_NET_INIT_FAILED);
|
||||
}
|
||||
error_setg(errp,
|
||||
"vhost-net requested but could not be initialized");
|
||||
goto failed;
|
||||
}
|
||||
} else if (vhostfdname) {
|
||||
|
|
Loading…
Reference in New Issue