Revision c269a24ce057abfc31130960e96ab197ef6ab196 authored by Jakub Kicinski on 06 January 2021, 18:40:06 UTC, committed by Jakub Kicinski on 09 January 2021, 03:27:41 UTC
There are two flavors of handling netdev registration:
 - ones called without holding rtnl_lock: register_netdev() and
   unregister_netdev(); and
 - those called with rtnl_lock held: register_netdevice() and
   unregister_netdevice().

While the semantics of the former are pretty clear, the same can't
be said about the latter. The netdev_todo mechanism is utilized to
perform some of the device unregistering tasks and it hooks into
rtnl_unlock() so the locked variants can't actually finish the work.
In general free_netdev() does not mix well with locked calls. Most
drivers operating under rtnl_lock set dev->needs_free_netdev to true
and expect core to make the free_netdev() call some time later.

The part where this becomes most problematic is error paths. There is
no way to unwind the state cleanly after a call to register_netdevice(),
since unreg can't be performed fully without dropping locks.

Make free_netdev() more lenient, and defer the freeing if device
is being unregistered. This allows error paths to simply call
free_netdev() both after register_netdevice() failed, and after
a call to unregister_netdevice() but before dropping rtnl_lock.

Simplify the error paths which are currently doing gymnastics
around free_netdev() handling.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 2b446e6
History
File Mode Size
partitions
Kconfig -rw-r--r-- 6.7 KB
Kconfig.iosched -rw-r--r-- 1.3 KB
Makefile -rw-r--r-- 1.7 KB
badblocks.c -rw-r--r-- 14.1 KB
bfq-cgroup.c -rw-r--r-- 38.5 KB
bfq-iosched.c -rw-r--r-- 236.6 KB
bfq-iosched.h -rw-r--r-- 36.7 KB
bfq-wf2q.c -rw-r--r-- 52.4 KB
bio-integrity.c -rw-r--r-- 12.5 KB
bio.c -rw-r--r-- 44.0 KB
blk-cgroup-rwstat.c -rw-r--r-- 3.4 KB
blk-cgroup-rwstat.h -rw-r--r-- 3.9 KB
blk-cgroup.c -rw-r--r-- 50.0 KB
blk-core.c -rw-r--r-- 47.9 KB
blk-crypto-fallback.c -rw-r--r-- 18.2 KB
blk-crypto-internal.h -rw-r--r-- 5.4 KB
blk-crypto.c -rw-r--r-- 11.9 KB
blk-exec.c -rw-r--r-- 2.6 KB
blk-flush.c -rw-r--r-- 15.1 KB
blk-integrity.c -rw-r--r-- 11.8 KB
blk-ioc.c -rw-r--r-- 10.1 KB
blk-iocost.c -rw-r--r-- 95.8 KB
blk-iolatency.c -rw-r--r-- 28.0 KB
blk-lib.c -rw-r--r-- 11.4 KB
blk-map.c -rw-r--r-- 15.7 KB
blk-merge.c -rw-r--r-- 30.4 KB
blk-mq-cpumap.c -rw-r--r-- 2.2 KB
blk-mq-debugfs-zoned.c -rw-r--r-- 435 bytes
blk-mq-debugfs.c -rw-r--r-- 24.4 KB
blk-mq-debugfs.h -rw-r--r-- 2.7 KB
blk-mq-pci.c -rw-r--r-- 1.3 KB
blk-mq-rdma.c -rw-r--r-- 1.3 KB
blk-mq-sched.c -rw-r--r-- 17.0 KB
blk-mq-sched.h -rw-r--r-- 2.4 KB
blk-mq-sysfs.c -rw-r--r-- 8.3 KB
blk-mq-tag.c -rw-r--r-- 17.0 KB
blk-mq-tag.h -rw-r--r-- 2.3 KB
blk-mq-virtio.c -rw-r--r-- 1.3 KB
blk-mq.c -rw-r--r-- 96.9 KB
blk-mq.h -rw-r--r-- 9.4 KB
blk-pm.c -rw-r--r-- 6.8 KB
blk-pm.h -rw-r--r-- 1.5 KB
blk-rq-qos.c -rw-r--r-- 7.1 KB
blk-rq-qos.h -rw-r--r-- 5.0 KB
blk-settings.c -rw-r--r-- 27.9 KB
blk-stat.c -rw-r--r-- 4.8 KB
blk-stat.h -rw-r--r-- 4.6 KB
blk-sysfs.c -rw-r--r-- 24.4 KB
blk-throttle.c -rw-r--r-- 67.7 KB
blk-timeout.c -rw-r--r-- 4.1 KB
blk-wbt.c -rw-r--r-- 19.8 KB
blk-wbt.h -rw-r--r-- 2.8 KB
blk-zoned.c -rw-r--r-- 14.3 KB
blk.h -rw-r--r-- 11.1 KB
bounce.c -rw-r--r-- 9.4 KB
bsg-lib.c -rw-r--r-- 9.9 KB
bsg.c -rw-r--r-- 11.1 KB
cmdline-parser.c -rw-r--r-- 4.9 KB
elevator.c -rw-r--r-- 18.5 KB
genhd.c -rw-r--r-- 52.8 KB
ioctl.c -rw-r--r-- 15.5 KB
ioprio.c -rw-r--r-- 5.1 KB
keyslot-manager.c -rw-r--r-- 10.9 KB
kyber-iosched.c -rw-r--r-- 27.8 KB
mq-deadline.c -rw-r--r-- 20.8 KB
opal_proto.h -rw-r--r-- 9.4 KB
scsi_ioctl.c -rw-r--r-- 22.6 KB
sed-opal.c -rw-r--r-- 62.5 KB
t10-pi.c -rw-r--r-- 7.8 KB

back to top