123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- Network Devices, the Kernel, and You!
- Introduction
- ============
- The following is a random collection of documentation regarding
- network devices.
- struct net_device allocation rules
- ==================================
- Network device structures need to persist even after module is unloaded and
- must be allocated with kmalloc. If device has registered successfully,
- it will be freed on last use by free_netdev. This is required to handle the
- pathologic case cleanly (example: rmmod mydriver </sys/class/net/myeth/mtu )
- There are routines in net_init.c to handle the common cases of
- alloc_etherdev, alloc_netdev. These reserve extra space for driver
- private data which gets freed when the network device is freed. If
- separately allocated data is attached to the network device
- (dev->priv) then it is up to the module exit handler to free that.
- struct net_device synchronization rules
- =======================================
- dev->open:
- Synchronization: rtnl_lock() semaphore.
- Context: process
- dev->stop:
- Synchronization: rtnl_lock() semaphore.
- Context: process
- Note1: netif_running() is guaranteed false
- Note2: dev->poll() is guaranteed to be stopped
- dev->do_ioctl:
- Synchronization: rtnl_lock() semaphore.
- Context: process
- dev->get_stats:
- Synchronization: dev_base_lock rwlock.
- Context: nominally process, but don't sleep inside an rwlock
- dev->hard_start_xmit:
- Synchronization: netif_tx_lock spinlock.
- When the driver sets NETIF_F_LLTX in dev->features this will be
- called without holding netif_tx_lock. In this case the driver
- has to lock by itself when needed. It is recommended to use a try lock
- for this and return NETDEV_TX_LOCKED when the spin lock fails.
- The locking there should also properly protect against
- set_multicast_list.
- Context: Process with BHs disabled or BH (timer),
- will be called with interrupts disabled by netconsole.
- Return codes:
- o NETDEV_TX_OK everything ok.
- o NETDEV_TX_BUSY Cannot transmit packet, try later
- Usually a bug, means queue start/stop flow control is broken in
- the driver. Note: the driver must NOT put the skb in its DMA ring.
- o NETDEV_TX_LOCKED Locking failed, please retry quickly.
- Only valid when NETIF_F_LLTX is set.
- dev->tx_timeout:
- Synchronization: netif_tx_lock spinlock.
- Context: BHs disabled
- Notes: netif_queue_stopped() is guaranteed true
- dev->set_multicast_list:
- Synchronization: netif_tx_lock spinlock.
- Context: BHs disabled
- dev->poll:
- Synchronization: __LINK_STATE_RX_SCHED bit in dev->state. See
- dev_close code and comments in net/core/dev.c for more info.
- Context: softirq
- will be called with interrupts disabled by netconsole.
|