[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