mirror of
https://github.com/opnsense/src.git
synced 2026-06-10 17:22:46 -04:00
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:
parent
02aeba8374
commit
780c568fec
1 changed files with 5 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue