Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1dbd1951 authored by Li Zefan's avatar Li Zefan Committed by Steven Rostedt
Browse files

tracing: Fix preempt count leak



While running my ftrace stress test, this showed up:

BUG: sleeping function called from invalid context at mm/mmap.c:233
...
note: cat[3293] exited with preempt_count 1

The bug was introduced by commit 91e86e56
("tracing: Fix recursive user stack trace")

Cc: <stable@kernel.org>
Signed-off-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
LKML-Reference: <4D0089AC.1020802@cn.fujitsu.com>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent bd1c8b22
Loading
Loading
Loading
Loading
+2 −4
Original line number Original line Diff line number Diff line
@@ -1313,12 +1313,10 @@ ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, int pc)


	__this_cpu_inc(user_stack_count);
	__this_cpu_inc(user_stack_count);




	event = trace_buffer_lock_reserve(buffer, TRACE_USER_STACK,
	event = trace_buffer_lock_reserve(buffer, TRACE_USER_STACK,
					  sizeof(*entry), flags, pc);
					  sizeof(*entry), flags, pc);
	if (!event)
	if (!event)
		return;
		goto out_drop_count;
	entry	= ring_buffer_event_data(event);
	entry	= ring_buffer_event_data(event);


	entry->tgid		= current->tgid;
	entry->tgid		= current->tgid;
@@ -1333,8 +1331,8 @@ ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, int pc)
	if (!filter_check_discard(call, entry, buffer, event))
	if (!filter_check_discard(call, entry, buffer, event))
		ring_buffer_unlock_commit(buffer, event);
		ring_buffer_unlock_commit(buffer, event);


 out_drop_count:
	__this_cpu_dec(user_stack_count);
	__this_cpu_dec(user_stack_count);

 out:
 out:
	preempt_enable();
	preempt_enable();
}
}