[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230508211951.901961964@infradead.org>
Date: Mon, 08 May 2023 23:19:51 +0200
From: Peter Zijlstra <peterz@...radead.org>
To: bigeasy@...utronix.de
Cc: mark.rutland@....com, maz@...nel.org, catalin.marinas@....com,
will@...nel.org, chenhuacai@...nel.org, kernel@...0n.name,
hca@...ux.ibm.com, gor@...ux.ibm.com, agordeev@...ux.ibm.com,
borntraeger@...ux.ibm.com, svens@...ux.ibm.com,
pbonzini@...hat.com, wanpengli@...cent.com, vkuznets@...hat.com,
tglx@...utronix.de, mingo@...hat.com, bp@...en8.de,
dave.hansen@...ux.intel.com, x86@...nel.org, hpa@...or.com,
jgross@...e.com, boris.ostrovsky@...cle.com,
daniel.lezcano@...aro.org, kys@...rosoft.com,
haiyangz@...rosoft.com, wei.liu@...nel.org, decui@...rosoft.com,
rafael@...nel.org, peterz@...radead.org, longman@...hat.com,
boqun.feng@...il.com, pmladek@...e.com, senozhatsky@...omium.org,
rostedt@...dmis.org, john.ogness@...utronix.de,
juri.lelli@...hat.com, vincent.guittot@...aro.org,
dietmar.eggemann@....com, bsegall@...gle.com, mgorman@...e.de,
bristot@...hat.com, vschneid@...hat.com, jstultz@...gle.com,
sboyd@...nel.org, linux-kernel@...r.kernel.org,
loongarch@...ts.linux.dev, linux-s390@...r.kernel.org,
kvm@...r.kernel.org, linux-hyperv@...r.kernel.org,
linux-pm@...r.kernel.org
Subject: [RFC][PATCH 0/9] local_clock() vs noinstr
Hi all!
A recent commit of mine marked local_clock() as noinstr.
776f22913b8e ("sched/clock: Make local_clock() noinstr")
Sadly both me and objtool missed the fact that this is subly broken; but
Sebastian tripped over it [*]:
| vmlinux.o: warning: objtool: native_sched_clock+0x97: call to preempt_schedule_notrace_thunk() leaves .noinstr.text section
| vmlinux.o: warning: objtool: kvm_clock_read+0x22: call to preempt_schedule_notrace_thunk() leaves .noinstr.text section
| vmlinux.o: warning: objtool: local_clock+0xb4: call to preempt_schedule_notrace_thunk() leaves .noinstr.text section
Specifically, local_clock() (and many of the sched_clock() implementation is
relies upon) use preempt_{dis,en}able_notrace() which obviously calls out to
schedule().
Now, noinstr code *should* never trigger this and already run in
non-preemptible code. Specifically entry code should have IRQs disabled while
__cpuidle code should have preemption disabled.
So while it is mostly harmless, I figured it wouldn't be too hard to clean this
up a little -- but that was ~10 patches. Anyway, here goes...
Compile tested only on x86_64/s390/arm64 -- I've just fed it to the
robots.
---
arch/arm64/include/asm/arch_timer.h | 8 +----
arch/arm64/include/asm/io.h | 12 +++----
arch/loongarch/include/asm/loongarch.h | 2 +-
arch/loongarch/kernel/time.c | 6 ++--
arch/s390/include/asm/timex.h | 13 +++++---
arch/s390/kernel/time.c | 11 ++++++-
arch/x86/kernel/kvmclock.c | 4 +--
arch/x86/kernel/tsc.c | 38 ++++++++++++++++-----
arch/x86/xen/time.c | 3 +-
drivers/clocksource/arm_arch_timer.c | 60 ++++++++++++++++++++++++++--------
drivers/clocksource/hyperv_timer.c | 4 +--
drivers/cpuidle/cpuidle.c | 8 ++---
drivers/cpuidle/poll_state.c | 4 +--
include/clocksource/hyperv_timer.h | 4 +--
include/linux/rbtree_latch.h | 2 +-
include/linux/sched/clock.h | 17 +++++++++-
include/linux/seqlock.h | 15 +++++----
kernel/printk/printk.c | 2 +-
kernel/sched/clock.c | 19 +++++++----
kernel/time/sched_clock.c | 24 ++++++++++----
kernel/time/timekeeping.c | 4 +--
21 files changed, 176 insertions(+), 84 deletions(-)
* https://lkml.kernel.org/r/20230309072724.3F6zRkvw@linutronix.de
TL;DR: PREEMPT_DYNAMIC=n PREEMPT=y DEBUG_ENTRY=y
Powered by blists - more mailing lists