[netdevice] Ensure driver transmit() and poll() will not be re-entered

When CONSOLE_SYSLOG is used, a DBG() from within a network device
driver may cause its transmit() or poll() methods to be unexpectedly
re-entered.  Since these methods are not intended to be re-entrant,
this can lead to undefined behaviour.

Add an explicit re-entrancy guard to both methods.  Note that this
must operate at a per-netdevice level, since there are legitimate
circumstances under which the netdev_tx() or netdev_poll() functions
may be re-entered (e.g. when using VLAN devices).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2021-04-10 16:53:52 +01:00
parent 0be8491b71
commit 78749542fc
2 changed files with 38 additions and 7 deletions

View File

@@ -451,6 +451,12 @@ struct net_device {
*/
#define NETDEV_IRQ_UNSUPPORTED 0x0008
/** Network device transmission is in progress */
#define NETDEV_TX_IN_PROGRESS 0x0010
/** Network device poll is in progress */
#define NETDEV_POLL_IN_PROGRESS 0x0020
/** Link-layer protocol table */
#define LL_PROTOCOLS __table ( struct ll_protocol, "ll_protocols" )