Message ID | 20240311162307.545385-5-idosch@nvidia.com (mailing list archive) |
---|---|
State | Accepted |
Commit | e006858f1a1c6e8ba8aeff67e9b15700f70174da |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | nexthop: Fix two nexthop group statistics issues | expand |
On 3/11/24 10:23 AM, Ido Schimmel wrote: > Locally generated packets can increment the new nexthop statistics from > process context, resulting in the following splat [1] due to preemption > being enabled. Fix by using get_cpu_ptr() / put_cpu_ptr() which will > which take care of disabling / enabling preemption. > > BUG: using smp_processor_id() in preemptible [00000000] code: ping/949 > caller is nexthop_select_path+0xcf8/0x1e30 > CPU: 12 PID: 949 Comm: ping Not tainted 6.8.0-rc7-custom-gcb450f605fae #11 > Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc38 04/01/2014 > Call Trace: > <TASK> > dump_stack_lvl+0xbd/0xe0 > check_preemption_disabled+0xce/0xe0 > nexthop_select_path+0xcf8/0x1e30 > fib_select_multipath+0x865/0x18b0 > fib_select_path+0x311/0x1160 > ip_route_output_key_hash_rcu+0xe54/0x2720 > ip_route_output_key_hash+0x193/0x380 > ip_route_output_flow+0x25/0x130 > raw_sendmsg+0xbab/0x34a0 > inet_sendmsg+0xa2/0xe0 > __sys_sendto+0x2ad/0x430 > __x64_sys_sendto+0xe5/0x1c0 > do_syscall_64+0xc5/0x1d0 > entry_SYSCALL_64_after_hwframe+0x63/0x6b > [...] > > Fixes: f4676ea74b85 ("net: nexthop: Add nexthop group entry stats") > Signed-off-by: Ido Schimmel <idosch@nvidia.com> > --- > net/ipv4/nexthop.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > Reviewed-by: David Ahern <dsahern@kernel.org>
diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c index 0011b0076c5b..aaf940d15afe 100644 --- a/net/ipv4/nexthop.c +++ b/net/ipv4/nexthop.c @@ -673,10 +673,11 @@ static void nh_grp_entry_stats_inc(struct nh_grp_entry *nhge) { struct nh_grp_entry_stats *cpu_stats; - cpu_stats = this_cpu_ptr(nhge->stats); + cpu_stats = get_cpu_ptr(nhge->stats); u64_stats_update_begin(&cpu_stats->syncp); u64_stats_inc(&cpu_stats->packets); u64_stats_update_end(&cpu_stats->syncp); + put_cpu_ptr(cpu_stats); } static void nh_grp_entry_stats_read(struct nh_grp_entry *nhge,
Locally generated packets can increment the new nexthop statistics from process context, resulting in the following splat [1] due to preemption being enabled. Fix by using get_cpu_ptr() / put_cpu_ptr() which will which take care of disabling / enabling preemption. BUG: using smp_processor_id() in preemptible [00000000] code: ping/949 caller is nexthop_select_path+0xcf8/0x1e30 CPU: 12 PID: 949 Comm: ping Not tainted 6.8.0-rc7-custom-gcb450f605fae #11 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc38 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0xbd/0xe0 check_preemption_disabled+0xce/0xe0 nexthop_select_path+0xcf8/0x1e30 fib_select_multipath+0x865/0x18b0 fib_select_path+0x311/0x1160 ip_route_output_key_hash_rcu+0xe54/0x2720 ip_route_output_key_hash+0x193/0x380 ip_route_output_flow+0x25/0x130 raw_sendmsg+0xbab/0x34a0 inet_sendmsg+0xa2/0xe0 __sys_sendto+0x2ad/0x430 __x64_sys_sendto+0xe5/0x1c0 do_syscall_64+0xc5/0x1d0 entry_SYSCALL_64_after_hwframe+0x63/0x6b [...] Fixes: f4676ea74b85 ("net: nexthop: Add nexthop group entry stats") Signed-off-by: Ido Schimmel <idosch@nvidia.com> --- net/ipv4/nexthop.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)