summaryrefslogtreecommitdiffstats
path: root/sys/net/if_ethersubr.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2004-07-27 23:20:45 +0000
committerrwatson <rwatson@FreeBSD.org>2004-07-27 23:20:45 +0000
commitb463bc6c336f88c5c53b54a13c72ffd11be29e4e (patch)
tree093e047a9b2b8e29f6989662ecc21cb54dc302a4 /sys/net/if_ethersubr.c
parent858cb94e23c67389d48ae321fdd98dc21b3655e1 (diff)
downloadFreeBSD-src-b463bc6c336f88c5c53b54a13c72ffd11be29e4e.zip
FreeBSD-src-b463bc6c336f88c5c53b54a13c72ffd11be29e4e.tar.gz
Add a new network interface flag, IFF_NEEDSGIANT, which will allow
device drivers to declare that the ifp->if_start() method implemented by the driver requires Giant in order to operate correctly. Add a 'struct task' to 'struct ifnet' that can be used to execute a deferred ifp->if_start() in the event that if_start needs to be called in a Giant-free environment. To do this, introduce if_start(), a wrapper function for ifp->if_start(). If the interface can run MPSAFE, it directly dispatches into the interface start routine. If it can't run MPSAFE, we're running with debug.mpsafenet != 0, and Giant isn't currently held, the task is queued to execute in a swi holding Giant via if_start_deferred(). Modify if_handoff() to use if_start() instead of direct dispatch. Modify 802.11 to use if_start() instead of direct dispatch. This is intended to provide increased compatibility for non-MPSAFE network device drivers in the presence of Giant-free operation via asynchronous dispatch. However, this commit does not mark any network interfaces as IFF_NEEDSGIANT.
Diffstat (limited to 'sys/net/if_ethersubr.c')
-rw-r--r--sys/net/if_ethersubr.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c
index fb10e01..080dcfb 100644
--- a/sys/net/if_ethersubr.c
+++ b/sys/net/if_ethersubr.c
@@ -888,6 +888,8 @@ ether_ifattach(struct ifnet *ifp, const u_int8_t *llc)
break;
if (i != ifp->if_addrlen)
if_printf(ifp, "Ethernet address: %6D\n", llc, ":");
+ if (debug_mpsafenet && (ifp->if_flags & IFF_NEEDSGIANT) != 0)
+ if_printf(ifp, "if_start running deferred for Giant\n");
}
/*
OpenPOWER on IntegriCloud