[DTrace-devel] DTrace-ized 5.7 pushed to github

Nick Alcock nick.alcock at oracle.com
Sun Jun 7 07:18:27 PDT 2020


Tests passed on x86-64 and AArch64 with https://github.com/oracle/dtrace-utils
(master branch).

Pushed to <https://github.com/oracle/dtrace-linux-kernel>, as a branch
with v1 in the name.

This push is of DTrace v1, with a specialized kernel module.


It appears that the armtoolset-1 compiler on OL7 no longer produces a
working kernel (it boots, but modprobing fbt and running dtrace blocks
forever inside kallsyms name lookup during fbt blacklist
initialization): the built-in GCC 4.8 works fine. I'll give GCC 10 a
test soon.


Changes since 5.6.15 mostly consist of context adjustments, but we also
needed adaptations to slight changes in x86-64 trap handling and changes
in the x86 syscall infrastructure (where the arch-dependent component of
syscall function names moved around and x86-32 went pt_regs). There was
one bugfix, to compilation without CONFIG_KALLMODSYMS.

 1:  d3323a0f325a !  1:  8ca65629affb ctf: generate CTF information for the kernel
    @@ Documentation/process/changes.rst: OpenSSL
     
      ## Makefile ##
     @@ Makefile: $(KCONFIG_CONFIG):
    - #
      # This exploits the 'multi-target pattern rule' trick.
      # The syncconfig should be executed only once to make all the targets.
    + # (Note: use the grouped target '&:' when we bump to GNU Make 4.3)
     -%/auto.conf %/auto.conf.cmd: $(KCONFIG_CONFIG)
    -+%/auto.conf %/auto.conf.cmd %/tristate.conf: $(KCONFIG_CONFIG)
      	$(Q)$(MAKE) -f $(srctree)/Makefile syncconfig
      else # !may-sync-config
      # External modules and some install targets need include/generated/autoconf.h
 2:  67a3ab1aa2e8 !  2:  ed32a65cc400 kallsyms: introduce new /proc/kallmodsyms including builtin modules too
    @@ kernel/kallsyms.c: __attribute__((weak, section(".rodata")));
      extern const unsigned int kallsyms_markers[] __weak;
      
     @@ kernel/kallsyms.c: int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
    + 	return module_kallsyms_on_each_symbol(fn, data);
      }
    - EXPORT_SYMBOL_GPL(kallsyms_on_each_symbol);
      
     +/*
     + * The caller passes in an address, and we return an index to the symbol --
    @@ scripts/kallsyms.c: static struct sym_entry *read_symbol(FILE *in)
     -
     -	rc = fscanf(in, "%llx %c %499s\n", &addr, &type, name);
     -	if (rc != 3) {
    -+#ifdef CONFIG_KALLMODSYMS
     +        unsigned long long size;
    ++#ifdef CONFIG_KALLMODSYMS
     +	struct addrmap_entry *range;
     +        unsigned int module;
     +#endif
 3:  02b6eb6cc6ea !  3:  680d360bc21a waitfd: new syscall implementing waitpid() over fds
    @@ Commit message
     
      ## arch/x86/entry/syscalls/syscall_32.tbl ##
     @@
    - 435	i386	clone3			sys_clone3			__ia32_sys_clone3
    - 437	i386	openat2			sys_openat2			__ia32_sys_openat2
    - 438	i386	pidfd_getfd		sys_pidfd_getfd			__ia32_sys_pidfd_getfd
    + 435	i386	clone3			sys_clone3
    + 437	i386	openat2			sys_openat2
    + 438	i386	pidfd_getfd		sys_pidfd_getfd
     +# This one is a temporary number, designed for no clashes.
     +# Nothing but DTrace should use it.
    -+473	i386	waitfd			sys_waitfd			__ia32_sys_waitfd
    ++473	i386	waitfd			sys_waitfd
     
      ## arch/x86/entry/syscalls/syscall_64.tbl ##
     @@
    - 435	common	clone3			__x64_sys_clone3/ptregs
    - 437	common	openat2			__x64_sys_openat2
    - 438	common	pidfd_getfd		__x64_sys_pidfd_getfd
    + 435	common	clone3			sys_clone3
    + 437	common	openat2			sys_openat2
    + 438	common	pidfd_getfd		sys_pidfd_getfd
     +# This one is a temporary number, designed for no clashes.
     +# Nothing but DTrace should use it.
    -+473	common	waitfd			__x64_sys_waitfd
    ++473	common	waitfd			sys_waitfd
      
      #
      # x32-specific system call numbers start at 512 to avoid cache impact
    @@ fs/eventpoll.c: static int __init eventpoll_init(void)
      	epi_cache = kmem_cache_create("eventpoll_epi", sizeof(struct epitem),
     
      ## fs/io_uring.c ##
    -@@ fs/io_uring.c: struct io_poll_table {
    - };
    +@@ fs/io_uring.c: static void __io_queue_proc(struct io_poll_iocb *poll, struct io_poll_table *pt,
    + }
    + 
    + static void io_async_queue_proc(struct file *file, struct wait_queue_head *head,
    +-			       struct poll_table_struct *p)
    ++			       struct poll_table_struct *p,
    ++			       unsigned long fixed_event)
    + {
    + 	struct io_poll_table *pt = container_of(p, struct io_poll_table, pt);
    + 
    +@@ fs/io_uring.c: static int io_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,
    + }
      
      static void io_poll_queue_proc(struct file *file, struct wait_queue_head *head,
     -			       struct poll_table_struct *p)
 4:  3c1cba55c25d !  4:  8954eec92287 dtrace: core and x86
    @@ Makefile: clean-dirs	:= $(vmlinux-alldirs)
      drivers-y	:= $(patsubst %/, %/built-in.a, $(drivers-y))
     +dtrace-y	:= $(patsubst %/, %/built-in.a, $(dtrace-y))
      net-y		:= $(patsubst %/, %/built-in.a, $(net-y))
    - libs-y1		:= $(patsubst %/, %/lib.a, $(libs-y))
    - libs-y2		:= $(patsubst %/, %/built-in.a, $(filter-out %.a, $(libs-y)))
    + libs-y2		:= $(patsubst %/, %/built-in.a, $(filter %/, $(libs-y)))
    + ifdef CONFIG_MODULES
     @@ Makefile: virt-y		:= $(patsubst %/, %/built-in.a, $(virt-y))
      
      # Externally visible symbols (used by link-vmlinux.sh)
    @@ include/dtrace/types.h (new)
     
      ## include/linux/cpuhotplug.h ##
     @@ include/linux/cpuhotplug.h: enum cpuhp_state {
    - 	CPUHP_AP_IRQ_MIPS_GIC_STARTING,
    + 	CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING,
      	CPUHP_AP_ARM_MVEBU_COHERENCY,
      	CPUHP_AP_MICROCODE_LOADER,
     +	CPUHP_AP_CYCLIC_STARTING,
    @@ kernel/fork.c: static __latent_entropy struct task_struct *copy_process(
     +#endif
     +
      	proc_fork_connector(p);
    - 	cgroup_post_fork(p);
    - 	cgroup_threadgroup_change_end(current);
    + 	cgroup_post_fork(p, args);
    + 	perf_event_fork(p);
     
      ## kernel/module.c ##
     @@
 5:  590afff38e80 =  5:  54886d73404f dtrace: modular components and x86 support
 6:  da8c595b7fe3 !  6:  bc17d123f46a dtrace: systrace provider core components
    @@ Commit message
         Signed-off-by: Vincent Lim <vincent.lim at oracle.com>
     
      ## arch/x86/entry/syscall_32.c ##
    -@@ arch/x86/entry/syscall_32.c: extern asmlinkage long sys_ni_syscall(unsigned long, unsigned long, unsigned lon
    +@@
      
    - #define __SYSCALL_I386(nr, sym, qual) [nr] = sym,
    + #define __SYSCALL_I386(nr, sym) [nr] = __ia32_##sym,
      
     +#if IS_ENABLED(CONFIG_DT_SYSTRACE)
    -+__visible sys_call_ptr_t ia32_sys_call_table[__NR_syscall_compat_max+1] = {
    ++__visible sys_call_ptr_t ia32_sys_call_table[__NR_ia32_syscall_max+1] = {
     +#else
    - __visible const sys_call_ptr_t ia32_sys_call_table[__NR_syscall_compat_max+1] = {
    + __visible const sys_call_ptr_t ia32_sys_call_table[__NR_ia32_syscall_max+1] = {
     +#endif /* CONFIG_DT_SYSTRACE || CONFIG_DT_SYSTRACE_MODULE */
      	/*
      	 * Smells like a compiler bug -- it doesn't work
      	 * when the & below is removed.
     
      ## arch/x86/entry/syscall_64.c ##
    -@@ arch/x86/entry/syscall_64.c: SYSCALL_DEFINE0(ni_syscall)
    - #define __SYSCALL_64(nr, sym, qual) [nr] = sym,
    - #define __SYSCALL_X32(nr, sym, qual)
    +@@
    + 
    + #define __SYSCALL_64(nr, sym) [nr] = __x64_##sym,
      
     +#if IS_ENABLED(CONFIG_DT_SYSTRACE)
     +asmlinkage sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = {
    @@ arch/x86/include/asm/dtrace_syscall_types.h (new)
     +#define DTRACE_SYSCALL_WRAP_PREFIX "__x64_"
     
      ## arch/x86/include/asm/syscall.h ##
    -@@ arch/x86/include/asm/syscall.h: typedef asmlinkage long (*sys_call_ptr_t)(unsigned long, unsigned long,
    - 					  unsigned long, unsigned long,
    - 					  unsigned long, unsigned long);
    - #endif /* CONFIG_X86_64 */
    +@@
    + #include <asm/unistd.h>
    + 
    + typedef long (*sys_call_ptr_t)(const struct pt_regs *);
     +#if IS_ENABLED(CONFIG_DT_SYSTRACE)
     +extern sys_call_ptr_t sys_call_table[];
     +#else
    @@ arch/x86/include/asm/syscall.h: typedef asmlinkage long (*sys_call_ptr_t)(unsign
      
      #if defined(CONFIG_X86_32)
      #define ia32_sys_call_table sys_call_table
    -@@ arch/x86/include/asm/syscall.h: extern const sys_call_ptr_t sys_call_table[];
      #endif
      
      #if defined(CONFIG_IA32_EMULATION)
    @@ arch/x86/kernel/dtrace_syscall.c (new)
     +	systrace_syscall,
     +	{},
     +	{
    -+#define __SYSCALL_64(nr, sym, compat)		[nr] { __stringify(sym), },
    -+#define __SYSCALL_COMMON(nr, sym, compat)	__SYSCALL_64(nr, sym, compat)
    -+#define __SYSCALL_X32(nt, sym, compat)
    ++#define __SYSCALL_64(nr, sym)		[nr] { __stringify(sym), },
    ++#define __SYSCALL_COMMON(nr, sym)	__SYSCALL_64(nr, sym)
    ++#define __SYSCALL_X32(nt, sym)
     +#include <asm/syscalls_64.h>
     +	}
     +};
 7:  70fc46298a4e =  7:  6bc0c9703163 dtrace: systrace provider
 8:  3a38368c7ebc !  8:  9cba1fe4023d dtrace: sdt provider core components
    @@ scripts/.gitignore: asn1_compiler
     +kmodsdt
     
      ## scripts/Makefile ##
    -@@
    - # the kernel for the build process.
    - # ---------------------------------------------------------------------------
    - # kallsyms:      Find all symbols in vmlinux
    -+# kmodsdt:       Post-process module .o files for SDT probes
    - 
    - HOST_EXTRACFLAGS += -I$(srctree)/tools/include
    - 
     @@ scripts/Makefile: always-$(CONFIG_ASN1)				+= asn1_compiler
      always-$(CONFIG_MODULE_SIG_FORMAT)		+= sign-file
      always-$(CONFIG_SYSTEM_TRUSTED_KEYRING)		+= extract-cert
    @@ scripts/mod/modpost.c: static int check_exports(struct module *mod)
     +			if (have_vmlinux && !s->weak &&
     +			    !strstarts(s->name, "__dtrace_probe_") &&
     +			    !strstarts(s->name, "__dtrace_isenabled_")) {
    - 				if (warn_unresolved) {
    - 					warn("\"%s\" [%s.ko] undefined!\n",
    - 					     s->name, mod->name);
    + 				modpost_log(warn_unresolved ? LOG_WARN : LOG_ERROR,
    + 					    "\"%s\" [%s.ko] undefined!\n",
    + 					    s->name, mod->name);
     @@ scripts/mod/modpost.c: static int check_modname_len(struct module *mod)
       **/
      static void add_header(struct buffer *b, struct module *mod)
    @@ scripts/mod/modpost.c: static int check_modname_len(struct module *mod)
     +		modname++;
     +	else
     +		modname = mod->name;
    - 	buf_printf(b, "#include <linux/build-salt.h>\n");
      	buf_printf(b, "#include <linux/module.h>\n");
    + 	/*
    + 	 * Include build-salt.h after module.h in order to
    +@@ scripts/mod/modpost.c: static void add_header(struct buffer *b, struct module *mod)
      	buf_printf(b, "#include <linux/vermagic.h>\n");
      	buf_printf(b, "#include <linux/compiler.h>\n");
      	buf_printf(b, "\n");
 9:  c419c4f39b49 =  9:  87babf804acd dtrace: sdt provider for x86
10:  70e1b03b0f69 = 10:  396631436184 dtrace: profile provider and test probe core components
11:  42713568203f = 11:  79f2aa32b4fd dtrace: profile and tick providers built on cyclics
12:  95bfa9185344 = 12:  5c3b6eb3be27 dtrace: USDT and pid provider core and x86 components
13:  dba8a1b59d38 = 13:  ce49200c458a dtrace: USDT and pid providers
14:  cf87706135d7 ! 14:  2e9c6ed2e640 dtrace: function boundary tracing (FBT) core and x86 components
    @@ arch/x86/include/asm/kvm_para.h: void kvm_async_pf_task_wait(u32 token, int inte
     
      ## arch/x86/include/asm/mce.h ##
     @@ arch/x86/include/asm/mce.h: extern void mce_disable_bank(int bank);
    + /*
    +  * Exception handler
       */
    - 
    - /* Call the installed machine check handler for this CPU setup. */
    --extern void (*machine_check_vector)(struct pt_regs *, long error_code);
     -void do_machine_check(struct pt_regs *, long);
    -+extern int (*machine_check_vector)(struct pt_regs *, long error_code);
     +int do_machine_check(struct pt_regs *, long);
      
      /*
    @@ arch/x86/include/asm/traps.h: asmlinkage void xen_machine_check(void);
     -dotraplinkage void do_invalid_TSS(struct pt_regs *regs, long error_code);
     -dotraplinkage void do_segment_not_present(struct pt_regs *regs, long error_code);
     -dotraplinkage void do_stack_segment(struct pt_regs *regs, long error_code);
    -+dotraplinkage int do_coprocessor_segment_overrun(struct pt_regs *regs, long error_code);
    -+dotraplinkage int do_invalid_TSS(struct pt_regs *regs, long error_code);
    -+dotraplinkage int do_segment_not_present(struct pt_regs *regs, long error_code);
    -+dotraplinkage int do_stack_segment(struct pt_regs *regs, long error_code);
    - #ifdef CONFIG_X86_64
    --dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code, unsigned long address);
    -+dotraplinkage int do_double_fault(struct pt_regs *regs, long error_code, unsigned long address);
    - asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs);
    - asmlinkage __visible notrace
    - struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s);
    - void __init trap_init(void);
    - #endif
     -dotraplinkage void do_general_protection(struct pt_regs *regs, long error_code);
     -dotraplinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address);
     -dotraplinkage void do_spurious_interrupt_bug(struct pt_regs *regs, long error_code);
     -dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code);
     -dotraplinkage void do_alignment_check(struct pt_regs *regs, long error_code);
    +-dotraplinkage void do_simd_coprocessor_error(struct pt_regs *regs, long error_code);
    ++dotraplinkage int do_coprocessor_segment_overrun(struct pt_regs *regs, long error_code);
    ++dotraplinkage int do_invalid_TSS(struct pt_regs *regs, long error_code);
    ++dotraplinkage int do_segment_not_present(struct pt_regs *regs, long error_code);
    ++dotraplinkage int do_stack_segment(struct pt_regs *regs, long error_code);
     +dotraplinkage int do_general_protection(struct pt_regs *regs, long error_code);
     +dotraplinkage int do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address);
     +dotraplinkage int do_spurious_interrupt_bug(struct pt_regs *regs, long error_code);
     +dotraplinkage int do_coprocessor_error(struct pt_regs *regs, long error_code);
     +dotraplinkage int do_alignment_check(struct pt_regs *regs, long error_code);
    - #ifdef CONFIG_X86_MCE
    --dotraplinkage void do_machine_check(struct pt_regs *regs, long error_code);
    -+dotraplinkage int do_machine_check(struct pt_regs *regs, long error_code);
    - #endif
    --dotraplinkage void do_simd_coprocessor_error(struct pt_regs *regs, long error_code);
     +dotraplinkage int do_simd_coprocessor_error(struct pt_regs *regs, long error_code);
      #ifdef CONFIG_X86_32
     -dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code);
    @@ arch/x86/include/asm/traps.h: asmlinkage void xen_machine_check(void);
     -dotraplinkage void do_mce(struct pt_regs *regs, long error_code);
     +dotraplinkage int do_mce(struct pt_regs *regs, long error_code);
      
    - static inline int get_si_code(unsigned long condition)
    - {
    + #ifdef CONFIG_X86_64
    + asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs);
     
      ## arch/x86/kernel/cpu/mce/core.c ##
     @@ arch/x86/kernel/cpu/mce/core.c: static void __mc_scan_banks(struct mce *m, struct mce *final,
    -  * MCE broadcast. However some CPUs might be broken beyond repair,
    -  * so be always careful when synchronizing with others.
    +  * backing the user stack, tracing that reads the user stack will cause
    +  * potentially infinite recursion.
       */
    --void do_machine_check(struct pt_regs *regs, long error_code)
    -+int do_machine_check(struct pt_regs *regs, long error_code)
    +-void notrace do_machine_check(struct pt_regs *regs, long error_code)
    ++int notrace do_machine_check(struct pt_regs *regs, long error_code)
      {
      	DECLARE_BITMAP(valid_banks, MAX_NR_BANKS);
      	DECLARE_BITMAP(toclear, MAX_NR_BANKS);
    -@@ arch/x86/kernel/cpu/mce/core.c: void do_machine_check(struct pt_regs *regs, long error_code)
    +@@ arch/x86/kernel/cpu/mce/core.c: void notrace do_machine_check(struct pt_regs *regs, long error_code)
      	int lmce = 1;
      
      	if (__mc_check_crashing_cpu(cpu))
    @@ arch/x86/kernel/cpu/mce/core.c: void do_machine_check(struct pt_regs *regs, long
      
      	ist_enter(regs);
      
    -@@ arch/x86/kernel/cpu/mce/core.c: void do_machine_check(struct pt_regs *regs, long error_code)
    +@@ arch/x86/kernel/cpu/mce/core.c: void notrace do_machine_check(struct pt_regs *regs, long error_code)
      
      out_ist:
      	ist_exit(regs);
     +	return 0;
      }
      EXPORT_SYMBOL_GPL(do_machine_check);
    - 
    + NOKPROBE_SYMBOL(do_machine_check);
     @@ arch/x86/kernel/cpu/mce/core.c: bool filter_mce(struct mce *m)
      }
      
    @@ arch/x86/kernel/cpu/mce/core.c: bool filter_mce(struct mce *m)
     +int (*machine_check_vector)(struct pt_regs *, long error_code) =
      						unexpected_machine_check;
      
    --dotraplinkage void do_mce(struct pt_regs *regs, long error_code)
    -+dotraplinkage int do_mce(struct pt_regs *regs, long error_code)
    +-dotraplinkage notrace void do_mce(struct pt_regs *regs, long error_code)
    ++dotraplinkage notrace int do_mce(struct pt_regs *regs, long error_code)
      {
     -	machine_check_vector(regs, error_code);
     +	return machine_check_vector(regs, error_code);
      }
    + NOKPROBE_SYMBOL(do_mce);
      
    - /*
    +
    + ## arch/x86/kernel/cpu/mce/internal.h ##
    +@@
    + #include <asm/mce.h>
    + 
    + /* Pointer to the installed machine check handler for this CPU setup. */
    +-extern void (*machine_check_vector)(struct pt_regs *, long error_code);
    ++extern int (*machine_check_vector)(struct pt_regs *, long error_code);
    + 
    + enum severity_level {
    + 	MCE_NO_SEVERITY,
     
      ## arch/x86/kernel/dtrace_fbt.c (new) ##
     @@
    @@ arch/x86/kernel/traps.c: static void do_error_trap(struct pt_regs *regs, long er
      }
      
      DO_ERROR(X86_TRAP_DE,     SIGFPE,  FPE_INTDIV,   IP, "divide error",        divide_error)
    +@@ arch/x86/kernel/traps.c: DO_ERROR(X86_TRAP_NP,     SIGBUS,           0, NULL, "segment not present", segm
    + DO_ERROR(X86_TRAP_SS,     SIGBUS,           0, NULL, "stack segment",       stack_segment)
    + #undef IP
    + 
    +-dotraplinkage void do_alignment_check(struct pt_regs *regs, long error_code)
    ++dotraplinkage int do_alignment_check(struct pt_regs *regs, long error_code)
    + {
    + 	char *str = "alignment check";
    + 
    + 	RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
    + 
    + 	if (notify_die(DIE_TRAP, str, regs, error_code, X86_TRAP_AC, SIGBUS) == NOTIFY_STOP)
    +-		return;
    ++		return 0;
    + 
    + 	if (!user_mode(regs))
    + 		die("Split lock detected\n", regs, error_code);
    +@@ arch/x86/kernel/traps.c: dotraplinkage void do_alignment_check(struct pt_regs *regs, long error_code)
    + 	local_irq_enable();
    + 
    + 	if (handle_user_split_lock(regs, error_code))
    +-		return;
    ++		return 0;
    + 
    + 	do_trap(X86_TRAP_AC, SIGBUS, "alignment check", regs,
    + 		error_code, BUS_ADRALN, NULL);
    ++	return 0;
    + }
    + 
    + #ifdef CONFIG_VMAP_STACK
     @@ arch/x86/kernel/traps.c: __visible void __noreturn handle_stack_overflow(const char *message,
       * be lost.  If, for some reason, we need to return to a context with modified
       * regs, the shim code could be adjusted to synchronize the registers.
    @@ arch/x86/kernel/traps.c: dotraplinkage void do_general_protection(struct pt_regs
     +		return 0;
      
      	/*
    - 	 * Use ist_enter despite the fact that we don't use an IST stack.
    + 	 * Unlike any other non-IST entry, we can be called from a kprobe in
     @@ arch/x86/kernel/traps.c: dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
      		goto exit;
      #endif
    @@ arch/x86/kernel/traps.c: dotraplinkage void notrace do_int3(struct pt_regs *regs
      	cond_local_irq_enable(regs);
      	do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, 0, NULL);
     @@ arch/x86/kernel/traps.c: dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
    - 
    - exit:
    - 	ist_exit(regs);
    + 		preempt_enable_no_resched();
    + 		rcu_nmi_exit();
    + 	}
     +	return ret;
      }
      NOKPROBE_SYMBOL(do_int3);
    @@ arch/x86/kernel/traps.c: static void math_error(struct pt_regs *regs, int error_
     +dotraplinkage int
      do_spurious_interrupt_bug(struct pt_regs *regs, long error_code)
      {
    - 	cond_local_irq_enable(regs);
    + 	/*
    +@@ arch/x86/kernel/traps.c: do_spurious_interrupt_bug(struct pt_regs *regs, long error_code)
    + 	 * In theory this could be limited to 32bit, but the handler is not
    + 	 * hurting and who knows which other CPUs suffer from this.
    + 	 */
     +	return 0;
      }
      
15:  eb66cadddd82 = 15:  5c25d8403521 dtrace: fbt provider, modular components
16:  68d192e6387b ! 16:  32cafea3dcfc dtrace, arm: arm64 port
    @@ arch/arm64/kernel/entry.S: __bad_stack:
      #endif /* CONFIG_VMAP_STACK */
      
      /*
    -@@ arch/arm64/kernel/entry.S: el1_sync:
    +@@ arch/arm64/kernel/entry.S: SYM_CODE_START_LOCAL_NOALIGN(el1_sync)
      	kernel_entry 1
      	mov	x0, sp
      	bl	el1_sync_handler
    @@ arch/arm64/kernel/entry.S: el1_sync:
     +	kernel_exit 1, 1
     +#endif
     +1020:	kernel_exit 1
    - ENDPROC(el1_sync)
    + SYM_CODE_END(el1_sync)
      
      	.align	6
     @@ arch/arm64/kernel/entry.S: work_pending:
    @@ arch/arm64/kvm/hyp/hyp-entry.S: el2_error:
      	sb
     +ENDPROC(el2_error)
      
    - ENTRY(__hyp_do_panic)
    + SYM_FUNC_START(__hyp_do_panic)
      	mov	lr, #(PSR_F_BIT | PSR_I_BIT | PSR_A_BIT | PSR_D_BIT |\
     
      ## arch/arm64/mm/fault.c ##
17:  2125bb2bf781 ! 17:  549276ea98ab dtrace: add SDT probes
    @@ Commit message
     
      ## block/bio.c ##
     @@ block/bio.c: int submit_bio_wait(struct bio *bio)
    - 	bio->bi_end_io = submit_bio_wait_endio;
      	bio->bi_opf |= REQ_SYNC;
      	submit_bio(bio);
    + 
     +	DTRACE_IO(wait__start, struct bio * : (bufinfo_t *, devinfo_t *), bio,
     +		  struct file * : fileinfo_t *, NULL);
    - 	wait_for_completion_io(&done);
    + 	/* Prevent hang_check timer from firing at us during very long I/O */
    + 	hang_check = sysctl_hung_task_timeout_secs;
    + 	if (hang_check)
    +@@ block/bio.c: int submit_bio_wait(struct bio *bio)
    + 			;
    + 	else
    + 		wait_for_completion_io(&done);
     +	DTRACE_IO(wait__done, struct bio * : (bufinfo_t *, devinfo_t *), bio,
     +		  struct file * : fileinfo_t *, NULL);
      
    @@ net/ipv6/ip6_input.c: static int ip6_input_finish(struct net *net, struct sock *
     
      ## net/ipv6/ip6_output.c ##
     @@
    - #include <linux/mroute6.h>
      #include <net/l3mdev.h>
      #include <net/lwtunnel.h>
    + #include <net/ip_tunnels.h>
     +#include <linux/sdt.h>
      
      static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *skb)
18:  ff339ac16672 = 18:  4800f5460cf5 dtrace: add rcu_irq_exit and rcu_nmi_exit_common to FBT blacklist
19:  96d222818922 = 19:  e2b412691379 dtrace: add sample script for building DTrace on Fedora
20:  44ddddbe2d5f = 20:  55f507c4c80c locking: publicize mutex_owner and mutex_owned again




More information about the DTrace-devel mailing list