summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2005-09-29 13:23:34 +0000
committerglebius <glebius@FreeBSD.org>2005-09-29 13:23:34 +0000
commit678546cfbf6ba5267b9b10a06da241bf76a26cf8 (patch)
tree01af7a11eb0743a01196c97d97acb77144bbf423
parent3580b3628b6de0bcf600fecbb8c4ad4d7b424d5b (diff)
downloadFreeBSD-src-678546cfbf6ba5267b9b10a06da241bf76a26cf8.zip
FreeBSD-src-678546cfbf6ba5267b9b10a06da241bf76a26cf8.tar.gz
In em_process_receive_interrupts() store and clear adapter->fmt. This
make function reenterable. In the runtime the race is masked by serializing of em_process_receive_interrupts() either by interrupt thread, or by polling. The race can be triggered when polling is switched on or off.
-rw-r--r--sys/dev/em/if_em.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/dev/em/if_em.c b/sys/dev/em/if_em.c
index 1fd5467..f380e1e 100644
--- a/sys/dev/em/if_em.c
+++ b/sys/dev/em/if_em.c
@@ -2911,12 +2911,14 @@ em_process_receive_interrupts(struct adapter * adapter, int count)
adapter->fmp = NULL);
if (adapter->fmp != NULL) {
+ struct mbuf *m = adapter->fmp;
+
+ adapter->fmp = NULL;
EM_UNLOCK(adapter);
- (*ifp->if_input)(ifp, adapter->fmp);
+ (*ifp->if_input)(ifp, m);
EM_LOCK(adapter);
}
#endif
- adapter->fmp = NULL;
adapter->lmp = NULL;
}
} else {
OpenPOWER on IntegriCloud