Thread (12 messages) 12 messages, 2 authors, 2020-11-04

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help