Page MenuHomeFreeBSD

D20973.id59828.diff
No OneTemporary

D20973.id59828.diff

Index: usr.sbin/bhyve/mevent.h
===================================================================
--- usr.sbin/bhyve/mevent.h
+++ usr.sbin/bhyve/mevent.h
@@ -43,6 +43,9 @@
struct mevent *mevent_add(int fd, enum ev_type type,
void (*func)(int, enum ev_type, void *),
void *param);
+struct mevent *mevent_add_disabled(int fd, enum ev_type type,
+ void (*func)(int, enum ev_type, void *),
+ void *param);
int mevent_enable(struct mevent *evp);
int mevent_disable(struct mevent *evp);
int mevent_delete(struct mevent *evp);
Index: usr.sbin/bhyve/mevent.c
===================================================================
--- usr.sbin/bhyve/mevent.c
+++ usr.sbin/bhyve/mevent.c
@@ -62,10 +62,11 @@
#define MEVENT_MAX 64
-#define MEV_ADD 1
-#define MEV_ENABLE 2
-#define MEV_DISABLE 3
-#define MEV_DEL_PENDING 4
+#define MEV_ADD 1
+#define MEV_ENABLE 2
+#define MEV_DISABLE 3
+#define MEV_DEL_PENDING 4
+#define MEV_ADD_DISABLED 5
extern char *vmname;
@@ -161,6 +162,9 @@
case MEV_ADD:
ret = EV_ADD; /* implicitly enabled */
break;
+ case MEV_ADD_DISABLED:
+ ret = EV_ADD | EV_DISABLE;
+ break;
case MEV_ENABLE:
ret = EV_ENABLE;
break;
@@ -249,9 +253,10 @@
}
}
-struct mevent *
-mevent_add(int tfd, enum ev_type type,
- void (*func)(int, enum ev_type, void *), void *param)
+static struct mevent *
+mevent_add_en(int tfd, enum ev_type type,
+ void (*func)(int, enum ev_type, void *), void *param,
+ int enabled)
{
struct mevent *lp, *mevp;
@@ -299,13 +304,29 @@
LIST_INSERT_HEAD(&change_head, mevp, me_list);
mevp->me_cq = 1;
- mevp->me_state = MEV_ADD;
+ mevp->me_state = enabled ? MEV_ADD : MEV_ADD_DISABLED;
mevent_notify();
exit:
mevent_qunlock();
return (mevp);
+}
+
+struct mevent *
+mevent_add(int tfd, enum ev_type type,
+ void (*func)(int, enum ev_type, void *), void *param)
+{
+
+ return mevent_add_en(tfd, type, func, param, /*enabled=*/1);
+}
+
+struct mevent *
+mevent_add_disabled(int tfd, enum ev_type type,
+ void (*func)(int, enum ev_type, void *), void *param)
+{
+
+ return mevent_add_en(tfd, type, func, param, /*enabled=*/0);
}
static int
Index: usr.sbin/bhyve/net_backends.h
===================================================================
--- usr.sbin/bhyve/net_backends.h
+++ usr.sbin/bhyve/net_backends.h
@@ -46,6 +46,8 @@
ssize_t netbe_send(net_backend_t *be, struct iovec *iov, int iovcnt);
ssize_t netbe_recv(net_backend_t *be, struct iovec *iov, int iovcnt);
ssize_t netbe_rx_discard(net_backend_t *be);
+void netbe_rx_disable(net_backend_t *be);
+void netbe_rx_enable(net_backend_t *be);
/*
Index: usr.sbin/bhyve/net_backends.c
===================================================================
--- usr.sbin/bhyve/net_backends.c
+++ usr.sbin/bhyve/net_backends.c
@@ -110,6 +110,16 @@
ssize_t (*recv)(struct net_backend *be, struct iovec *iov, int iovcnt);
/*
+ * Ask the backend to enable (state != 0) or disable (state == 0)
+ * receive operation in the backend. On return from a disable
+ * operation, it is guaranteed that the receive callback won't be
+ * called until receive is enabled again. Note however that it is up
+ * to the caller to make sure that netbe_recv() is not currently
+ * being executed by another thread.
+ */
+ void (*recv_enable)(struct net_backend *be, int state);
+
+ /*
* Ask the backend for the virtio-net features it is able to
* support. Possible features are TSO, UFO and checksum offloading
* in both rx and tx direction and for both IPv4 and IPv6.
@@ -248,6 +258,18 @@
return (ret);
}
+static void
+tap_recv_enable(struct net_backend *be, int state)
+{
+ struct tap_priv *priv = (struct tap_priv *)be->opaque;
+
+ if (state) {
+ mevent_enable(priv->mevp);
+ } else {
+ mevent_disable(priv->mevp);
+ }
+}
+
static uint64_t
tap_get_cap(struct net_backend *be)
{
@@ -270,6 +292,7 @@
.cleanup = tap_cleanup,
.send = tap_send,
.recv = tap_recv,
+ .recv_enable = tap_recv_enable,
.get_cap = tap_get_cap,
.set_cap = tap_set_cap,
};
@@ -282,6 +305,7 @@
.cleanup = tap_cleanup,
.send = tap_send,
.recv = tap_recv,
+ .recv_enable = tap_recv_enable,
.get_cap = tap_get_cap,
.set_cap = tap_set_cap,
};
@@ -571,6 +595,18 @@
return (totlen);
}
+static void
+netmap_recv_enable(struct net_backend *be, int state)
+{
+ struct netmap_priv *priv = (struct netmap_priv *)be->opaque;
+
+ if (state) {
+ mevent_enable(priv->mevp);
+ } else {
+ mevent_disable(priv->mevp);
+ }
+}
+
static struct net_backend netmap_backend = {
.prefix = "netmap",
.priv_size = sizeof(struct netmap_priv),
@@ -578,6 +614,7 @@
.cleanup = netmap_cleanup,
.send = netmap_send,
.recv = netmap_recv,
+ .recv_enable = netmap_recv_enable,
.get_cap = netmap_get_cap,
.set_cap = netmap_set_cap,
};
@@ -590,6 +627,7 @@
.cleanup = netmap_cleanup,
.send = netmap_send,
.recv = netmap_recv,
+ .recv_enable = netmap_recv_enable,
.get_cap = netmap_get_cap,
.set_cap = netmap_set_cap,
};
@@ -805,3 +843,16 @@
return netbe_recv(be, &iov, 1);
}
+void
+netbe_rx_disable(struct net_backend *be)
+{
+
+ return be->recv_enable(be, /*enable=*/0);
+}
+
+void
+netbe_rx_enable(struct net_backend *be)
+{
+
+ return be->recv_enable(be, /*enable=*/1);
+}

File Metadata

Mime Type
text/plain
Expires
Mon, Jul 27, 3:53 PM (4 h, 37 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35607591
Default Alt Text
D20973.id59828.diff (5 KB)

Event Timeline