jump label v7
Subsystems (11)
cover jump label v7
Hi,
Based on David Miller's suggestion this version re-works the architecture interfaces for jump labels. I have also added a documentation file, and re-freshed the patchset against the latest -tip tree.
The new architecture interface (quoting from the docs file), is as follows:
"
4) architecture interface
There are a few functions and macros which arches must implement in order to take advantage of this optimization. As previously mentioned, if there is no architecture support we simply fall back to a traditional, load, test, and jump sequence.
* add "HAVE_ARCH_JUMP_LABEL" to arch/<arch>/Kconfig to indicate support
* #define JUMP_LABEL_NOP_SIZE, arch/x86/include/asm/jump_label.h
* #define "JUMP_LABEL(tag, label, cond)", arch/x86/include/asm/jump_label.h
* add: void arch_jump_label_transform(struct jump_entry *entry, enum jump_label_type type) and
const u8 *arch_get_jump_label_nop(void)
see: arch/x86/kernel/jump_label.c
* finally add a definition for "struct jump_entry". This must be done in a separate .h file, b/c the modpost.c code uses this definition to sort the the jump label tabel in the vmlinux, so that it does not have to be sorted at runtime. see: arch/x86/include/asm/jump_entry.h
"
David, I re-worked the sparc64 to match the updated interfaces. The code should hopefully compile now, although I did not test the sparc bits.
thanks,
-Jason
David S. Miller (1):
sparc64: Add jump_label support
Jason Baron (9):
jump label: base patch
jump label: x86 support
jump label: tracepoint support
jump label: add module support
jump label: move ftrace_dyn_arch_init to common code jump label: sort jump table at build-time
jump label: initialize workqueue tracepoints *before* they are
registered
jump label: jump_label_text_reserved() to reserve our jump points jump label: add docs
Mathieu Desnoyers (1):
jump label: notifier atomic call chain notrace
Documentation/jump-label.txt | 140 +++++++++++ Makefile | 6 +- arch/Kconfig | 3 + arch/sparc/Kconfig | 1 + arch/sparc/include/asm/jump_entry.h | 16 ++ arch/sparc/include/asm/jump_label.h | 21 ++ arch/sparc/kernel/Makefile | 2 + arch/sparc/kernel/jump_label.c | 38 +++ arch/sparc/kernel/module.c | 6 + arch/x86/Kconfig | 1 + arch/x86/include/asm/alternative.h | 14 ++ arch/x86/include/asm/jump_entry.h | 28 +++ arch/x86/include/asm/jump_label.h | 23 ++ arch/x86/kernel/Makefile | 2 +- arch/x86/kernel/alternative.c | 71 ++++++- arch/x86/kernel/ftrace.c | 70 +------ arch/x86/kernel/jump_label.c | 47 ++++ arch/x86/kernel/kprobes.c | 3 +- arch/x86/kernel/module.c | 3 + arch/x86/kernel/ptrace.c | 1 + arch/x86/kernel/setup.c | 3 + include/asm-generic/vmlinux.lds.h | 22 ++- include/linux/jump_label.h | 75 ++++++ include/linux/module.h | 5 +- include/linux/tracepoint.h | 34 ++-- kernel/Makefile | 2 +- kernel/jump_label.c | 431 +++++++++++++++++++++++++++++++++++ kernel/kprobes.c | 3 +- kernel/module.c | 7 + kernel/notifier.c | 6 +- kernel/trace/ftrace.c | 13 +- kernel/trace/trace_workqueue.c | 10 +- kernel/tracepoint.c | 8 + scripts/mod/Makefile | 1 + scripts/mod/modpost.c | 71 ++++++- scripts/mod/modpost.h | 2 + 36 files changed, 1073 insertions(+), 116 deletions(-) create mode 100644 Documentation/jump-label.txt create mode 100644 arch/sparc/include/asm/jump_entry.h create mode 100644 arch/sparc/include/asm/jump_label.h create mode 100644 arch/sparc/kernel/jump_label.c create mode 100644 arch/x86/include/asm/jump_entry.h create mode 100644 arch/x86/include/asm/jump_label.h create mode 100644 arch/x86/kernel/jump_label.c create mode 100644 include/linux/jump_label.h create mode 100644 kernel/jump_label.c
PATCH 1/11 jump label: notifier atomic call chain notrace
From: Mathieu Desnoyers <[email protected]>
In LTTng, being able to use the atomic notifier from cpu idle entry to ensure the tracer flush the last events in the current subbuffer requires the rcu read-side to be marked "notrace", otherwise it can end up calling back into lockdep and the tracer.
Also apply to the the die notifier.
--- kernel/notifier.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
kernel/notifier.c +3 -3
@@ -148,7 +148,7 @@ int atomic_notifier_chain_unregister(struct atomic_notifier_head *nh,spin_lock_irqsave (&nh->lock, flags); ret =notifier_chain_unregister (&nh->head, n);spin_unlock_irqrestore (&nh->lock, flags); -synchronize_rcu (); +synchronize_sched ();return ret; }EXPORT_SYMBOL_GPL (atomic_notifier_chain_unregister);
@@ -178,9 +178,9 @@ int __kprobes __atomic_notifier_call_chain(struct atomic_notifier_head *nh, {int ret; -rcu_read_lock (); +rcu_read_lock_sched_notrace (); ret =notifier_call_chain (&nh->head, val, v, nr_to_call, nr_calls); -rcu_read_unlock (); +rcu_read_unlock_sched_notrace ();return ret; }EXPORT_SYMBOL_GPL (__atomic_notifier_call_chain);
Signature · 1 line
1.7.0.1
PATCH 2/11 jump label: base patch
In reply to Jason Baronbase patch to implement 'jump labeling'. Based on a new 'asm goto' inline assembly gcc mechanism, we can now branch to labels from an 'asm goto' statment. This allows us to create a 'no-op' fastpath, which can subsequently be patched with a jump to the slowpath code. This is useful for code which might be rarely used, but which we'd like to be able to call, if needed. Tracepoints are the current usecase that these are being implemented for.
--- arch/Kconfig | 3 + include/asm-generic/vmlinux.lds.h | 10 ++- include/linux/jump_label.h | 59 ++++++++++++ kernel/Makefile | 2 +- kernel/jump_label.c | 179 +++++++++++++++++++++++++++++++++++++ 5 files changed, 251 insertions(+), 2 deletions(-) create mode 100644 include/linux/jump_label.h create mode 100644 kernel/jump_label.c
arch/Kconfig +3 -0
@@ -140,4 +140,7 @@ config HAVE_HW_BREAKPOINT config HAVE_USER_RETURN_NOTIFIER bool +config HAVE_ARCH_JUMP_LABEL + bool + source "kernel/gcov/Kconfig"
include/asm-generic/vmlinux.lds.h +9 -1
@@ -167,7 +167,8 @@ BRANCH_PROFILE() \ TRACE_PRINTKS() \ FTRACE_EVENTS() \ -TRACE_SYSCALLS () + TRACE_SYSCALLS() \ +JUMP_TABLE () \/* * Data section helpers
@@ -206,6 +207,7 @@ *(__vermagic)/* Kernel version magic */ \ *(__markers_strings)/* Markers: strings */ \ *(__tracepoints_strings)/* Tracepoints: strings */ \ + *(__jump_strings)/* Jump: strings */ \ } \ \ .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \
@@ -557,6 +559,12 @@#define BUG_TABLE #endif +#define JUMP_TABLE () \ + . = ALIGN(64); \ + VMLINUX_SYMBOL(__start___jump_table) = .; \ + *(__jump_table) \ + VMLINUX_SYMBOL(__stop___jump_table) = .; \ +#ifdef CONFIG_PM_TRACE #define TRACEDATA \ . = ALIGN(4); \
include/linux/jump_label.h new file +59 -0
59 lines not on this page · raw message
kernel/Makefile +1 -1
@@ -10,7 +10,7 @@ obj-y = sched.o fork.o exec_domain.o panic.o printk.o \ kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \ hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \ notifier.o ksysfs.o pm_qos_params.o sched_clock.o cred.o \ - async.o range.o + async.o range.o jump_label.o obj-$(CONFIG_HAVE_EARLY_RES) += early_res.o obj-y += groups.o
kernel/jump_label.c new file +179 -0
179 lines not on this page · raw message
Signature · 1 line
1.7.0.1
PATCH 3/11 jump label: x86 support
In reply to Jason Baronadd x86 support for jump label. I'm keeping this patch separate so its clear to arch maintainers what was required for x86 support this new feature. hopefully, it wouldn't be too painful for other arches.
--- arch/x86/Kconfig | 1 + arch/x86/include/asm/jump_entry.h | 28 +++++++++++++++++ arch/x86/include/asm/jump_label.h | 27 ++++++++++++++++ arch/x86/kernel/Makefile | 2 +- arch/x86/kernel/jump_label.c | 60 +++++++++++++++++++++++++++++++++++++ 5 files changed, 117 insertions(+), 1 deletions(-) create mode 100644 arch/x86/include/asm/jump_entry.h create mode 100644 arch/x86/include/asm/jump_label.h create mode 100644 arch/x86/kernel/jump_label.c
arch/x86/Kconfig +1 -0
@@ -58,6 +58,7 @@ config X86 select ANON_INODES select HAVE_ARCH_KMEMCHECK select HAVE_USER_RETURN_NOTIFIER + select HAVE_ARCH_JUMP_LABEL config INSTRUCTION_DECODER def_bool (KPROBES || PERF_EVENTS)
arch/x86/include/asm/jump_entry.h new file +28 -0
@@ -0,0 +1,28 @@ +#ifndef _LINUX_JUMP_ENTRY_H +#define _LINUX_JUMP_ENTRY_H + +/* Defined in a separate file, so that it can be used by user program modpost.c +* This file is included by include/asm/jump_label.h, in turn included by +* include/linux/jump_label.h. Kernel sources should only include +* include/linux/jump_label.h. +**/ + +#ifdef CONFIG_X86_64 + +struct jump_entry { +__u64 code; +__u64 target; +__u64 name; +}; + +#else + +struct jump_entry { +__u32 code; +__u32 target; +__u32 name; +}; + +#endif + +#endif
arch/x86/include/asm/jump_label.h new file +27 -0
@@ -0,0 +1,27 @@ +#ifndef _ASM_X86_JUMP_LABEL_H +#define _ASM_X86_JUMP_LABEL_H + +#include <linux/types.h> +#include <asm/nops.h> +#include <asm/jump_entry.h> + +#define JUMP_LABEL_NOP_SIZE 5 + +#ifdef CONFIG_X86_64 +# define JUMP_LABEL_NOP P6_NOP5 +#else +# define JUMP_LABEL_NOP ".byte 0xe9 \n\t .long 0\n\t" +#endif + +#define JUMP_LABEL (tag, label, cond) \ + do { \ + extern const char __jlstrtab_##tag[]; \ + asm goto("1:" \ + JUMP_LABEL_NOP \ + ".pushsection __jump_table, \"a\" \n\t"\ + _ASM_PTR "1b, %l[" #label "], %c0 \n\t" \ + ".popsection \n\t" \ + : : "i" (__jlstrtab_##tag) : : label);\ + } while (0) + +#endif
arch/x86/kernel/Makefile +1 -1
@@ -32,7 +32,7 @@ GCOV_PROFILE_paravirt.o := n obj-y := process_$(BITS).o signal.o entry_$(BITS).o obj-y += traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o obj-y += time.o ioport.o ldt.o dumpstack.o -obj-y += setup.o x86_init.o i8259.o irqinit.o +obj-y += setup.o x86_init.o i8259.o irqinit.o jump_label.o obj-$(CONFIG_X86_VISWS) += visws_quirks.o obj-$(CONFIG_X86_32) += probe_roms_32.o obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o
arch/x86/kernel/jump_label.c new file +60 -0
60 lines not on this page · raw message
Signature · 1 line
1.7.0.1
PATCH 5/11 jump label: add module support
In reply to Jason BaronAdd support for 'jump label' for modules.
--- arch/x86/kernel/ptrace.c | 1 + include/linux/jump_label.h | 3 +- include/linux/module.h | 5 +- kernel/jump_label.c | 136 ++++++++++++++++++++++++++++++++++++++++++++ kernel/module.c | 7 ++ 5 files changed, 150 insertions(+), 2 deletions(-)
arch/x86/kernel/ptrace.c +1 -0
@@ -21,6 +21,7 @@#include <linux/signal.h> #include <linux/perf_event.h> #include <linux/hw_breakpoint.h> +#include <linux/module.h> #include <asm/uaccess.h> #include <asm/pgtable.h>
include/linux/jump_label.h +2 -1
@@ -20,7 +20,8 @@ extern struct jump_entry __stop___jump_table[];#define DEFINE_JUMP_LABEL (name) \ const char __jlstrtab_##name[] \ - __used __attribute__((section("__jump_strings"))) = #name; + __used __attribute__((section("__jump_strings"))) = #name; \ + EXPORT_SYMBOL_GPL(__jlstrtab_##name);extern void arch_jump_label_transform (struct jump_entry *entry,enum jump_label_type type);
include/linux/module.h +4 -1
@@ -343,7 +343,10 @@ struct modulestruct tracepoint *tracepoints;unsigned int num_tracepoints;#endif - +#ifdef HAVE_JUMP_LABEL +struct jump_entry *jump_entries; +unsigned int num_jump_entries; +#endif #ifdef CONFIG_TRACING const char **trace_bprintk_fmt_start;unsigned int num_trace_bprintk_fmt;
kernel/jump_label.c +136 -0
152 lines not on this page · raw message
kernel/module.c +7 -0
@@ -55,6 +55,7 @@#include <linux/async.h> #include <linux/percpu.h> #include <linux/kmemleak.h> +#include <linux/jump_label.h> #define CREATE_TRACE_POINTS #include <trace/events/module.h>
@@ -2311,6 +2312,12 @@ static noinline struct module *load_module(void __user *umod,sizeof (*mod->tracepoints), &mod->num_tracepoints);#endif +#ifdef HAVE_JUMP_LABEL + mod->jump_entries =section_objs (hdr, sechdrs, secstrings, +"__jump_table" , +sizeof (*mod->jump_entries), + &mod->num_jump_entries); +#endif #ifdef CONFIG_EVENT_TRACING mod->trace_events = section_objs(hdr, sechdrs, secstrings, "_ftrace_events",
Signature · 1 line
1.7.0.1
PATCH 4/11 jump label: tracepoint support
In reply to Jason BaronMake use of the jump label infrastructure for tracepoints.
--- include/linux/tracepoint.h | 34 +++++++++++++++++++--------------- kernel/tracepoint.c | 8 ++++++++ 2 files changed, 27 insertions(+), 15 deletions(-)
include/linux/tracepoint.h +19 -15
@@ -16,6 +16,7 @@#include <linux/types.h> #include <linux/rcupdate.h> +#include <linux/jump_label.h> struct module ;struct tracepoint ;
@@ -63,20 +64,22 @@ struct tracepoint {* not add unwanted padding between the beginning of the section and the * structure. Force alignment to the same alignment as the section start. */ -#define DECLARE_TRACE (name, proto, args) \ - extern struct tracepoint __tracepoint_##name; \ - static inline void trace_##name(proto) \ - { \ - if (unlikely(__tracepoint_##name.state)) \ - __DO_TRACE(&__tracepoint_##name, \ - TP_PROTO(proto), TP_ARGS(args)); \ - } \ - static inline int register_trace_##name(void (*probe)(proto)) \ - { \ - return tracepoint_probe_register(#name, (void *)probe); \ - } \ - static inline int unregister_trace_##name(void (*probe)(proto)) \ - { \ +#define DECLARE_TRACE (name, proto, args) \ + extern struct tracepoint __tracepoint_##name; \ + static inline void trace_##name(proto) \ + { \ + JUMP_LABEL(name, do_trace, __tracepoint_##name.state); \ + return; \ +do_trace: \ + __DO_TRACE(&__tracepoint_##name, \ + TP_PROTO(proto), TP_ARGS(args)); \ + } \ + static inline int register_trace_##name(void (*probe)(proto)) \ + { \ + return tracepoint_probe_register(#name, (void *)probe); \ + } \ + static inline int unregister_trace_##name(void (*probe)(proto)) \ + { \ return tracepoint_probe_unregister(#name, (void *)probe);\ }
@@ -86,7 +89,8 @@ struct tracepoint { __attribute__((section("__tracepoints_strings"))) = #name; \ struct tracepoint __tracepoint_##name \ __attribute__((section("__tracepoints"), aligned(32))) = \ - { __tpstrtab_##name, 0, reg, unreg, NULL } + { __tpstrtab_##name, 0, reg, unreg, NULL }; \ + DEFINE_JUMP_LABEL(name);#define DEFINE_TRACE (name) \ DEFINE_TRACE_FN(name, NULL, NULL);
kernel/tracepoint.c +8 -0
@@ -25,6 +25,7 @@#include <linux/err.h> #include <linux/slab.h> #include <linux/sched.h> +#include <linux/jump_label.h> extern struct tracepoint __start___tracepoints[];extern struct tracepoint __stop___tracepoints[];
@@ -256,6 +257,10 @@ static void set_tracepoint(struct tracepoint_entry **entry,* is used. */ rcu_assign_pointer (elem->funcs, (*entry)->funcs); +if (!elem->state && active) +enable_jump_label (elem->name); +if (elem->state && !active) +disable_jump_label (elem->name); elem->state = active; }
@@ -270,6 +275,9 @@ static void disable_tracepoint(struct tracepoint *elem)if (elem->unregfunc && elem->state) elem->unregfunc (); +if (elem->state) +disable_jump_label (elem->name); + elem->state =0 ;rcu_assign_pointer (elem->funcs,NULL ); }
Signature · 1 line
1.7.0.1
PATCH 6/11 jump label: move ftrace_dyn_arch_init to common code
In reply to Jason BaronMove Steve's code for finding the best 5-byte no-op from ftrace.c to alternative.c. The idea is that other consumers (in this case jump label) want to make use of that code. I've created a global: 'char ideal_nop[5]', that is setup during setup_arch that can be used.
--- arch/x86/include/asm/alternative.h | 14 +++++++ arch/x86/include/asm/jump_label.h | 10 ++---- arch/x86/kernel/alternative.c | 71 +++++++++++++++++++++++++++++++++++- arch/x86/kernel/ftrace.c | 70 +----------------------------------- arch/x86/kernel/jump_label.c | 19 ++-------- arch/x86/kernel/module.c | 3 ++ arch/x86/kernel/setup.c | 3 ++ include/linux/jump_label.h | 9 +++++ kernel/jump_label.c | 33 +++++++++++++++++ kernel/trace/ftrace.c | 13 +------ 10 files changed, 139 insertions(+), 106 deletions(-)
arch/x86/include/asm/alternative.h +14 -0
@@ -4,6 +4,7 @@#include <linux/types.h> #include <linux/stddef.h> #include <linux/stringify.h> +#include <linux/jump_label.h> #include <asm/asm.h> /*
@@ -153,6 +154,8 @@ static inline void apply_paravirt(struct paravirt_patch_site *start,#define __parainstructions_end NULL#endif +extern void *text_poke_early (void *addr,const void *opcode,size_t len); +/* * Clear and restore the kernel write-protection flag on the local CPU. * Allows the kernel to edit read-only pages.
@@ -173,4 +176,15 @@ static inline void apply_paravirt(struct paravirt_patch_site *start,extern void *text_poke (void *addr,const void *opcode,size_t len);extern void *text_poke_smp (void *addr,const void *opcode,size_t len); +#if defined(CONFIG_DYNAMIC_FTRACE ) || defined(HAVE_JUMP_LABEL ) +#define IDEAL_NOP_SIZE_5 5 +extern unsigned char ideal_nop5[IDEAL_NOP_SIZE_5 ]; +extern int arch_init_ideal_nop5 (void ); +#else +static inline int arch_init_ideal_nop5 (void ) +{ +return 0 ; +} +#endif +#endif /* _ASM_X86_ALTERNATIVE_H */
arch/x86/include/asm/jump_label.h +3 -7
@@ -7,17 +7,13 @@#define JUMP_LABEL_NOP_SIZE 5 -#ifdef CONFIG_X86_64 -# define JUMP_LABEL_NOP P6_NOP5 -#else -# define JUMP_LABEL_NOP ".byte 0xe9 \n\t .long 0\n\t" -#endif +# define JUMP_LABEL_INITIAL_NOP ".byte 0xe9 \n\t .long 0\n\t" -#define JUMP_LABEL (tag, label, cond) \ +# define JUMP_LABEL (tag, label, cond) \ do { \ extern const char __jlstrtab_##tag[]; \ asm goto("1:" \ - JUMP_LABEL_NOP \ + JUMP_LABEL_INITIAL_NOP \ ".pushsection __jump_table, \"a\" \n\t"\ _ASM_PTR "1b, %l[" #label "], %c0 \n\t" \ ".popsection \n\t" \
arch/x86/kernel/alternative.c +69 -2
86 lines not on this page · raw message
arch/x86/kernel/ftrace.c +1 -69
84 lines not on this page · raw message
arch/x86/kernel/jump_label.c +3 -16
@@ -30,19 +30,8 @@ void arch_jump_label_transform(struct jump_entry *entry, enum jump_label_type tyif (type ==JUMP_LABEL_ENABLE ) { code.jump =0xe9 ; code.offset = entry->target - (entry->code +JUMP_LABEL_NOP_SIZE ); - }else { -#ifdef CONFIG_X86_64 -/* opcode for P6_NOP5 */ - code.code[0 ] =0x0f ; - code.code[1 ] =0x1f ; - code.code[2 ] =0x44 ; - code.code[3 ] =0x00 ; - code.code[4 ] =0x00 ; -#else - code.jump =0xe9 ; - code.offset =0 ; -#endif - } + }else +memcpy (&code, ideal_nop5,JUMP_LABEL_NOP_SIZE );get_online_cpus ();mutex_lock (&text_mutex);text_poke_smp ((void *)entry->code, &code,JUMP_LABEL_NOP_SIZE );
@@ -50,11 +39,9 @@ void arch_jump_label_transform(struct jump_entry *entry, enum jump_label_type ty put_online_cpus(); } -static const u8 jump_label_nop[JUMP_LABEL_NOP_SIZE ] = {0x0f ,0x1f ,0x44 ,0x00 ,0x00 }; -const u8 *arch_get_jump_label_nop () { -return jump_label_nop; +return ideal_nop5; }#endif
arch/x86/kernel/module.c +3 -0
@@ -239,6 +239,9 @@ int module_finalize(const Elf_Ehdr *hdr,apply_paravirt (pseg, pseg + para->sh_size); } +/* make jump label nops */ +apply_jump_label_nops (me); +return module_bug_finalize (hdr, sechdrs, me); }
arch/x86/kernel/setup.c +3 -0
@@ -49,6 +49,7 @@#include <asm/pci-direct.h> #include <linux/init_ohci1394_dma.h> #include <linux/kvm_para.h> +#include <linux/jump_label.h> #include <linux/errno.h> #include <linux/kernel.h>
@@ -1051,6 +1052,8 @@ void __init setup_arch(char **cmdline_p) x86_init.oem.banner ();mcheck_init (); + +arch_init_ideal_nop5 (); }#ifdef CONFIG_X86_32
include/linux/jump_label.h +9 -0
@@ -13,6 +13,8 @@ enum jump_label_type { JUMP_LABEL_DISABLE }; +struct module ; +#ifdef HAVE_JUMP_LABEL extern struct jump_entry __start___jump_table[];
@@ -29,6 +31,8 @@ extern const u8 *arch_get_jump_label_nop(void);extern void jump_label_update (const char *name,enum jump_label_type type); +extern void apply_jump_label_nops (struct module *mod); +#define enable_jump_label (name) \ jump_label_update(name, JUMP_LABEL_ENABLE);
@@ -55,6 +59,11 @@ static inline int disable_jump_label(const char *name)return 0 ; } +static inline int apply_jump_label_nops (struct module *mod) +{ +return 0 ; +} +#endif #endif
kernel/jump_label.c +33 -0
@@ -185,10 +185,19 @@ void jump_label_update(const char *name, enum jump_label_type type)static int init_jump_label (void ) {int ret; +struct jump_entry *iter_start = __start___jump_table; +struct jump_entry *iter_stop = __start___jump_table; +struct jump_entry *iter;mutex_lock (&jump_label_mutex); ret =build_jump_label_hashtable (__start___jump_table, __stop___jump_table); + iter = iter_start; +while (iter < iter_stop) { +text_poke_early ((void *)iter->code,arch_get_jump_label_nop (), +JUMP_LABEL_NOP_SIZE ); + iter++; + }mutex_unlock (&jump_label_mutex);return ret; }
@@ -299,6 +308,30 @@ static int jump_label_module_notify(struct notifier_block *self, unsigned long vreturn ret; } +/*** +* apply_jump_label_nops - patch module jump labels with arch_get_jump_label_nop() +* @mod: module to patch +* +* Allow for run-time selection of the optimal nops. Before the module +* loads patch these with arch_get_jump_label_nop(), which is specified by +* the arch specific jump label code. +*/ +void apply_jump_label_nops (struct module *mod) +{ +struct jump_entry *iter; + +/* if the module doesn't have jump label entries, just return */ +if (!mod->num_jump_entries) +return ; + + iter = mod->jump_entries; +while (iter < mod->jump_entries + mod->num_jump_entries) { +text_poke_early ((void *)iter->code,arch_get_jump_label_nop (), +JUMP_LABEL_NOP_SIZE ); + iter++; + } +} +struct notifier_block jump_label_module_nb = { .notifier_call = jump_label_module_notify, .priority =0 ,
kernel/trace/ftrace.c +1 -12
@@ -2728,20 +2728,9 @@ extern unsigned long __stop_mcount_loc[];void __init ftrace_init (void ) { -unsigned long count, addr, flags; +unsigned long count;int ret; -/* Keep the ftrace pointer to the stub */ - addr = (unsigned long )ftrace_stub; - -local_irq_save (flags); -ftrace_dyn_arch_init (&addr); -local_irq_restore (flags); - -/* ftrace_dyn_arch_init places the return code in addr */ -if (addr) - goto failed; - count = __stop_mcount_loc - __start_mcount_loc; ret =ftrace_dyn_table_alloc (count);
Signature · 1 line
1.7.0.1
PATCH 9/11 jump label: jump_label_text_reserved() to reserve our jump points
In reply to Jason BaronAdd a jump_label_text_reserved(void *start, void *end), so that other pieces of code that want to modify kernel text, can first verify that jump label has not reserved the instruction.
--- arch/x86/kernel/kprobes.c | 3 +- include/linux/jump_label.h | 6 +++ kernel/jump_label.c | 83 ++++++++++++++++++++++++++++++++++++++++++++ kernel/kprobes.c | 3 +- 4 files changed, 93 insertions(+), 2 deletions(-)
arch/x86/kernel/kprobes.c +2 -1
@@ -1202,7 +1202,8 @@ static int __kprobes copy_optimized_instructions(u8 *dest, u8 *src) }/* Check whether the address range is reserved */ if (ftrace_text_reserved (src, src + len -1 ) || -alternatives_text_reserved (src, src + len -1 )) +alternatives_text_reserved (src, src + len -1 ) || +jump_label_text_reserved (src, src + len -1 ))return -EBUSY ;return len;
include/linux/jump_label.h +6 -0
@@ -30,6 +30,7 @@ extern void arch_jump_label_transform(struct jump_entry *entry,extern const u8 *arch_get_jump_label_nop (void );extern void jump_label_update (const char *name,enum jump_label_type type); +extern int jump_label_text_reserved (void *start,void *end);extern void apply_jump_label_nops (struct module *mod);
@@ -64,6 +65,11 @@ static inline int apply_jump_label_nops(struct module *mod)return 0 ; } +static inline int jump_label_text_reserved (void *start,void *end) +{ +return 0 ; +} +#endif #endif
kernel/jump_label.c +83 -0
89 lines not on this page · raw message
kernel/kprobes.c +2 -1
@@ -1141,7 +1141,8 @@ int __kprobes register_kprobe(struct kprobe *p)preempt_disable ();if (!kernel_text_address ((unsigned long ) p->addr) ||in_kprobes_functions ((unsigned long ) p->addr) || -ftrace_text_reserved (p->addr, p->addr)) { +ftrace_text_reserved (p->addr, p->addr) || +jump_label_text_reserved (p->addr, p->addr)) {preempt_enable ();return -EINVAL ; }
Signature · 1 line
1.7.0.1
PATCH 8/11 jump label: initialize workqueue tracepoints *before* they are registered
In reply to Jason BaronInitialize the workqueue data structures *before* they are registered so that they are ready for callbacks.
--- kernel/trace/trace_workqueue.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-)
kernel/trace/trace_workqueue.c +5 -5
@@ -259,6 +259,11 @@ int __init trace_workqueue_early_init(void) {int ret, cpu; +for_each_possible_cpu (cpu) { +spin_lock_init (&workqueue_cpu_stat (cpu)->lock); +INIT_LIST_HEAD (&workqueue_cpu_stat (cpu)->list); + } + ret =register_trace_workqueue_insertion (probe_workqueue_insertion);if (ret) goto out;
@@ -275,11 +280,6 @@ int __init trace_workqueue_early_init(void)if (ret) goto no_creation; -for_each_possible_cpu (cpu) { -spin_lock_init (&workqueue_cpu_stat (cpu)->lock); -INIT_LIST_HEAD (&workqueue_cpu_stat (cpu)->list); - } -return 0 ; no_creation:
Signature · 1 line
1.7.0.1
PATCH 10/11 sparc64: Add jump_label support
In reply to Jason BaronFrom: David S. Miller <[email protected]>
Add jump label support for sparc64.
--- arch/sparc/Kconfig | 1 + arch/sparc/include/asm/jump_entry.h | 16 ++++++++++++++ arch/sparc/include/asm/jump_label.h | 21 +++++++++++++++++++ arch/sparc/kernel/Makefile | 2 + arch/sparc/kernel/jump_label.c | 38 +++++++++++++++++++++++++++++++++++ arch/sparc/kernel/module.c | 6 +++++ 6 files changed, 84 insertions(+), 0 deletions(-) create mode 100644 arch/sparc/include/asm/jump_entry.h create mode 100644 arch/sparc/include/asm/jump_label.h create mode 100644 arch/sparc/kernel/jump_label.c
arch/sparc/Kconfig +1 -0
@@ -29,6 +29,7 @@ config SPARC select PERF_USE_VMALLOC select HAVE_DMA_ATTRS select HAVE_DMA_API_DEBUG + select HAVE_ARCH_JUMP_LABEL config SPARC32 def_bool !64BIT
arch/sparc/include/asm/jump_entry.h new file +16 -0
@@ -0,0 +1,16 @@ +#ifndef _LINUX_JUMP_ENTRY_H +#define _LINUX_JUMP_ENTRY_H + +/* Defined in a separate file, so that it can be used by user program modpost.c +* This file is included by include/asm/jump_label.h, in turn included by +* include/linux/jump_label.h. Kernel sources should only include +* include/linux/jump_label.h. +**/ + +struct jump_entry { +__u32 code; +__u32 target; +__u32 name; +}; + +#endif
arch/sparc/include/asm/jump_label.h new file +21 -0
@@ -0,0 +1,21 @@ +#ifndef _ASM_SPARC_JUMP_LABEL_H +#define _ASM_SPARC_JUMP_LABEL_H + +#include <linux/types.h> +#include <asm/jump_entry.h> + +#define JUMP_LABEL_NOP_SIZE 4 + +#define JUMP_LABEL (tag, label, cond) \ + do { \ + extern const char __jlstrtab_##tag[]; \ + asm goto("1:\n\t" \ + "nop\n\t" \ + "nop\n\t" \ + ".pushsection __jump_table, \"a\"\n\t"\ + ".xword 1b, %l[" #label "], %c0\n\t" \ + ".popsection \n\t" \ + : : "i" (__jlstrtab_##tag) : : label);\ + } while (0) + +#endif
arch/sparc/kernel/Makefile +2 -0
@@ -119,3 +119,5 @@ obj-$(CONFIG_COMPAT) += $(audit--y) pc--$(CONFIG_PERF_EVENTS) := perf_event.o obj-$(CONFIG_SPARC64) += $(pc--y) + +obj-$(CONFIG_SPARC64) += jump_label.o
arch/sparc/kernel/jump_label.c new file +38 -0
@@ -0,0 +1,38 @@ +#include <linux/kernel.h> +#include <linux/types.h> +#include <linux/mutex.h> +#include <linux/cpu.h> + +#include <linux/jump_label.h> +#include <linux/memory.h> + +#ifdef HAVE_JUMP_LABEL + +void arch_jump_label_transform (struct jump_entry *entry,enum jump_label_type type) +{ +u32 val, *insn = (u32 *) entry->code; + + val = *insn; +if (type ==JUMP_LABEL_ENABLE ) { +s32 off = (s32 )entry->target - (s32 )entry->code; + val =0x40000000 | ((u32 ) off >>2 ); + }else { + val =0x01000000 ; + } + +get_online_cpus (); +mutex_lock (&text_mutex); + *insn = val; +flushi (insn); +mutex_unlock (&text_mutex); +put_online_cpus (); +} + +static const u8 jump_label_nop[JUMP_LABEL_NOP_SIZE ] = {0x01 ,0x00 ,0x00 ,0x00 }; + +const u8 *arch_get_jump_label_nop () +{ +return jump_label_nop; +} + +#endif
arch/sparc/kernel/module.c +6 -0
@@ -18,6 +18,9 @@#include <asm/spitfire.h> #ifdef CONFIG_SPARC64 + +#include <linux/jump_label.h> +static void *module_map (unsigned long size) {struct vm_struct *area;
@@ -227,6 +230,9 @@ int module_finalize(const Elf_Ehdr *hdr,const Elf_Shdr *sechdrs, struct module *me) { +/* make jump label nops */ +apply_jump_label_nops (me ); +/* Cheetah's I-cache is fully coherent. */ if (tlb_type == spitfire) {unsigned long va;
Signature · 1 line
1.7.0.1
PATCH 11/11 jump label: add docs
In reply to Jason BaronAdd jump label docs as: Documentation/jump-label.txt
--- Documentation/jump-label.txt | 140 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 140 insertions(+), 0 deletions(-) create mode 100644 Documentation/jump-label.txt
Documentation/jump-label.txt new file +140 -0
@@ -0,0 +1,140 @@ + Jump Label + ---------- + +By: Jason Baron <[email protected]> + + +1) motivation + + +Currently, tracepoints are implemented using a conditional. The conditional +check requires checking a global variable for each tracepoint. Although, +the overhead of this check is small, it increases under memory pressure. As we +increase the number of tracepoints in the kernel this may become more of an +issue. In addition, tracepoints are often dormant (disabled), and provide no +direct kernel functionality. Thus, it is highly desirable to reduce their +impact as much as possible. Although tracepoints are the original motivation +for this work, other kernel code paths should be able to make use of the jump +label optimization. + + +2) jump label description/usage + + +gcc (v4.5) adds a new 'asm goto' statement that allows branching to a label. +http://gcc.gnu.org/ml/gcc-patches/2009-07/msg01556.html + +Thus, this patch set introduces an architecture specific 'JUMP_LABEL()' macro as +follows (x86): + +# define JUMP_LABEL_INITIAL_NOP ".byte 0xe9 \n\t .long 0\n\t" + +# define JUMP_LABEL(tag, label, cond) \ + do { \ + extern const char __jlstrtab_##tag[]; \ + asm goto("1:" \ + JUMP_LABEL_INITIAL_NOP + ".pushsection __jump_table, \"a\" \n\t"\ + _ASM_PTR "1b, %l[" #label "], %c0 \n\t" \ + ".popsection \n\t" \ + : : "i" (__jlstrtab_##tag) : : label);\ + } while (0) + + +For architectures that have not yet introduced jump label support its simply: + +#define JUMP_LABEL(tag, label, cond) \ + if (unlikely(cond)) \ + goto label; + +which then can be used as: + + .... + JUMP_LABEL(trace_name, trace_label, jump_enabled); + printk("not doing tracing\n"); + return; +trace_label: + printk("doing tracing: %d\n", file); + .... + +Thus, when tracing is disabled, we simply have a no-op followed by a jump around +the dormant (disabled) tracing code. The 'JUMP_LABEL()' macro, produces a +'jump_table' which has the following format: + +[instruction address] [jump target] [tracepoint name] + +Thus, to enable a tracepoint, we simply patch the 'instruction address' with +a jump to the 'jump target'. + +The call to enable a jump label is: enable_jump_label(trace_name); to disable: +disable_jump_label(trace_name); + + +3) Jump label analysis (x86) + + +I've tested the performance of using 'get_cycles()' calls around the +tracepoint call sites. For an Intel Core 2 Quad cpu (in cycles, averages): + + idle after tbench run + ---- ---------------- +old code 32 88 +new code 2 4 + + +The performance improvement can be reproduced reliably on both Intel and AMD +hardware. + +In terms of code analysis the current code for the disabled case is a 'cmpl' +followed by a 'je' around the tracepoint code. so: + +cmpl - 83 3d 0e 77 87 00 00 - 7 bytes +je - 74 3e - 2 bytes + +total of 9 instruction bytes. + +The new code is a 'nopl' followed by a 'jmp'. Thus: + +nopl - 0f 1f 44 00 00 - 5 bytes +jmp - eb 3e - 2 bytes + +total of 7 instruction bytes. + +So, the new code also accounts for 2 less bytes in the instruction cache per tracepoint. + + +4) architecture interface + + +There are a few functions and macros which arches must implement in order to +take advantage of this optimization. As previously mentioned, if there is no +architecture support we simply fall back to a traditional, load, test, and +jump sequence. + +* add "HAVE_ARCH_JUMP_LABEL" to arch/<arch>/Kconfig to indicate support + +* #define JUMP_LABEL_NOP_SIZE, arch/x86/include/asm/jump_label.h + +* #define "JUMP_LABEL(tag, label, cond)", arch/x86/include/asm/jump_label.h + +* add: void arch_jump_label_transform(struct jump_entry *entry, enum jump_label_type type) + and + const u8 *arch_get_jump_label_nop(void) + + see: arch/x86/kernel/jump_label.c + +* finally add a definition for "struct jump_entry". This must be done in a + separate .h file, b/c the modpost.c code uses this definition to sort the + the jump label tabel in the vmlinux, so that it does not have to be sorted at + runtime. see: arch/x86/include/asm/jump_entry.h + + +5) Acknowledgments + + +Thanks to Roland McGrath and Richard Henderson for coming up with the initial +'asm goto' and jump label design. + +Thanks to Mathieu Desnoyers for calling attention to this issue, outlining the +requirements of a solution, and implementing a solution in the form of the +"Immediate Values" work.
Signature · 1 line
1.7.0.1
PATCH 7/11 jump label: sort jump table at build-time
In reply to Jason BaronThe jump label table is more optimal accessed if the entries are continguous. Sorting the table accomplishes this. Do the sort at build-time. Adds a '-j' option to 'modpost' which replaces the vmlinux, with a sorted jump label section vmlinux. I've tested this on x86 with relocatable and it works fine there as well. Note that I have not sorted the jump label table in modules. This is b/c the jump label names can be exported by the core kernel, and thus I don't have them available at buildtime. This could be solved by either finding the correct ones in the vmlinux, or by embedding the name of the jump label in the module tables (and not just a pointer), but the module tables tend to be smaller, and thus their is less value to this kind of change anyway. The kernel continues to do the sort, just in case, but at least for the vmlinux, this is just a verfication that the jump label table has already been sorted.
--- Makefile | 6 +++- include/asm-generic/vmlinux.lds.h | 18 ++++++++-- scripts/mod/Makefile | 1 + scripts/mod/modpost.c | 71 +++++++++++++++++++++++++++++++++++-- scripts/mod/modpost.h | 2 + 5 files changed, 91 insertions(+), 7 deletions(-)
Makefile +5 -1
@@ -152,7 +152,7 @@ obj := $(objtree) VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD)) -export srctree objtree VPATH +export srctree objtree VPATH hdr-arch # SUBARCH tells the usermode build what the underlying arch is. That is set
@@ -845,6 +845,9 @@ define rule_vmlinux-modpost $(Q)echo 'cmd_$@ := $(cmd_vmlinux-modpost)' > $(dot-target).cmd endef +quiet_cmd_sort-jump-label = SORT $@ + cmd_sort-jump-label = $(srctree)/scripts/mod/modpost -j -s $@ + # vmlinux image - including updated kernel symbols vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE ifdef CONFIG_HEADERS_CHECK
@@ -858,6 +861,7 @@ ifdef CONFIG_BUILD_DOCSRC endif $(call vmlinux-modpost) $(call if_changed_rule,vmlinux__) + $(call cmd,sort-jump-label) $(Q)rm -f .old_version # build vmlinux.o first to catch section mismatch errors early
include/asm-generic/vmlinux.lds.h +15 -3
@@ -168,7 +168,6 @@ TRACE_PRINTKS() \ FTRACE_EVENTS() \TRACE_SYSCALLS () \ -JUMP_TABLE () \/* * Data section helpers
@@ -207,7 +206,6 @@ *(__vermagic)/* Kernel version magic */ \ *(__markers_strings)/* Markers: strings */ \ *(__tracepoints_strings)/* Tracepoints: strings */ \ - *(__jump_strings)/* Jump: strings */ \ } \ \ .rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \
@@ -216,6 +214,10 @@ \BUG_TABLE \ \ + JUMP_TABLE \ + \ + JUMP_STRINGS \ + \ /* PCI quirks */ \ .pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \ VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \
@@ -559,11 +561,21 @@#define BUG_TABLE #endif -#define JUMP_TABLE () \ +#define JUMP_TABLE \ . = ALIGN(64); \ + __jump_table : AT(ADDR(__jump_table) - LOAD_OFFSET) { \ VMLINUX_SYMBOL(__start___jump_table) = .; \ *(__jump_table) \ VMLINUX_SYMBOL(__stop___jump_table) = .; \ + } + +#define JUMP_STRINGS \ + . = ALIGN(64); \ + __jump_strings : AT(ADDR(__jump_strings) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start___jump_strings) = .; \ + *(__jump_strings) \ + VMLINUX_SYMBOL(__stop___jump_strings) = .; \ + }#ifdef CONFIG_PM_TRACE #define TRACEDATA \
scripts/mod/Makefile +1 -0
@@ -1,4 +1,5 @@ hostprogs-y := modpost mk_elfconfig +HOST_EXTRACFLAGS += -I$(srctree)/arch/$(hdr-arch)/include always := $(hostprogs-y) empty.o modpost-objs := modpost.o file2alias.o sumversion.o
scripts/mod/modpost.c +68 -3
123 lines not on this page · raw message
scripts/mod/modpost.h +2 -0
@@ -126,6 +126,8 @@ struct elf_info {Elf_Section export_gpl_sec;Elf_Section export_unused_gpl_sec;Elf_Section export_gpl_future_sec; +Elf_Section jump_sec; +Elf_Section jump_strings_sec;const char *strtab;char *modinfo;unsigned int modinfo_len;
Signature · 1 line
1.7.0.1
David Miller
maintainerFrom: Jason Baron <[email protected]>
Date: Fri, 16 Apr 2010 11:24:10 -0400
Quoted 3 lines
David, I re-worked the sparc64 to match the updated interfaces. The code should hopefully compile now, although I did not test the sparc bits.
Thanks for working on this Jason. I'll take a close look at this some time today.
David Miller
maintainerFrom: David Miller <[email protected]>
Date: Thu, 22 Apr 2010 16:17:00 -0700 (PDT)
Quoted 9 lines
From: Jason Baron <[email protected]>
Date: Fri, 16 Apr 2010 11:24:10 -0400Quoted 3 lines
David, I re-worked the sparc64 to match the updated interfaces. The code should hopefully compile now, although I did not test the sparc bits.
Thanks for working on this Jason. I'll take a close look at this some time today.
The kernel stops compiling after the second patch because kernel/jump_label.c is compiled unconditionally, and this generates an attempt to include asm/alternatives.h which is an x86-only phenomenon.
Do you have access to a cross-compile environment or at least some non-x86 system you can test build on before submitting these patch sets?
Thanks.
Quoted 7 lines · David Miller
The kernel stops compiling after the second patch because
kernel/jump_label.cis compiled unconditionally, and this generates an attempt to includeasm/alternatives.hwhich is an x86-only phenomenon.Do you have access to a cross-compile environment or at least some non-x86 system you can test build on before submitting these patch sets?
I heard cross-compilers?
http://kernel.org/pub/tools/crosstool/files/bin/ i686 and x86_64 and 4.4.0 compilers suitable for kernel work.
I plan to build 4.4.$latest and 4.5.0 ASAP.
Yours Tony
Quoted 10 lines · * Tony Breeds ([email protected]) wrote:
Quoted 7 lines · David Miller
The kernel stops compiling after the second patch because
kernel/jump_label.cis compiled unconditionally, and this generates an attempt to includeasm/alternatives.hwhich is an x86-only phenomenon.Do you have access to a cross-compile environment or at least some non-x86 system you can test build on before submitting these patch sets?
Quoted 8 lines
I heard cross-compilers?
http://kernel.org/pub/tools/crosstool/files/bin/ i686 and
x86_64and 4.4.0 compilers suitable for kernel work.I plan to build 4.4.$latest and 4.5.0 ASAP.
Yours Tony
The crosstool package from Dan Kegel did a good job for this. Not sure it's currently maintained though. It was a very useful project, it's a shame if it does not live on. It would be good to have up-to-date and tested compilers for various architectures available on kernel.org, ideally with access to a package that helps building compilers for various architectures.
Thanks,
Mathieu
Signature · 4 lines
Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com
Quoted 6 lines · Mathieu Desnoyers
The crosstool package from Dan Kegel did a good job for this. Not sure it's currently maintained though. It was a very useful project, it's a shame if it does not live on. It would be good to have up-to-date and tested compilers for various architectures available on kernel.org, ideally with access to a package that helps building compilers for various architectures.
Trimmed the CC' as this is a bit of a tangent.
Crosstool did a good job but seems to be less current than we'd like for the kernel[1]. When using crosstool in the past I found a lot of the complexity was in *libc to the toolcahins I've built don';t have a libc so they're only helpful for kernel (or similar) builds.
In terms of "testing", I build a kernel for each toolchain but I don't boot them and in the past I think blackfin said that what I had wouldn't actually be runable. Last time I looked the wasn't a non-intel cross-toolchain for blackfin.
I shoudl also mention that a subset of these compilers are used to build test linux-next daily.
Yours Tony
[1] http://www.kegel.com/crosstool/crosstool-0.43/buildlogs/
Quoted 3 lines · Tony Breeds
In terms of "testing", I build a kernel for each toolchain but I don't boot them and in the past I think blackfin said that what I had wouldn't actually be runable.
every Blackfin defconfig should be buildable & bootable
Quoted 1 line
Last time I looked the wasn't a non-intel cross-toolchain for blackfin.
we provide 32bit and 64bit binaries for people, and a simple script to build up from source. if you're looking for some other arch, you need only ask. it's easy for me to ppc/ppc64/ia64 (and ive done them in the past), but no one has asked for those in a while.
-mike
Mathieu Desnoyers
reviewerQuoted 9 lines · * Tony Breeds ([email protected]) wrote:
Quoted 6 lines · Mathieu Desnoyers
The crosstool package from Dan Kegel did a good job for this. Not sure it's currently maintained though. It was a very useful project, it's a shame if it does not live on. It would be good to have up-to-date and tested compilers for various architectures available on kernel.org, ideally with access to a package that helps building compilers for various architectures.
Quoted 4 lines
Trimmed the CC' as this is a bit of a tangent.
Crosstool did a good job but seems to be less current than we'd like for the kernel[1].
Ouch. The build failure ratio is surprisingly high.
Quoted 3 lines
When using crosstool in the past I found a lot of the complexity
was in *libc to the toolcahins I've built don';t have a libc so they're only helpful for kernel (or similar) builds.
So maybe we could do something more specialized for kernel needs, e.g. a kcrosstool ? It could be a "simplified" crosstool.
Personally, I built a set of cross-compilers with crosstool 0.43 a while ago, but must now do a lot of trial and error to find new correct compiler and toolchain versions for each architecture. It would be good to have a kcrosstool git repository that would:
- Have scripts and documentation specialized for Linux kernel build.
- Contain an updated list of "working" and "non-working" toolchain versions for each arch.
- Could be easily updated; people would just have to report success/failure of their config so these could be added to the git repository. The build could probably prepare a report automatically to lessen the reporter job (I'm even thinking about a scheme that would give the option to report automatically).
- Optionally contain documentation on how to set up a cron job to automatically fetch a git tree and do a distributed multi-architecture build each day.
I think have this kind of updated tool would be of great value for testing.
Thanks,
Mathieu
Quoted 11 lines
In terms of "testing", I build a kernel for each toolchain but I don't boot them and in the past I think blackfin said that what I had wouldn't actually be runable. Last time I looked the wasn't a non-intel cross-toolchain for blackfin.
I shoudl also mention that a subset of these compilers are used to build test linux-next daily.
Yours Tony
[1] http://www.kegel.com/crosstool/crosstool-0.43/buildlogs/
Signature · 4 lines
Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com
H. Peter Anvin
reviewerQuoted 18 lines · Mathieu Desnoyers
Quoted 17 lines · * Tony Breeds ([email protected]) wrote:
Quoted 7 lines · David Miller
The kernel stops compiling after the second patch because
kernel/jump_label.cis compiled unconditionally, and this generates an attempt to includeasm/alternatives.hwhich is an x86-only phenomenon.Do you have access to a cross-compile environment or at least some non-x86 system you can test build on before submitting these patch sets?
I heard cross-compilers?
http://kernel.org/pub/tools/crosstool/files/bin/ i686 and
x86_64and 4.4.0 compilers suitable for kernel work.I plan to build 4.4.$latest and 4.5.0 ASAP.
Quoted 9 lines
Quoted 1 line
Yours Tony
The crosstool package from Dan Kegel did a good job for this. Not sure it's currently maintained though. It was a very useful project, it's a shame if it does not live on. It would be good to have up-to-date and tested compilers for various architectures available on kernel.org, ideally with access to a package that helps building compilers for various architectures.
Tony is taking over that work.
-hpa
Quoted 5 lines · David Miller
Quoted 5 lines
Quoted 4 lines
David, I re-worked the sparc64 to match the updated interfaces. The code should hopefully compile now, although I did not test the sparc bits.
Quoted 7 lines
Quoted 2 lines
Thanks for working on this Jason. I'll take a close look at this some time today.
The kernel stops compiling after the second patch because
kernel/jump_label.cis compiled unconditionally, and this generates an attempt to includeasm/alternatives.hwhich is an x86-only phenomenon.
sorry. jump_label.c no longer requires asm/alternatives.h. It should have been removed in this patch series.
Quoted 4 lines
Do you have access to a cross-compile environment or at least some non-x86 system you can test build on before submitting these patch sets?
I'll make sure to test the next iteration on non-x86, with at least dummy funtions.
thanks,
-Jason