Files
linux/include/linux
Sebastian Andrzej Siewior 6510ea973d net: Use this_cpu_inc() to increment net->core_stats
The macro dev_core_stats_##FIELD##_inc() disables preemption and invokes
netdev_core_stats_alloc() to return a per-CPU pointer.
netdev_core_stats_alloc() will allocate memory on its first invocation
which breaks on PREEMPT_RT because it requires non-atomic context for
memory allocation.

This can be avoided by enabling preemption in netdev_core_stats_alloc()
assuming the caller always disables preemption.

It might be better to replace local_inc() with this_cpu_inc() now that
dev_core_stats_##FIELD##_inc() gained a preempt-disable section and does
not rely on already disabled preemption. This results in less
instructions on x86-64:
local_inc:
|          incl %gs:__preempt_count(%rip)  # __preempt_count
|          movq    488(%rdi), %rax # _1->core_stats, _22
|          testq   %rax, %rax      # _22
|          je      .L585   #,
|          add %gs:this_cpu_off(%rip), %rax        # this_cpu_off, tcp_ptr__
|  .L586:
|          testq   %rax, %rax      # _27
|          je      .L587   #,
|          incq (%rax)            # _6->a.counter
|  .L587:
|          decl %gs:__preempt_count(%rip)  # __preempt_count

this_cpu_inc(), this patch:
|         movq    488(%rdi), %rax # _1->core_stats, _5
|         testq   %rax, %rax      # _5
|         je      .L591   #,
| .L585:
|         incq %gs:(%rax) # _18->rx_dropped

Use unsigned long as type for the counter. Use this_cpu_inc() to
increment the counter. Use a plain read of the counter.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/YmbO0pxgtKpCw4SY@linutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2022-04-26 17:32:30 -07:00
..
2022-02-27 13:38:10 +00:00
2022-03-23 19:58:38 +01:00
2022-02-01 14:25:50 +02:00
2022-01-22 08:33:34 +02:00
2022-01-15 08:47:31 -08:00
2022-03-08 19:39:38 -07:00
2022-03-17 20:17:18 -07:00
2022-03-11 19:15:03 -08:00
2022-03-15 10:32:44 +01:00
2021-12-10 17:10:55 -08:00
2022-02-07 16:35:35 -08:00
2022-02-07 16:35:35 -08:00
2021-12-10 12:51:28 +01:00
2022-03-16 15:13:36 -07:00
2022-01-15 08:47:31 -08:00
2022-02-13 16:50:07 -08:00
2022-04-01 14:40:44 -04:00
2022-04-07 09:43:41 -04:00
2022-01-20 08:52:54 +02:00
2022-03-02 22:44:49 -08:00
2022-02-28 23:26:27 -08:00
2022-03-15 08:23:29 -04:00
2022-02-28 13:25:49 +01:00
2022-02-19 19:23:53 -08:00
2022-02-14 15:43:15 +01:00
2022-02-05 15:20:34 +00:00
2022-04-11 19:18:27 -06:00
2022-03-18 09:47:04 +01:00
2022-01-27 13:53:26 +00:00
2022-03-21 12:57:38 -04:00
2021-12-16 22:22:20 +01:00
2022-04-01 14:40:44 -04:00
2022-02-09 09:24:40 -05:00
2022-02-28 13:45:04 +02:00
2022-01-12 10:14:09 -06:00
2022-03-24 19:06:45 -07:00
2022-04-01 13:45:08 -04:00
2022-02-02 07:49:59 -07:00
2022-02-09 08:04:44 +01:00
2022-02-09 08:04:44 +01:00
2022-04-19 10:19:02 -07:00
2022-01-22 08:33:37 +02:00
2022-01-08 12:43:57 -06:00
2022-01-24 14:45:02 +01:00
2022-03-08 14:33:36 -06:00
2022-03-17 20:16:29 -07:00
2022-03-23 19:58:41 +01:00
2022-02-24 15:04:51 +00:00
2022-02-25 09:36:06 +01:00
2022-04-11 19:18:27 -06:00
2022-02-16 07:49:41 +01:00
2022-03-22 15:57:11 -07:00
2021-11-25 18:35:23 +01:00
2022-01-26 14:54:48 +01:00
2022-01-27 13:53:27 +00:00
2021-12-30 12:13:04 +01:00
2022-03-28 16:53:00 -04:00
2021-12-09 10:49:56 -08:00