• Mathieu Desnoyers's avatar
    tracepoint: Fix tracepoint array element size mismatch · 9c0be3f6
    Mathieu Desnoyers authored
    commit 46e0c9be ("kernel: tracepoints: add support for relative
    references") changes the layout of the __tracepoint_ptrs section on
    architectures supporting relative references. However, it does so
    without turning struct tracepoint * const into const int elsewhere in
    the tracepoint code, which has the following side-effect:
    
    Setting mod->num_tracepoints is done in by module.c:
    
        mod->tracepoints_ptrs = section_objs(info, "__tracepoints_ptrs",
                                             sizeof(*mod->tracepoints_ptrs),
                                             &mod->num_tracepoints);
    
    Basically, since sizeof(*mod->tracepoints_ptrs) is a pointer size
    (rather than sizeof(int)), num_tracepoints is erroneously set to half the
    size it should be on 64-bit arch. So a module with an odd number of
    tracepoints misses the last tracepoint due to effect of integer
    division.
    
    So in the module going notifier:
    
            for_each_tracepoint_range(mod->tracepoints_ptrs,
                    mod->tracepoints_ptrs + mod->num_tracepoints,
                    tp_module_going_check_quiescent, NULL);
    
    the expression (mod->tracepoints_ptrs + mod->num_tracepoints) actually
    evaluates to something within the bounds of the array, but miss the
    last tracepoint if the number of tracepoints is odd on 64-bit arch.
    
    Fix this by introducing a new typedef: tracepoint_ptr_t, which
    is either "const int" on architectures that have PREL32 relocations,
    or "struct tracepoint * const" on architectures that does not have
    this feature.
    
    Also provide a new tracepoint_ptr_defer() static inline to
    encapsulate deferencing this type rather than duplicate code and
    ugly idefs within the for_each_tracepoint_range() implementation.
    
    This issue appears in 4.19-rc kernels, and should ideally be fixed
    before the end of the rc cycle.
    Acked-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Acked-by: default avatarJessica Yu <jeyu@kernel.org>
    Link: http://lkml.kernel.org/r/20181013191050.22389-1-mathieu.desnoyers@efficios.com
    Link: http://lkml.kernel.org/r/20180704083651.24360-7-ard.biesheuvel@linaro.org
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Bjorn Helgaas <bhelgaas@google.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: James Morris <james.morris@microsoft.com>
    Cc: James Morris <jmorris@namei.org>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Nicolas Pitre <nico@linaro.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Petr Mladek <pmladek@suse.com>
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: "Serge E. Hallyn" <serge@hallyn.com>
    Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Cc: Thomas Garnier <thgarnie@google.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
    9c0be3f6
tracepoint.c 15.6 KB