svn commit: r357293 - head/sys/net
Hans Petter Selasky
hselasky at FreeBSD.org
Thu Jan 30 12:04:03 UTC 2020
Author: hselasky
Date: Thu Jan 30 12:04:02 2020
New Revision: 357293
URL: https://svnweb.freebsd.org/changeset/base/357293
Log:
Widen EPOCH(9) usage in netisr.
Software interrupt handlers are allowed to sleep. In swi_net() there
is a read lock behind NETISR_RLOCK() which in turn ends up calling
msleep() which means the whole of swi_net() cannot be protected by an
EPOCH(9) section. By default the NETISR_LOCKING feature is disabled.
This issue was introduced by r357004. This is a preparation step for
replacing the functionality provided by r357004.
Found by: kib@
Sponsored by: Mellanox Technologies
Modified:
head/sys/net/netisr.c
Modified: head/sys/net/netisr.c
==============================================================================
--- head/sys/net/netisr.c Thu Jan 30 10:40:38 2020 (r357292)
+++ head/sys/net/netisr.c Thu Jan 30 12:04:02 2020 (r357293)
@@ -920,6 +920,7 @@ netisr_process_workstream_proto(struct netisr_workstre
static void
swi_net(void *arg)
{
+ struct epoch_tracker et;
#ifdef NETISR_LOCKING
struct rm_priotracker tracker;
#endif
@@ -931,7 +932,9 @@ swi_net(void *arg)
#ifdef DEVICE_POLLING
KASSERT(nws_count == 1,
("%s: device_polling but nws_count != 1", __func__));
+ NET_EPOCH_ENTER(et);
netisr_poll();
+ NET_EPOCH_EXIT(et);
#endif
#ifdef NETISR_LOCKING
NETISR_RLOCK(&tracker);
@@ -940,6 +943,7 @@ swi_net(void *arg)
KASSERT(!(nwsp->nws_flags & NWS_RUNNING), ("swi_net: running"));
if (nwsp->nws_flags & NWS_DISPATCHING)
goto out;
+ NET_EPOCH_ENTER(et);
nwsp->nws_flags |= NWS_RUNNING;
nwsp->nws_flags &= ~NWS_SCHEDULED;
while ((bits = nwsp->nws_pendingbits) != 0) {
@@ -950,6 +954,7 @@ swi_net(void *arg)
}
}
nwsp->nws_flags &= ~NWS_RUNNING;
+ NET_EPOCH_EXIT(et);
out:
NWS_UNLOCK(nwsp);
#ifdef NETISR_LOCKING
More information about the svn-src-head
mailing list