All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH 0/9] local_clock() vs noinstr
@ 2023-05-08 21:19 Peter Zijlstra
  2023-05-08 21:19 ` [RFC][PATCH 1/9] seqlock/latch: Provide raw_read_seqcount_latch_retry() Peter Zijlstra
                   ` (9 more replies)
  0 siblings, 10 replies; 25+ messages in thread
From: Peter Zijlstra @ 2023-05-08 21:19 UTC (permalink / raw)
  To: bigeasy
  Cc: mark.rutland, maz, catalin.marinas, will, chenhuacai, kernel, hca,
	gor, agordeev, borntraeger, svens, pbonzini, wanpengli, vkuznets,
	tglx, mingo, bp, dave.hansen, x86, hpa, jgross, boris.ostrovsky,
	daniel.lezcano, kys, haiyangz, wei.liu, decui, rafael, peterz,
	longman, boqun.feng, pmladek, senozhatsky, rostedt, john.ogness,
	juri.lelli, vincent.guittot, dietmar.eggemann, bsegall, mgorman,
	bristot, vschneid, jstultz, sboyd, linux-kernel, loongarch,
	linux-s390, kvm, linux-hyperv, linux-pm

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


^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2023-05-17 11:15 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-08 21:19 [RFC][PATCH 0/9] local_clock() vs noinstr Peter Zijlstra
2023-05-08 21:19 ` [RFC][PATCH 1/9] seqlock/latch: Provide raw_read_seqcount_latch_retry() Peter Zijlstra
2023-05-09  8:13   ` Thomas Gleixner
2023-05-10  7:58   ` Petr Mladek
2023-05-08 21:19 ` [RFC][PATCH 2/9] time/sched_clock: Provide sched_clock_noinstr() Peter Zijlstra
2023-05-08 21:19 ` [RFC][PATCH 3/9] arm64/io: Always inline all of __raw_{read,write}[bwlq]() Peter Zijlstra
2023-05-09 14:51   ` Mark Rutland
2023-05-08 21:19 ` [RFC][PATCH 4/9] arm64/arch_timer: Provide noinstr sched_clock_read() functions Peter Zijlstra
2023-05-08 21:19 ` [RFC][PATCH 5/9] loongarch: Provide noinstr sched_clock_read() Peter Zijlstra
2023-05-08 21:19 ` [RFC][PATCH 6/9] s390/time: Provide sched_clock_noinstr() Peter Zijlstra
2023-05-09  6:13   ` Heiko Carstens
2023-05-09  6:42     ` Peter Zijlstra
2023-05-08 21:19 ` [RFC][PATCH 7/9] x86/tsc: " Peter Zijlstra
2023-05-08 21:44   ` Peter Zijlstra
2023-05-08 23:30     ` Wei Liu
2023-05-11 20:23       ` Peter Zijlstra
2023-05-11 23:11         ` Michael Kelley (LINUX)
2023-05-12  6:00           ` Peter Zijlstra
2023-05-17  2:26     ` Michael Kelley (LINUX)
2023-05-17 11:13       ` Peter Zijlstra
2023-05-08 21:19 ` [RFC][PATCH 8/9] sched/clock: Provide local_clock_noinstr() Peter Zijlstra
2023-05-08 21:20 ` [RFC][PATCH 9/9] cpuidle: Use local_clock_noinstr() Peter Zijlstra
2023-05-09 16:18   ` Rafael J. Wysocki
2023-05-09 19:02     ` Peter Zijlstra
2023-05-10 13:43 ` [RFC][PATCH 0/9] local_clock() vs noinstr Sebastian Andrzej Siewior

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.