1. 26 Jun, 2024 17 commits
  2. 25 Jun, 2024 21 commits
  3. 24 Jun, 2024 2 commits
    • Jakub Kicinski's avatar
      Merge branch 'locking-introduce-nested-bh-locking' · bf2468f9
      Jakub Kicinski authored
      Sebastian Andrzej Siewior says:
      
      ====================
      locking: Introduce nested-BH locking.
      
      Disabling bottoms halves acts as per-CPU BKL. On PREEMPT_RT code within
      local_bh_disable() section remains preemtible. As a result high prior
      tasks (or threaded interrupts) will be blocked by lower-prio task (or
      threaded interrupts) which are long running which includes softirq
      sections.
      
      The proposed way out is to introduce explicit per-CPU locks for
      resources which are protected by local_bh_disable() and use those only
      on PREEMPT_RT so there is no additional overhead for !PREEMPT_RT builds.
      
      The series introduces the infrastructure and converts large parts of
      networking which is largest stake holder here. Once this done the
      per-CPU lock from local_bh_disable() on PREEMPT_RT can be lifted.
      
      Performance testing. Baseline is net-next as of commit 93bda330
      ("Merge branch'net-constify-ctl_table-arguments-of-utility-functions'")
      plus v6.10-rc1. A 10GiG link is used between two hosts. The command
         xdp-bench redirect-cpu --cpu 3 --remote-action drop eth1 -e
      
      was invoked on the receiving side with a ixgbe. The sending side uses
      pktgen_sample03_burst_single_flow.sh on i40e.
      
      Baseline:
      | eth1->?                 9,018,604 rx/s                  0 err,drop/s
      |   receive total         9,018,604 pkt/s                 0 drop/s                0 error/s
      |     cpu:7               9,018,604 pkt/s                 0 drop/s                0 error/s
      |   enqueue to cpu 3      9,018,602 pkt/s                 0 drop/s             7.00 bulk-avg
      |     cpu:7->3            9,018,602 pkt/s                 0 drop/s             7.00 bulk-avg
      |   kthread total         9,018,606 pkt/s                 0 drop/s          214,698 sched
      |     cpu:3               9,018,606 pkt/s                 0 drop/s          214,698 sched
      |     xdp_stats                   0 pass/s        9,018,606 drop/s                0 redir/s
      |       cpu:3                     0 pass/s        9,018,606 drop/s                0 redir/s
      |   redirect_err                  0 error/s
      |   xdp_exception                 0 hit/s
      
      perf top --sort cpu,symbol --no-children:
      |   18.14%  007  [k] bpf_prog_4f0ffbb35139c187_cpumap_l4_hash
      |   13.29%  007  [k] ixgbe_poll
      |   12.66%  003  [k] cpu_map_kthread_run
      |    7.23%  003  [k] page_frag_free
      |    6.76%  007  [k] xdp_do_redirect
      |    3.76%  007  [k] cpu_map_redirect
      |    3.13%  007  [k] bq_flush_to_queue
      |    2.51%  003  [k] xdp_return_frame
      |    1.93%  007  [k] try_to_wake_up
      |    1.78%  007  [k] _raw_spin_lock
      |    1.74%  007  [k] cpu_map_enqueue
      |    1.56%  003  [k] bpf_prog_57cd311f2e27366b_cpumap_drop
      
      With this series applied:
      | eth1->?                10,329,340 rx/s                  0 err,drop/s
      |   receive total        10,329,340 pkt/s                 0 drop/s                0 error/s
      |     cpu:6              10,329,340 pkt/s                 0 drop/s                0 error/s
      |   enqueue to cpu 3     10,329,338 pkt/s                 0 drop/s             8.00 bulk-avg
      |     cpu:6->3           10,329,338 pkt/s                 0 drop/s             8.00 bulk-avg
      |   kthread total        10,329,321 pkt/s                 0 drop/s           96,297 sched
      |     cpu:3              10,329,321 pkt/s                 0 drop/s           96,297 sched
      |     xdp_stats                   0 pass/s       10,329,321 drop/s                0 redir/s
      |       cpu:3                     0 pass/s       10,329,321 drop/s                0 redir/s
      |   redirect_err                  0 error/s
      |   xdp_exception                 0 hit/s
      
      perf top --sort cpu,symbol --no-children:
      |   20.90%  006  [k] bpf_prog_4f0ffbb35139c187_cpumap_l4_hash
      |   12.62%  006  [k] ixgbe_poll
      |    9.82%  003  [k] page_frag_free
      |    8.73%  003  [k] cpu_map_bpf_prog_run_xdp
      |    6.63%  006  [k] xdp_do_redirect
      |    4.94%  003  [k] cpu_map_kthread_run
      |    4.28%  006  [k] cpu_map_redirect
      |    4.03%  006  [k] bq_flush_to_queue
      |    3.01%  003  [k] xdp_return_frame
      |    1.95%  006  [k] _raw_spin_lock
      |    1.94%  003  [k] bpf_prog_57cd311f2e27366b_cpumap_drop
      
      This diff appears to be noise.
      
      v8: https://lore.kernel.org/all/20240619072253.504963-1-bigeasy@linutronix.de
      v7: https://lore.kernel.org/all/20240618072526.379909-1-bigeasy@linutronix.de
      v6: https://lore.kernel.org/all/20240612170303.3896084-1-bigeasy@linutronix.de
      v5: https://lore.kernel.org/all/20240607070427.1379327-1-bigeasy@linutronix.de
      v4: https://lore.kernel.org/all/20240604154425.878636-1-bigeasy@linutronix.de
      v3: https://lore.kernel.org/all/20240529162927.403425-1-bigeasy@linutronix.de
      v2: https://lore.kernel.org/all/20240503182957.1042122-1-bigeasy@linutronix.de
      v1: https://lore.kernel.org/all/20231215171020.687342-1-bigeasy@linutronix.de
      ====================
      
      Link: https://patch.msgid.link/20240620132727.660738-1-bigeasy@linutronix.deSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      bf2468f9
    • Sebastian Andrzej Siewior's avatar
      net: Move per-CPU flush-lists to bpf_net_context on PREEMPT_RT. · 3f9fe37d
      Sebastian Andrzej Siewior authored
      The per-CPU flush lists, which are accessed from within the NAPI callback
      (xdp_do_flush() for instance), are per-CPU. There are subject to the
      same problem as struct bpf_redirect_info.
      
      Add the per-CPU lists cpu_map_flush_list, dev_map_flush_list and
      xskmap_map_flush_list to struct bpf_net_context. Add wrappers for the
      access. The lists initialized on first usage (similar to
      bpf_net_ctx_get_ri()).
      
      Cc: "Björn Töpel" <bjorn@kernel.org>
      Cc: Alexei Starovoitov <ast@kernel.org>
      Cc: Andrii Nakryiko <andrii@kernel.org>
      Cc: Eduard Zingerman <eddyz87@gmail.com>
      Cc: Hao Luo <haoluo@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Fastabend <john.fastabend@gmail.com>
      Cc: Jonathan Lemon <jonathan.lemon@gmail.com>
      Cc: KP Singh <kpsingh@kernel.org>
      Cc: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
      Cc: Magnus Karlsson <magnus.karlsson@intel.com>
      Cc: Martin KaFai Lau <martin.lau@linux.dev>
      Cc: Song Liu <song@kernel.org>
      Cc: Stanislav Fomichev <sdf@google.com>
      Cc: Yonghong Song <yonghong.song@linux.dev>
      Acked-by: default avatarJesper Dangaard Brouer <hawk@kernel.org>
      Reviewed-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
      Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Link: https://patch.msgid.link/20240620132727.660738-16-bigeasy@linutronix.deSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      3f9fe37d