Skip to content
Snippets Groups Projects
Commit 45072073 authored by pengdonglin's avatar pengdonglin Committed by Treehugger Robot
Browse files

ANDROID: Fix invalid caller output in trace_sched_blocked_reason


I encountered an issue where Perfetto sometimes fails to display the
blocked function when a thread enters the D state.

The problem arises from the caller value in the trace_sched_blocked_reason,
and I observed the following outputs while using bpftrace:

bpftrace -e 't:sched:sched_blocked_reason /args.caller > 0 &&
args.caller < 0xFFFFFFFF/ {@[args.caller]=count();}'
Attaching 1 probe...
^C

@[0x26a8]: 1
@[0x188]: 1
@[0x3]: 1
@[0xf833]: 1
@[0x4]: 10
@[0x9]: 14
@[0x1]: 23

When try_to_wake_up is waking a thread executing __schedule, it can trigger
the trace_sched_blocked_reason. This function attempts to obtain the
thread's backtrace using __get_wchan. However, __get_wchan requires the
thread to be blocking in cpu_switch_to, which is not always the case.

                                         | set_current_state(TASK_UNINTERRUPTIBLE)
                                         | __schedule
                                         |   deactivate_task
                                         |     p->on_rq = 0
                                         |     dequeue_task
try_to_wake_up                           |   pick_next_task
  ttwu_state_match(TASK_UNINTERRUPTIBLE) |   context_switch
  p->on_rq == 0                          |     prepare_task_switch
  p->__state & TASK_UNINTERRUPTIBLE      |     switch_mm
    trace_sched_blocked_reason           |     __switch_to
      __get_wchan                        |       ......
        unwind_init_from_task            |       cpu_switch_to
          state->fp = thread_saved_fp(p) |         mov x10, #THREAD_CPU_CONTEXT
            // Load an invalid fp        |         add x8, x0, x10
                                         |         ......
                                         |         stp fp, x9, [x8], #16
                                         |         str lr, [x8]
                                         |         ......
                                         |         ret

To resolve this, we can move the trace_sched_blocked_reason call inside
__schedule to ensure accurate caller information.

Fixes: 44447dec ("ANDROID: sched: move blocked reason trace point to cover all class")
Change-Id: Ib63839107dbe835a52f191cceef9452d13e18785
Signed-off-by: default avatarpengdonglin <pengdonglin@xiaomi.com>
parent a02df60c
No related branches found
No related tags found
No related merge requests found
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment