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
This commit is contained in:
Hans Petter Selasky 2020-01-30 12:04:02 +00:00
parent 02aeba8374
commit 780c568fec

View file

@ -920,6 +920,7 @@ netisr_process_workstream_proto(struct netisr_workstream *nwsp, u_int proto)
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