• Ding Tianhong's avatar
    clocksource/drivers/arm_arch_timer: Avoid infinite recursion when ftrace is enabled · adb4f11e
    Ding Tianhong authored
    On platforms with an arch timer erratum workaround, it's possible for
    arch_timer_reg_read_stable() to recurse into itself when certain
    tracing options are enabled, leading to stack overflows and related
    problems.
    
    For example, when PREEMPT_TRACER and FUNCTION_GRAPH_TRACER are
    selected, it's possible to trigger this with:
    
    $ mount -t debugfs nodev /sys/kernel/debug/
    $ echo function_graph > /sys/kernel/debug/tracing/current_tracer
    
    The problem is that in such cases, preempt_disable() instrumentation
    attempts to acquire a timestamp via trace_clock(), resulting in a call
    back to arch_timer_reg_read_stable(), and hence recursion.
    
    This patch changes arch_timer_reg_read_stable() to use
    preempt_{disable,enable}_notrace(), which avoids this.
    
    This problem is similar to the fixed by upstream commit 96b3d28b
    ("sched/clock: Prevent tracing recursion in sched_clock_cpu()").
    
    Fixes: 6acc71cc ("arm64: arch_timer: Allows a CPU-specific erratum to only affect a subset of CPUs")
    Signed-off-by: default avatarDing Tianhong <dingtianhong@huawei.com>
    Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
    adb4f11e
arch_timer.h 4.11 KB