diff options
author | glebius <glebius@FreeBSD.org> | 2005-09-29 13:23:34 +0000 |
---|---|---|
committer | glebius <glebius@FreeBSD.org> | 2005-09-29 13:23:34 +0000 |
commit | 678546cfbf6ba5267b9b10a06da241bf76a26cf8 (patch) | |
tree | 01af7a11eb0743a01196c97d97acb77144bbf423 | |
parent | 3580b3628b6de0bcf600fecbb8c4ad4d7b424d5b (diff) | |
download | FreeBSD-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.c | 6 |
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 { |