docs: netdev: break down the instance locking info per ops struct

Explicitly list all the ops structs and what locking they provide.
Use "ops locked" as a term for drivers which have ops called under
the instance lock.

Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Reviewed-by: Joe Damato <jdamato@fastly.com>
Link: https://patch.msgid.link/20250408195956.412733-8-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2025-04-08 12:59:54 -07:00
parent 99e44f39a8
commit 87eba404f2
1 changed files with 42 additions and 12 deletions

View File

@ -314,13 +314,8 @@ napi->poll:
softirq
will be called with interrupts disabled by netconsole.
struct netdev_queue_mgmt_ops synchronization rules
==================================================
All queue management ndo callbacks are holding netdev instance lock.
RTNL and netdev instance lock
=============================
netdev instance lock
====================
Historically, all networking control operations were protected by a single
global lock known as ``rtnl_lock``. There is an ongoing effort to replace this
@ -328,10 +323,13 @@ global lock with separate locks for each network namespace. Additionally,
properties of individual netdev are increasingly protected by per-netdev locks.
For device drivers that implement shaping or queue management APIs, all control
operations will be performed under the netdev instance lock. Currently, this
instance lock is acquired within the context of ``rtnl_lock``. The drivers
can also explicitly request instance lock to be acquired via
``request_ops_lock``. In the future, there will be an option for individual
operations will be performed under the netdev instance lock.
Drivers can also explicitly request instance lock to be held during ops
by setting ``request_ops_lock`` to true. Code comments and docs refer
to drivers which have ops called under the instance lock as "ops locked".
See also the documentation of the ``lock`` member of struct net_device.
In the future, there will be an option for individual
drivers to opt out of using ``rtnl_lock`` and instead perform their control
operations directly under the netdev instance lock.
@ -343,8 +341,40 @@ there are two sets of interfaces: ``dev_xxx`` and ``netif_xxx`` (e.g.,
acquiring the instance lock themselves, while the ``netif_xxx`` functions
assume that the driver has already acquired the instance lock.
struct net_device_ops
---------------------
``ndos`` are called without holding the instance lock for most drivers.
"Ops locked" drivers will have most of the ``ndos`` invoked under
the instance lock.
struct ethtool_ops
------------------
Similarly to ``ndos`` the instance lock is only held for select drivers.
For "ops locked" drivers all ethtool ops without exceptions should
be called under the instance lock.
struct net_shaper_ops
---------------------
All net shaper callbacks are invoked while holding the netdev instance
lock. ``rtnl_lock`` may or may not be held.
Note that supporting net shapers automatically enables "ops locking".
struct netdev_queue_mgmt_ops
----------------------------
All queue management callbacks are invoked while holding the netdev instance
lock. ``rtnl_lock`` may or may not be held.
Note that supporting struct netdev_queue_mgmt_ops automatically enables
"ops locking".
Notifiers and netdev instance lock
==================================
----------------------------------
For device drivers that implement shaping or queue management APIs,
some of the notifiers (``enum netdev_cmd``) are running under the netdev