[PATCH] arm64: avoid instrumenting atomic_ll_sc.o
Mark Rutland
mark.rutland at arm.com
Wed Sep 27 07:08:41 PDT 2017
On Wed, Sep 27, 2017 at 10:21:49AM +0100, Will Deacon wrote:
> On Tue, Sep 26, 2017 at 07:03:07PM +0100, Mark Rutland wrote:
> > Our out-of-line atomics are built with a special calling convention,
> > preventing pointless stack spilling, and allowing us to patch call sites
> > with ARMv8.1 atomic instructions.
> >
> > Instrumentation inserted by the compiler may result in calls to
> > functions not following this special calling convention, resulting in
> > registers being unexpectedly clobbered, and various problems resulting
> > from this.
> >
> > For example, if a kernel is built with KCOV and ARM64_LSE_ATOMICS, the
> > compiler inserts calls to __sanitizer_cov_trace_pc in the prologues of
> > the atomic functions. This has been observed to result in spurious
> > cmpxchg failures, leading to a hang early on in the boot process.
> >
> > This patch avoids such issues by preventing instrumentation of our
> > out-of-line atomics.
>
> Why doesn't decorating them with "notrace" like we do via the __LL_SC_INLINE
> macro help here? Do we just need to extend that somehow?
AFAICT, notrace only guarantees that profiling function calls won't be
generated, and that won't inhibit KASAN, UBSAN, KCOV, etc.
I think we need __noinstrument / NOINSTRUMENT_obj.o helpers that inhibit
*all* automated instrumentation, since there are a sufficient number of
places where we want that (vdso, efi stub, hyp, etc).
> > Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> > Cc: Catalin Marinas <catalin.marinas at arm.com>
> > Cc: Will Deacon <will.deacon at arm.com>
> > ---
> > arch/arm64/lib/Makefile | 4 ++++
> > 1 file changed, 4 insertions(+)
> >
> > diff --git a/arch/arm64/lib/Makefile b/arch/arm64/lib/Makefile
> > index a0abc14..8fea178 100644
> > --- a/arch/arm64/lib/Makefile
> > +++ b/arch/arm64/lib/Makefile
> > @@ -17,5 +17,9 @@ CFLAGS_atomic_ll_sc.o := -fcall-used-x0 -ffixed-x1 -ffixed-x2 \
> > -fcall-saved-x10 -fcall-saved-x11 -fcall-saved-x12 \
> > -fcall-saved-x13 -fcall-saved-x14 -fcall-saved-x15 \
> > -fcall-saved-x18
> > +GCOV_PROFILE_atomic_ll_sc.o := n
> > +KASAN_SANITIZE_atomic_ll_sc.o := n
> > +KCOV_INSTRUMENT_atomic_ll_sc.o := n
> > +UBSAN_SANITIZE_atomic_ll_sc.o := n
>
> Hmm... do we need similar things for the vDSO?
If it were written in C, yes.
> I can only spot the GCOV entry, and other architectures have a mixed
> bag of these.
I don't think we need that currently, given our vDSO is written in
assembly. I think we cargo-culted that from x86, where the vDSO is
written in C.
> It would be nice if there was something a little less ad-hoc and error
> prone provided by kbuild.
I completely agree. I'll have a go at the noinstrument approach above.
Thanks,
Mark.
More information about the linux-arm-kernel
mailing list