OSDN Git Service

doc: Give XDP as example of non-obvious RCU reader/updater pairing
authorToke Høiland-Jørgensen <toke@redhat.com>
Thu, 24 Jun 2021 16:05:53 +0000 (18:05 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 24 Jun 2021 17:41:14 +0000 (19:41 +0200)
This commit gives an example of non-obvious RCU reader/updater pairing
in the guise of the XDP feature in networking, which calls BPF programs
from network-driver NAPI (softirq) context.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20210624160609.292325-4-toke@redhat.com
Documentation/RCU/checklist.rst

index 07f6cb8..01cc21f 100644 (file)
@@ -236,8 +236,15 @@ over a rather long period of time, but improvements are always welcome!
 
        Mixing things up will result in confusion and broken kernels, and
        has even resulted in an exploitable security issue.  Therefore,
-       when using non-obvious pairs of primitives, commenting is of
-       course a must.
+       when using non-obvious pairs of primitives, commenting is
+       of course a must.  One example of non-obvious pairing is
+       the XDP feature in networking, which calls BPF programs from
+       network-driver NAPI (softirq) context.  BPF relies heavily on RCU
+       protection for its data structures, but because the BPF program
+       invocation happens entirely within a single local_bh_disable()
+       section in a NAPI poll cycle, this usage is safe.  The reason
+       that this usage is safe is that readers can use anything that
+       disables BH when updaters use call_rcu() or synchronize_rcu().
 
 8.     Although synchronize_rcu() is slower than is call_rcu(), it
        usually results in simpler code.  So, unless update performance is