Re: [PATCH 11/11 v2] ftrace: Add recording of functions that caused recursion
From: Petr Mladek <pmladek@suse.com>
Date: 2020-11-03 10:40:56
Also in:
linux-doc, linux-s390, linuxppc-dev, lkml
On Mon 2020-11-02 12:09:07, Steven Rostedt wrote:
On Mon, 2 Nov 2020 17:41:47 +0100 Petr Mladek [off-list ref] wrote:quoted
On Fri 2020-10-30 17:31:53, Steven Rostedt wrote:quoted
From: "Steven Rostedt (VMware)" <rostedt@goodmis.org> This adds CONFIG_FTRACE_RECORD_RECURSION that will record to a file "recursed_functions" all the functions that caused recursion while a callback to the function tracer was running.quoted
--- /dev/null +++ b/kernel/trace/trace_recursion_record.c + if (index >= CONFIG_FTRACE_RECORD_RECURSION_SIZE) + return; + + for (i = index - 1; i >= 0; i--) { + if (recursed_functions[i].ip == ip) { + cached_function = ip; + return; + } + } + + cached_function = ip; + + /* + * We only want to add a function if it hasn't been added before. + * Add to the current location before incrementing the count. + * If it fails to add, then increment the index (save in i) + * and try again. + */ + old = cmpxchg(&recursed_functions[index].ip, 0, ip); + if (old != 0) { + /* Did something else already added this for us? */ + if (old == ip) + return; + /* Try the next location (use i for the next index) */ + i = index + 1;What about index++; We basically want to run the code again with index + 1 limit.But something else could update nr_records, and we want to use that if nr_records is greater than i. Now, we could swap the use case, and have int index = 0; [..] i = atomic_read(&nr_records); if (i > index) index = i; [..] index++; goto again;quoted
Maybe, it even does not make sense to check the array again and we should just try to store the value into the next slot.We do this dance to prevent duplicates.
I see. My code was wrong. It reserved slot for the new "ip" by cmpxchg on nr_records. The "ip" was stored later so that any parallel call need not see that it is a dumplicate. Your code reserves the slot by cmpxchg of "ip". Any parallel call would fail to take the slot and see the "ip" in the next iteration. Best Regards, Petr