In netmap() call ether_input() within the network epoch.

This commit is contained in:
glebius 2020-01-23 01:35:02 +00:00
parent b61a3cc2ff
commit 0e2c86a326

View File

@ -437,11 +437,13 @@ ports attached to the switch)
#include <sys/socketvar.h> /* struct socket */ #include <sys/socketvar.h> /* struct socket */
#include <sys/malloc.h> #include <sys/malloc.h>
#include <sys/poll.h> #include <sys/poll.h>
#include <sys/proc.h>
#include <sys/rwlock.h> #include <sys/rwlock.h>
#include <sys/socket.h> /* sockaddrs */ #include <sys/socket.h> /* sockaddrs */
#include <sys/selinfo.h> #include <sys/selinfo.h>
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <sys/jail.h> #include <sys/jail.h>
#include <sys/epoch.h>
#include <net/vnet.h> #include <net/vnet.h>
#include <net/if.h> #include <net/if.h>
#include <net/if_var.h> #include <net/if_var.h>
@ -1146,9 +1148,11 @@ netmap_dtor(void *data)
static void static void
netmap_send_up(struct ifnet *dst, struct mbq *q) netmap_send_up(struct ifnet *dst, struct mbq *q)
{ {
struct epoch_tracker et;
struct mbuf *m; struct mbuf *m;
struct mbuf *head = NULL, *prev = NULL; struct mbuf *head = NULL, *prev = NULL;
NET_EPOCH_ENTER(et);
/* Send packets up, outside the lock; head/prev machinery /* Send packets up, outside the lock; head/prev machinery
* is only useful for Windows. */ * is only useful for Windows. */
while ((m = mbq_dequeue(q)) != NULL) { while ((m = mbq_dequeue(q)) != NULL) {
@ -1160,6 +1164,7 @@ netmap_send_up(struct ifnet *dst, struct mbq *q)
} }
if (head) if (head)
nm_os_send_up(dst, NULL, head); nm_os_send_up(dst, NULL, head);
NET_EPOCH_EXIT(et);
mbq_fini(q); mbq_fini(q);
} }