scheduler.stp: Handle missing symbols. Compiler output code optimization leads to missing debug data for some target variables, in particular some inline functions parameters, e.g. context_switch. Handle this by testing for variable name resolvability and provide default variable values in case no suitable target data is available through variable name. Affected functions: ctxswitch,wakeup. This fix does not affect the intended context switch tracing. Upstream-Status: Pending Signed-off-by: George Nita diff --git a/tapset/linux/scheduler.stp b/tapset/linux/scheduler.stp index 7596a46..539a0f1 100644 --- a/tapset/linux/scheduler.stp +++ b/tapset/linux/scheduler.stp @@ -120,7 +120,7 @@ probe scheduler.ctxswitch = kernel.trace("sched_switch") !, %( arch != "x86_64" && arch != "ia64" && arch != "arm" %? kernel.function("__switch_to") %: - kernel.function("context_switch") + kernel.function("prepare_task_switch") %) { name = "ctxswitch" @@ -140,7 +140,7 @@ probe scheduler.ctxswitch = kernel.trace("sched_switch") !, prev_task_name = task_execname($prev_p) prevtsk_state = $prev_p->state } - else { + else if (@defined($prev)) { prev_priority = $prev->prio prev_pid = $prev->tgid prev_tid = $prev->pid @@ -148,6 +148,15 @@ probe scheduler.ctxswitch = kernel.trace("sched_switch") !, prev_task_name = task_execname($prev) prevtsk_state = $prev->state } + else { + prev_priority = 0 + prev_pid = 0 + prev_tid = 0 + /* No prev_task, dummy */ + prev_task = task_current() + prev_task_name = "UNAVAILABLE" + prevtsk_state = 0 + } if (@defined($next)) { next_priority = $next->prio @@ -165,7 +174,7 @@ probe scheduler.ctxswitch = kernel.trace("sched_switch") !, next_task_name = task_execname($next_p) nexttsk_state = $next_p->state } - else { + else if (@defined($new)) { next_priority = $new->prio next_pid = $new->tgid next_tid = $new->pid @@ -173,6 +182,14 @@ probe scheduler.ctxswitch = kernel.trace("sched_switch") !, next_task_name = task_execname($new) nexttsk_state = $new->state } + else { + next_task = task_current() + next_priority = task_prio(next_task) + next_pid = task_pid(next_task) + next_tid = task_tid(next_task) + next_task_name = task_execname(next_task) + nexttsk_state = task_state(next_task) + } } @@ -254,12 +271,22 @@ probe scheduler.wakeup = kernel.function("try_to_wake_up") { name = "wakeup" - task = $p - task_pid = $p->tgid - task_tid = $p->pid - task_priority = $p->prio - task_cpu = task_cpu($p) - task_state = task_state($p) + if (@defined($p)) { + task = $p + task_pid = $p->tgid + task_tid = $p->pid + task_priority = $p->prio + task_cpu = task_cpu($p) + task_state = task_state($p) + } + else { + task = task_current() + task_pid = task_pid(task) + task_tid = task_tid(task) + task_priority = task_prio(task) + task_cpu = task_cpu(task) + task_state = task_state(task) + } } /**