Commit 7b68621f authored by Steven Rostedt (VMware)'s avatar Steven Rostedt (VMware)
Browse files

ftrace: Clean up the recursion code a bit



In trace_test_and_set_recursion(), current->trace_recursion is placed into a
variable, and that variable should be used for the processing, as there's no
reason to dereference current multiple times.

On trace_clear_recursion(), current->trace_recursion is modified and there's
no reason to copy it over to a variable.

Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent 60602cb5
Loading
Loading
Loading
Loading
+7 −15
Original line number Original line Diff line number Diff line
@@ -162,7 +162,7 @@ extern void ftrace_record_recursion(unsigned long ip, unsigned long parent_ip);
static __always_inline int trace_test_and_set_recursion(unsigned long ip, unsigned long pip,
static __always_inline int trace_test_and_set_recursion(unsigned long ip, unsigned long pip,
							int start, int max)
							int start, int max)
{
{
	unsigned int val = current->trace_recursion;
	unsigned int val = READ_ONCE(current->trace_recursion);
	int bit;
	int bit;


	/* A previous recursion check was made */
	/* A previous recursion check was made */
@@ -176,17 +176,14 @@ static __always_inline int trace_test_and_set_recursion(unsigned long ip, unsign
		 * a switch between contexts. Allow for a single recursion.
		 * a switch between contexts. Allow for a single recursion.
		 */
		 */
		bit = TRACE_TRANSITION_BIT;
		bit = TRACE_TRANSITION_BIT;
		if (trace_recursion_test(bit)) {
		if (val & (1 << bit)) {
			do_ftrace_record_recursion(ip, pip);
			do_ftrace_record_recursion(ip, pip);
			return -1;
			return -1;
		}
		}
		trace_recursion_set(bit);
	} else {
		barrier();
		return bit + 1;
	}

		/* Normal check passed, clear the transition to allow it again */
		/* Normal check passed, clear the transition to allow it again */
	trace_recursion_clear(TRACE_TRANSITION_BIT);
		val &= ~(1 << TRACE_TRANSITION_BIT);
	}


	val |= 1 << bit;
	val |= 1 << bit;
	current->trace_recursion = val;
	current->trace_recursion = val;
@@ -197,17 +194,12 @@ static __always_inline int trace_test_and_set_recursion(unsigned long ip, unsign


static __always_inline void trace_clear_recursion(int bit)
static __always_inline void trace_clear_recursion(int bit)
{
{
	unsigned int val = current->trace_recursion;

	if (!bit)
	if (!bit)
		return;
		return;


	bit--;
	bit = 1 << bit;
	val &= ~bit;

	barrier();
	barrier();
	current->trace_recursion = val;
	bit--;
	trace_recursion_clear(bit);
}
}


/**
/**