[DTrace-devel] DTrace-ized 5.5.2 pushed to oss.oracle.com and github

Nick Alcock nick.alcock at oracle.com
Mon Feb 10 09:38:08 PST 2020


Tests passed on x86-64 with dtrace-utils 1.2.1. AArch64 has not been
tested this time.

Pushed to <https://github.com/oracle/dtrace-linux-kernel> and
<https://oss.oracle.com/git/gitweb.cgi?p=dtrace-linux-kernel.git>, as
branches with v1 in the name.

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

Changes this time consist largely of adjustments to upstream changes,
including adoption of SYM_CODE_*/FUNC_CODE_* in x86 assembler, and
adjustments to allow for the migration of exception handling to
C on the AArch64.  All previous fixes added in 5.4.2 have been squashed
back (which is most of the diff below, since the new stuff is mostly in
new commits).

Changes since 5.4.2:

 1:  ed3c61aaede5 !  1:  8f12d495f11e ctf: generate CTF information for the kernel
    @@ .gitignore: modules.order
      /System.map
     
      ## Documentation/dontdiff ##
    -@@ Documentation/dontdiff: mkutf8data
    - modpost
    +@@ Documentation/dontdiff: modpost
      modules.builtin
      modules.builtin.modinfo
    + modules.nsdeps
     +modules_thick.builtin
      modules.order
      modversions.h*
    @@ Makefile: endif # CONFIG_MODULES
      
      # Directories & files removed with 'make clean'
     -CLEAN_DIRS  += include/ksym
    --CLEAN_FILES += modules.builtin.modinfo
    +-CLEAN_FILES += modules.builtin.modinfo modules.nsdeps
     +CLEAN_DIRS  += include/ksym .ctf
    -+CLEAN_FILES += modules.builtin.modinfo .ctf.filelist .ctf.filelist.raw
    ++CLEAN_FILES += modules.builtin.modinfo modules.nsdeps .ctf.filelist .ctf.filelist.raw
      
      # Directories & files removed with 'make mrproper'
      MRPROPER_DIRS  += include/config include/generated          \
 2:  5c8029aab88e !  2:  7204f1071c1d kallsyms: introduce new /proc/kallmodsyms including builtin modules too
    @@ scripts/kallsyms.c
       */
      
     +#define _GNU_SOURCE 1
    + #include <stdbool.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
    @@ scripts/kallsyms.c
     +#include <eu_simple.h>
     +#endif
      
    - #ifndef ARRAY_SIZE
      #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
    + 
     @@
      
      struct sym_entry {
    @@ scripts/kallsyms.c: static int token_profit[0x10000];
      	exit(1);
      }
      
    -@@ scripts/kallsyms.c: static int check_symbol_range(const char *sym, unsigned long long addr,
    - 	return 1;
    +@@ scripts/kallsyms.c: static bool is_ignored_symbol(const char *name, char type)
    + 		"kallsyms_markers",
    + 		"kallsyms_token_table",
    + 		"kallsyms_token_index",
    ++		"kallsyms_symbol_modules",
    ++		"kallsyms_modules",
    + 		/* Exclude linker generated symbols which vary between passes */
    + 		"_SDA_BASE_",		/* ppc */
    + 		"_SDA2_BASE_",		/* ppc */
    +@@ scripts/kallsyms.c: static void check_symbol_range(const char *sym, unsigned long long addr,
    + 	}
      }
      
     +#ifdef CONFIG_KALLMODSYMS
    @@ scripts/kallsyms.c: static int check_symbol_range(const char *sym, unsigned long
      			fprintf(stderr, "Read error or end of file.\n");
      		return -1;
     @@ scripts/kallsyms.c: static int read_symbol(FILE *in, struct sym_entry *s)
    - 	else if (!strncmp(sym, ".LASANPC", 8))
    - 		return -1;
    + 	check_symbol_range(sym, s->addr, text_ranges, ARRAY_SIZE(text_ranges));
    + 	check_symbol_range(sym, s->addr, &percpu_range, 1);
      
     +#ifdef CONFIG_KALLMODSYMS
     +	/* look up the builtin module this is part of (if any) */
    @@ scripts/kallsyms.c: static int read_symbol(FILE *in, struct sym_entry *s)
      	/* include the type field in the symbol name, so that it gets
      	 * compressed together */
      	s->len = strlen(sym) + 1;
    -@@ scripts/kallsyms.c: static int symbol_valid(struct sym_entry *s)
    - 		"kallsyms_addresses",
    - 		"kallsyms_offsets",
    - 		"kallsyms_relative_base",
    -+		"kallsyms_sizes",
    - 		"kallsyms_num_syms",
    - 		"kallsyms_names",
    - 		"kallsyms_markers",
    - 		"kallsyms_token_table",
    - 		"kallsyms_token_index",
    -+		"kallsyms_symbol_modules",
    -+		"kallsyms_modules",
    - 
    - 	/* Exclude linker generated symbols which vary between passes */
    - 		"_SDA_BASE_",		/* ppc */
     @@ scripts/kallsyms.c: static void write_src(void)
      		printf("\n");
      	}
    @@ scripts/kallsyms.c: static int compare_symbols(const void *a, const void *b)
      	wa = (sa->sym[0] == 'w') || (sa->sym[0] == 'W');
      	wb = (sb->sym[0] == 'w') || (sb->sym[0] == 'W');
     @@ scripts/kallsyms.c: static void record_relative_base(void)
    - 			relative_base = table[i].addr;
    + 		}
      }
      
     +#ifdef CONFIG_KALLMODSYMS
    @@ scripts/kallsyms.c: static void record_relative_base(void)
      
     +	read_modules(modules_builtin);
      	read_map(stdin);
    + 	shrink_table();
      	if (absolute_percpu)
    - 		make_percpus_absolute();
     
      ## scripts/link-vmlinux.sh ##
     @@ scripts/link-vmlinux.sh: vmlinux_link()
 3:  77afb7fc52ee !  3:  782e9a6892e3 waitfd: new syscall implementing waitpid() over fds
    @@ fs/Makefile: obj-$(CONFIG_SIGNALFD)		+= signalfd.o
     +obj-$(CONFIG_WAITFD)		+= waitfd.o
      obj-$(CONFIG_AIO)               += aio.o
      obj-$(CONFIG_IO_URING)		+= io_uring.o
    - obj-$(CONFIG_FS_DAX)		+= dax.o
    + obj-$(CONFIG_IO_WQ)		+= io-wq.o
     
      ## fs/aio.c ##
     @@ fs/aio.c: struct aio_poll_table {
 4:  5c54dfdcc6bc !  4:  6b5049188be1 dtrace: core and x86
    @@ kernel/Makefile: obj-$(CONFIG_TORTURE_TEST) += torture.o
      obj-$(CONFIG_RSEQ) += rseq.o
     +obj-$(CONFIG_DTRACE) += dtrace/
      
    - obj-$(CONFIG_GCC_PLUGIN_STACKLEAK) += stackleak.o
    - KASAN_SANITIZE_stackleak.o := n
    + obj-$(CONFIG_SYSCTL_KUNIT_TEST) += sysctl-test.o
    + 
     
      ## kernel/dtrace/Kconfig (new) ##
     @@
    @@ kernel/exit.c: void __noreturn do_exit(long code)
     
      ## kernel/fork.c ##
     @@
    - #include <linux/livepatch.h>
      #include <linux/thread_info.h>
      #include <linux/stackleak.h>
    + #include <linux/kasan.h>
     +#include <linux/dtrace_task_impl.h>
      
      #include <asm/pgtable.h>
 5:  04784da15034 !  5:  ac164e68a25f dtrace: modular components and x86 support
    @@ dtrace/dtrace_probe.c (new)
     +		void *vaddr;
     +
     +		flen = dtrace_load32(shinfo + offsetof(struct skb_shared_info,
    -+				     frags[f].size));
    ++				     frags[f].bv_len));
     +		foff = dtrace_load32(shinfo + offsetof(struct skb_shared_info,
    -+				     frags[f].page_offset));
    ++				     frags[f].bv_offset));
     +		frag = (struct page *)dtrace_loadptr(shinfo + offsetof(
     +						     struct skb_shared_info,
    -+						     frags[f].page.p));
    ++						     frags[f].bv_page));
     +
     +		dtrace_skb_frag_foreach_page(frag, foff, flen,
     +					     p, poff, plen, copied) {
 6:  e705e1f9dda9 !  6:  3d8db94dbe02 dtrace: systrace provider core components
    @@ arch/x86/entry/syscall_32.c: extern asmlinkage long sys_ni_syscall(unsigned long
      	 * when the & below is removed.
     
      ## arch/x86/entry/syscall_64.c ##
    -@@ arch/x86/entry/syscall_64.c: extern asmlinkage long sys_ni_syscall(const struct pt_regs *);
    +@@ arch/x86/entry/syscall_64.c: SYSCALL_DEFINE0(ni_syscall)
      #define __SYSCALL_64(nr, sym, qual) [nr] = sym,
      #define __SYSCALL_X32(nr, sym, qual)
      
 7:  6841186044df =  7:  e63686ec7bf4 dtrace: systrace provider
 8:  fbed2054cca5 !  8:  ee01bd95b7db dtrace: sdt provider core components
    @@ Makefile
     @@ Makefile: clean: $(clean-dirs)
      		-o -name '*.dtb' -o -name '*.dtb.S' -o -name '*.dt.yaml' \
      		-o -name '*.dwo' -o -name '*.lst' \
    - 		-o -name '*.su' -o -name '*.mod' -o -name '*.ns_deps' \
    -+		-o -name '*.su' -o -name '*.mod' \
    + 		-o -name '*.su' -o -name '*.mod' \
     +		-o -name '*.sdtinfo.c' -o -name '*.sdtstub.S' \
      		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
      		-o -name '*.lex.c' -o -name '*.tab.[ch]' \
    @@ arch/x86/include/asm/spinlock.h
     
      ## arch/x86/include/asm/text-patching.h ##
     @@ arch/x86/include/asm/text-patching.h: struct text_poke_loc {
    - 	const char opcode[POKE_MAX_OPCODE_SIZE];
    + 	const u8 text[POKE_MAX_OPCODE_SIZE];
      };
      
     +extern void add_nops(void *insns, unsigned int len);
    @@ scripts/.gitignore: asn1_compiler
     
      ## scripts/Makefile ##
     @@
    - # pnmttologo:    Convert pnm files to logo files
    + # kallsyms:      Find all symbols in vmlinux
      # conmakehash:   Create chartable
      # conmakehash:	 Create arrays for initializing the kernel console tables
     +# kmodsdt:       Post-process module .o files for SDT probes
    @@ scripts/link-vmlinux.sh: if [ -n "${CONFIG_KALLSYMS}" ]; then
      fi
      
     -vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o}
    -+vmlinux_link vmlinux "" "${kallsymso}" ${btf_vmlinux_bin_o}
    ++vmlinux_link vmlinux "" "${kallsymso}" ${btf_vmlinux_bin_o} ${sdtstubo} ${sdtinfoo}
      
      if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then
      	info SORTEX vmlinux
 9:  b697089b3658 =  9:  bc56712b7e34 dtrace: sdt provider for x86
10:  60a50db03e1a = 10:  bacbf7736afb dtrace: profile provider and test probe core components
11:  82090b29b3b7 = 11:  a89d11db10b2 dtrace: profile and tick providers built on cyclics
12:  59c9af8db346 = 12:  062a9fd1a734 dtrace: USDT and pid provider core and x86 components
13:  44997711616f = 13:  c70fe4a1ace5 dtrace: USDT and pid providers
14:  a367c4a749ba ! 14:  12de496ebb18 dtrace: function boundary tracing (FBT) core and x86 components
    @@ arch/x86/entry/entry_64.S: apicinterrupt IRQ_WORK_VECTOR			irq_work_interrupt		s
      	.if \paranoid
      	/* this procedure expect "no swapgs" flag in ebx */
      	jmp	paranoid_exit
    -@@ arch/x86/entry/entry_64.S: ENTRY(\sym)
    +@@ arch/x86/entry/entry_64.S: SYM_CODE_START(\sym)
      	 * run in real process context if user_mode(regs).
      	 */
      .Lfrom_usermode_switch_stack_\@:
    @@ arch/x86/entry/entry_64.S: ENTRY(\sym)
      	.endif
      
      _ASM_NOKPROBE(\sym)
    - END(\sym)
    + SYM_CODE_END(\sym)
      .endm
      
     +#ifdef CONFIG_DTRACE
    @@ arch/x86/include/asm/traps.h: asmlinkage void xen_machine_check(void);
     -dotraplinkage void do_bounds(struct pt_regs *regs, long error_code);
     -dotraplinkage void do_invalid_op(struct pt_regs *regs, long error_code);
     -dotraplinkage void do_device_not_available(struct pt_regs *regs, long error_code);
    --dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *regs, long error_code);
    --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_divide_error(struct pt_regs *regs, long error_code);
     +dotraplinkage int do_debug(struct pt_regs *regs, long error_code);
     +dotraplinkage int do_nmi(struct pt_regs *regs, long error_code);
    @@ arch/x86/include/asm/traps.h: asmlinkage void xen_machine_check(void);
     +dotraplinkage int do_bounds(struct pt_regs *regs, long error_code);
     +dotraplinkage int do_invalid_op(struct pt_regs *regs, long error_code);
     +dotraplinkage int do_device_not_available(struct pt_regs *regs, long error_code);
    + #if defined(CONFIG_X86_64) || defined(CONFIG_DOUBLEFAULT)
    +-dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code, unsigned long cr2);
    ++dotraplinkage int do_double_fault(struct pt_regs *regs, long error_code, unsigned long cr2);
    + #endif
    +-dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *regs, long error_code);
    +-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);
    @@ arch/x86/kernel/nmi.c: static bool notrace is_debug_stack(unsigned long addr)
      do_nmi(struct pt_regs *regs, long error_code)
      {
      	if (IS_ENABLED(CONFIG_SMP) && cpu_is_offline(smp_processor_id()))
    -@@ arch/x86/kernel/nmi.c: do_nmi(struct pt_regs *regs, long error_code)
    +-		return;
    ++		return 0;
      
      	if (this_cpu_read(nmi_state) != NMI_NOT_RUNNING) {
      		this_cpu_write(nmi_state, NMI_LATCHED);
    @@ 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: __visible void __noreturn handle_stack_overflow(const char *message,
    - 
    - #ifdef CONFIG_X86_64
    - /* Runs on IST stack */
    +  * 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.
    +  */
     -dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code, unsigned long cr2)
     +dotraplinkage int do_double_fault(struct pt_regs *regs, long error_code, unsigned long cr2)
      {
    @@ arch/x86/kernel/traps.c: dotraplinkage void do_double_fault(struct pt_regs *regs
      #endif
      
     @@ arch/x86/kernel/traps.c: dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code, unsign
    - 	 */
    - 	for (;;)
    - 		die(str, regs, error_code);
    -+
    -+	return 0;
      }
      #endif
      
15:  9875695bdf8f = 15:  5c53d038264f dtrace: fbt provider, modular components
16:  6e55d402cba3 ! 16:  d9b4eb455db9 dtrace, arm: arm64 port
    @@ arch/arm64/kernel/dtrace_util.c (new)
     +{
     +}
     
    + ## arch/arm64/kernel/entry-common.c ##
    +@@ arch/arm64/kernel/entry-common.c: static void notrace el1_dbg(struct pt_regs *regs, unsigned long esr)
    + }
    + NOKPROBE_SYMBOL(el1_dbg);
    + 
    +-asmlinkage void notrace el1_sync_handler(struct pt_regs *regs)
    ++asmlinkage int notrace el1_sync_handler(struct pt_regs *regs)
    + {
    + 	unsigned long esr = read_sysreg(esr_el1);
    + 
    +@@ arch/arm64/kernel/entry-common.c: asmlinkage void notrace el1_sync_handler(struct pt_regs *regs)
    + 	case ESR_ELx_EC_WATCHPT_CUR:
    + 	case ESR_ELx_EC_BRK64:
    + 		el1_dbg(regs, esr);
    +-		break;
    ++		return 1;
    + 	default:
    + 		el1_inv(regs, esr);
    + 	};
    ++	return 0;
    + }
    + NOKPROBE_SYMBOL(el1_sync_handler);
    + 
    +
      ## arch/arm64/kernel/entry.S ##
     @@
      #include <asm/thread_info.h>
    @@ arch/arm64/kernel/entry.S: __bad_stack:
      #endif /* CONFIG_VMAP_STACK */
      
      /*
    -@@ arch/arm64/kernel/entry.S: el1_dbg:
    - 	mrs	x0, far_el1
    - 	mov	x2, sp				// struct pt_regs
    - 	bl	do_debug_exception
    +@@ arch/arm64/kernel/entry.S: el1_sync:
    + 	kernel_entry 1
    + 	mov	x0, sp
    + 	bl	el1_sync_handler
    +-	kernel_exit 1
     +#if IS_ENABLED(CONFIG_DT_FBT)
    ++	cmp	x0, 1
    ++	b.ne	1020f
     +	kernel_exit 1, 1
    -+#else
    - 	kernel_exit 1
     +#endif
    - el1_inv:
    - 	// TODO: add support for undefined instructions in kernel mode
    - 	inherit_daif	pstate=x23, tmp=x2
    ++1020:	kernel_exit 1
    + ENDPROC(el1_sync)
    + 
    + 	.align	6
     @@ arch/arm64/kernel/entry.S: work_pending:
      #endif
      	ldr	x1, [tsk, #TSK_TI_FLAGS]	// re-check for single-step
17:  cc3b02f5a7af ! 17:  eff208caaee3 dtrace: add SDT probes
    @@ include/linux/rwlock_api_smp.h: static inline void __raw_write_lock(rwlock_t *lo
      #endif /* !CONFIG_GENERIC_LOCKBREAK || CONFIG_DEBUG_LOCK_ALLOC */
     @@ include/linux/rwlock_api_smp.h: static inline void __raw_write_unlock(rwlock_t *lock)
      {
    - 	rwlock_release(&lock->dep_map, 1, _RET_IP_);
    + 	rwlock_release(&lock->dep_map, _RET_IP_);
      	do_raw_write_unlock(lock);
     +	DTRACE_LOCKSTAT(rw__release, struct rwlock *, lock, int,
     +			DTRACE_LOCKSTAT_RW_WRITER);
    @@ include/linux/rwlock_api_smp.h: static inline void __raw_write_unlock(rwlock_t *
      
     @@ include/linux/rwlock_api_smp.h: static inline void __raw_read_unlock(rwlock_t *lock)
      {
    - 	rwlock_release(&lock->dep_map, 1, _RET_IP_);
    + 	rwlock_release(&lock->dep_map, _RET_IP_);
      	do_raw_read_unlock(lock);
     +	DTRACE_LOCKSTAT(rw__release, struct rwlock *, lock, int,
     +			DTRACE_LOCKSTAT_RW_READER);
    @@ include/linux/rwlock_api_smp.h: static inline void __raw_read_unlock(rwlock_t *l
      
     @@ include/linux/rwlock_api_smp.h: __raw_read_unlock_irqrestore(rwlock_t *lock, unsigned long flags)
      {
    - 	rwlock_release(&lock->dep_map, 1, _RET_IP_);
    + 	rwlock_release(&lock->dep_map, _RET_IP_);
      	do_raw_read_unlock(lock);
     +	DTRACE_LOCKSTAT(rw__release, struct rwlock *, lock, int,
     +			DTRACE_LOCKSTAT_RW_READER);
    @@ include/linux/rwlock_api_smp.h: __raw_read_unlock_irqrestore(rwlock_t *lock, uns
      }
     @@ include/linux/rwlock_api_smp.h: static inline void __raw_read_unlock_irq(rwlock_t *lock)
      {
    - 	rwlock_release(&lock->dep_map, 1, _RET_IP_);
    + 	rwlock_release(&lock->dep_map, _RET_IP_);
      	do_raw_read_unlock(lock);
     +	DTRACE_LOCKSTAT(rw__release, struct rwlock *, lock, int,
     +			DTRACE_LOCKSTAT_RW_READER);
    @@ include/linux/rwlock_api_smp.h: static inline void __raw_read_unlock_irq(rwlock_
      }
     @@ include/linux/rwlock_api_smp.h: static inline void __raw_read_unlock_bh(rwlock_t *lock)
      {
    - 	rwlock_release(&lock->dep_map, 1, _RET_IP_);
    + 	rwlock_release(&lock->dep_map, _RET_IP_);
      	do_raw_read_unlock(lock);
     +	DTRACE_LOCKSTAT(rw__release, struct rwlock *, lock, int,
     +			DTRACE_LOCKSTAT_RW_READER);
    @@ include/linux/rwlock_api_smp.h: static inline void __raw_read_unlock_bh(rwlock_t
      
     @@ include/linux/rwlock_api_smp.h: static inline void __raw_write_unlock_irqrestore(rwlock_t *lock,
      {
    - 	rwlock_release(&lock->dep_map, 1, _RET_IP_);
    + 	rwlock_release(&lock->dep_map, _RET_IP_);
      	do_raw_write_unlock(lock);
     +	DTRACE_LOCKSTAT(rw__release, struct rwlock *, lock, int,
     +			DTRACE_LOCKSTAT_RW_WRITER);
    @@ include/linux/rwlock_api_smp.h: static inline void __raw_write_unlock_irqrestore
      }
     @@ include/linux/rwlock_api_smp.h: static inline void __raw_write_unlock_irq(rwlock_t *lock)
      {
    - 	rwlock_release(&lock->dep_map, 1, _RET_IP_);
    + 	rwlock_release(&lock->dep_map, _RET_IP_);
      	do_raw_write_unlock(lock);
     +	DTRACE_LOCKSTAT(rw__release, struct rwlock *, lock, int,
     +			DTRACE_LOCKSTAT_RW_WRITER);
    @@ include/linux/rwlock_api_smp.h: static inline void __raw_write_unlock_irq(rwlock
      }
     @@ include/linux/rwlock_api_smp.h: static inline void __raw_write_unlock_bh(rwlock_t *lock)
      {
    - 	rwlock_release(&lock->dep_map, 1, _RET_IP_);
    + 	rwlock_release(&lock->dep_map, _RET_IP_);
      	do_raw_write_unlock(lock);
     +	DTRACE_LOCKSTAT(rw__release, struct rwlock *, lock, int,
     +			DTRACE_LOCKSTAT_RW_WRITER);
    @@ include/linux/spinlock_api_smp.h: static inline void __raw_spin_lock(raw_spinloc
      #endif /* !CONFIG_GENERIC_LOCKBREAK || CONFIG_DEBUG_LOCK_ALLOC */
     @@ include/linux/spinlock_api_smp.h: static inline void __raw_spin_unlock(raw_spinlock_t *lock)
      {
    - 	spin_release(&lock->dep_map, 1, _RET_IP_);
    + 	spin_release(&lock->dep_map, _RET_IP_);
      	do_raw_spin_unlock(lock);
     +	DTRACE_LOCKSTAT(spin__release, spinlock_t *, lock);
      	preempt_enable();
    @@ include/linux/spinlock_api_smp.h: static inline void __raw_spin_unlock(raw_spinl
      
     @@ include/linux/spinlock_api_smp.h: static inline void __raw_spin_unlock_irqrestore(raw_spinlock_t *lock,
      {
    - 	spin_release(&lock->dep_map, 1, _RET_IP_);
    + 	spin_release(&lock->dep_map, _RET_IP_);
      	do_raw_spin_unlock(lock);
     +	DTRACE_LOCKSTAT(spin__release, spinlock_t *, lock);
      	local_irq_restore(flags);
    @@ include/linux/spinlock_api_smp.h: static inline void __raw_spin_unlock_irqrestor
      }
     @@ include/linux/spinlock_api_smp.h: static inline void __raw_spin_unlock_irq(raw_spinlock_t *lock)
      {
    - 	spin_release(&lock->dep_map, 1, _RET_IP_);
    + 	spin_release(&lock->dep_map, _RET_IP_);
      	do_raw_spin_unlock(lock);
     +	DTRACE_LOCKSTAT(spin__release, spinlock_t *, lock);
      	local_irq_enable();
    @@ include/linux/spinlock_api_smp.h: static inline void __raw_spin_unlock_irq(raw_s
      }
     @@ include/linux/spinlock_api_smp.h: static inline void __raw_spin_unlock_bh(raw_spinlock_t *lock)
      {
    - 	spin_release(&lock->dep_map, 1, _RET_IP_);
    + 	spin_release(&lock->dep_map, _RET_IP_);
      	do_raw_spin_unlock(lock);
     +	DTRACE_LOCKSTAT(spin__release, spinlock_t *, lock);
      	__local_bh_enable_ip(_RET_IP_, SOFTIRQ_LOCK_OFFSET);
    @@ kernel/exit.c: void __noreturn do_exit(long code)
     
      ## kernel/fork.c ##
     @@
    - #include <linux/livepatch.h>
      #include <linux/thread_info.h>
      #include <linux/stackleak.h>
    + #include <linux/kasan.h>
     +#include <linux/sdt.h>
      #include <linux/dtrace_task_impl.h>
      
    @@ kernel/locking/mutex.c: skip_wait:
     @@ kernel/locking/mutex.c: err_early_kill:
      	spin_unlock(&lock->wait_lock);
      	debug_mutex_free_waiter(&waiter);
    - 	mutex_release(&lock->dep_map, 1, ip);
    + 	mutex_release(&lock->dep_map, ip);
     +	DTRACE_LOCKSTAT(adaptive__acquire__error, struct mutex *, lock,
     +			int, ret);
      	preempt_enable();
    @@ net/ipv6/ip6_input.c: static struct sk_buff *ip6_rcv_core(struct sk_buff *skb, s
      
      	/* While RFC4291 is not explicit about v4mapped addresses
      	 * in IPv6 headers, it seems clear linux dual-stack
    +@@ net/ipv6/ip6_input.c: static struct sk_buff *ip6_rcv_core(struct sk_buff *skb, struct net_device *dev,
    + 	 * https://tools.ietf.org/html/draft-itojun-v6ops-v4mapped-harmful-02
    + 	 */
    + 	if (ipv6_addr_v4mapped(&hdr->saddr))
    ++	{
    ++		dropreason = "v4-mapped address in IPv6 packet";
    + 		goto err;
    ++	}
    + 
    + 	skb->transport_header = skb->network_header + sizeof(*hdr);
    + 	IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr);
     @@ net/ipv6/ip6_input.c: static struct sk_buff *ip6_rcv_core(struct sk_buff *skb, struct net_device *dev,
      		if (pkt_len + sizeof(struct ipv6hdr) > skb->len) {
      			__IP6_INC_STATS(net,
    @@ net/ipv6/tcp_ipv6.c: static int tcp_v6_send_synack(const struct sock *sk, struct
      			       sk->sk_priority);
      		rcu_read_unlock();
     @@ net/ipv6/tcp_ipv6.c: static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32
    - 	dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL);
    + 	dst = ip6_dst_lookup_flow(sock_net(ctl_sk), ctl_sk, &fl6, NULL);
      	if (!IS_ERR(dst)) {
      		skb_dst_set(buff, dst);
     +		if (DTRACE_TCP_ENABLED(send) ||
18:  7b857175d21c = 18:  7996decb4444 dtrace: add rcu_irq_exit and rcu_nmi_exit_common to FBT blacklist
19:  f7343dcac6b0 = 19:  9536d0284bae dtrace: add sample script for building DTrace on Fedora
20:  bb0c675b71b9 = 20:  00c7cfea0186 locking: publicize mutex_owner and mutex_owned again
21:  660199c1d276 <  -:  ------------ fixup! dtrace: function boundary tracing (FBT) core and x86 components
22:  a10d7e80145d <  -:  ------------ fixup! dtrace: sdt provider core components
23:  c4590b9a8fbe <  -:  ------------ fixup! dtrace: modular components and x86 support
24:  caf7c2d41ac1 <  -:  ------------ fixup! dtrace: add SDT probes
 -:  ------------ > 21:  fe425177fcbd fixup! dtrace: modular components and x86 support
 -:  ------------ > 22:  fcd40e317963 fixup! dtrace: add SDT probes
 -:  ------------ > 23:  582c39ca6b12 fixup! dtrace: core and x86
 -:  ------------ > 24:  316db26d919a fixup! dtrace: sdt provider core components
 -:  ------------ > 25:  1f9239bd03c0 fixup! dtrace: core and x86
 -:  ------------ > 26:  69cce46cfa34 fixup! dtrace: modular components and x86 support



More information about the DTrace-devel mailing list