Re: [PATCH net-next v7] net/core: Introduce netdev_core_stats_inc()

Yajun Deng
2023-10-09T08:36:57Z

On 2023/10/9 16:20, Eric Dumazet wrote:
> On Mon, Oct 9, 2023 at 10:14 AM Yajun Deng <yajun.deng@linux.dev> wrote:
>>
>> On 2023/10/9 15:53, Eric Dumazet wrote:
>>> On Mon, Oct 9, 2023 at 5:07 AM Yajun Deng <yajun.deng@linux.dev> wrote:
>>>
>>>> 'this_cpu_read + this_cpu_write' and 'pr_info + this_cpu_inc' will make
>>>> the trace work well.
>>>>
>>>> They all have 'pop' instructions in them. This may be the key to making
>>>> the trace work well.
>>>>
>>>> Hi all,
>>>>
>>>> I need your help on percpu and ftrace.
>>>>
>>> I do not think you made sure netdev_core_stats_inc() was never inlined.
>>>
>>> Adding more code in it is simply changing how the compiler decides to
>>> inline or not.
>>
>> Yes, you are right. It needs to add the 'noinline' prefix. The
>> disassembly code will have 'pop'
>>
>> instruction.
>>
> The function was fine, you do not need anything like push or pop.
>
> The only needed stuff was the call __fentry__.
>
> The fact that the function was inlined for some invocations was the
> issue, because the trace point
> is only planted in the out of line function.

But somehow the following code isn't inline? They didn't need to add the
'noinline' prefix.

+ field = (unsigned long *)((void *)this_cpu_ptr(p) + offset);
+ WRITE_ONCE(*field, READ_ONCE(*field) + 1);

Or
+ (*(unsigned long *)((void *)this_cpu_ptr(p) + offset))++;