Skip to contentSkip to conversation

Linux Kernel Markers for 2.6.23-rc8-mm2

PATCH In review Mathieu Desnoyers 5 participants 17 messages Sep 28, 2007 – Oct 11, 2007

Subsystems (20)
lore
Share & tools
lore
#0 lore raw

cover Linux Kernel Markers for 2.6.23-rc8-mm2

Hi Andrew,

Here are the Linux Kernel Markers for 2.6.23-rc8-mm2. The only change that has been made since 2.6.23-rc8-mm1 is to integrate the updated samples menu.

The patches apply in the following order:

kconfig-instrumentation.patch
linux-kernel-markers.patch
add-samples-subdir.patch
linux-kernel-markers-samples.patch
linux-kernel-markers-documentation.patch

Mathieu

Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#1 lore raw

PATCH 1/5 Combine instrumentation menus in kernel/Kconfig.instrumentation

Quoting Randy:

"It seems sad that this patch sources Kconfig.marker, a 7-line file, 20-something times. Yes, you (we) don't want to put those 7 lines into 20-something different files, so sourcing is the right thing.

However, what you did for avr32 seems more on the right track to me:
make _one_ Instrumentation support menu that includes PROFILING, OPROFILE, KPROBES, and MARKERS and then use (source) that in all of the arches."

---
 arch/alpha/Kconfig             |    2 -
 arch/alpha/oprofile/Kconfig    |   23 ---------------------
 arch/arm/Kconfig               |    2 -
 arch/arm/oprofile/Kconfig      |   42 ----------------------------------------
 arch/blackfin/Kconfig          |    2 -
 arch/blackfin/oprofile/Kconfig |   29 ---------------------------
 arch/cris/Kconfig              |    2 +
 arch/frv/Kconfig               |    2 +
 arch/h8300/Kconfig             |    2 +
 arch/i386/Kconfig              |   25 -----------------------
 arch/i386/oprofile/Kconfig     |   17 ----------------
 arch/ia64/Kconfig              |   15 --------------
 arch/ia64/oprofile/Kconfig     |   20 -------------------
 arch/m32r/Kconfig              |    2 -
 arch/m32r/oprofile/Kconfig     |   23 ---------------------
 arch/m68k/Kconfig              |    2 +
 arch/m68knommu/Kconfig         |    2 +
 arch/mips/Kconfig              |    2 -
 arch/mips/oprofile/Kconfig     |   23 ---------------------
 arch/parisc/Kconfig            |    2 -
 arch/parisc/oprofile/Kconfig   |   23 ---------------------
 arch/powerpc/Kconfig           |   15 --------------
 arch/powerpc/oprofile/Kconfig  |   24 ----------------------
 arch/ppc/Kconfig               |    2 -
 arch/s390/Kconfig              |   16 ---------------
 arch/s390/oprofile/Kconfig     |   22 --------------------
 arch/sh/Kconfig                |    2 -
 arch/sh/oprofile/Kconfig       |   23 ---------------------
 arch/sh64/Kconfig              |    2 -
 arch/sh64/oprofile/Kconfig     |   23 ---------------------
 arch/sparc/Kconfig             |    6 -----
 arch/sparc/oprofile/Kconfig    |   17 ----------------
 arch/sparc64/Kconfig           |   15 --------------
 arch/sparc64/oprofile/Kconfig  |   17 ----------------
 arch/um/Kconfig                |    2 +
 arch/v850/Kconfig              |    2 +
 arch/x86_64/Kconfig            |   15 --------------
 arch/x86_64/oprofile/Kconfig   |   17 ----------------
 arch/xtensa/Kconfig            |    2 +
 kernel/Kconfig.instrumentation |   43 +++++++++++++++++++++++++++++++++++++++++
 40 files changed, 75 insertions(+), 452 deletions(-)
arch/alpha/oprofile/Kconfig deleted +0 -23
Index: linux-2.6-lttng/arch/alpha/oprofile/Kconfig
===================================================================
@@ -1,23 +0,0 @@
-
-menu "Profiling support"
-	depends on EXPERIMENTAL
-
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-	  
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
-endmenu
-
arch/arm/oprofile/Kconfig deleted +0 -42

42 lines not on this page · raw message

arch/blackfin/oprofile/Kconfig deleted +0 -29
Index: linux-2.6-lttng/arch/blackfin/oprofile/Kconfig
===================================================================
@@ -1,29 +0,0 @@
-menu "Profiling support"
-depends on EXPERIMENTAL
-
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
-config HARDWARE_PM
-	tristate "Hardware Performance Monitor Profiling"
-	depends on PROFILING
-	help
-	  take use of hardware performance monitor to profiling the kernel
-	  and application.
-
-	  If unsure, say N.
-
-endmenu
arch/i386/oprofile/Kconfig deleted +0 -17
Index: linux-2.6-lttng/arch/i386/oprofile/Kconfig
===================================================================
@@ -1,17 +0,0 @@
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-	  
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
arch/ia64/oprofile/Kconfig deleted +0 -20
Index: linux-2.6-lttng/arch/ia64/oprofile/Kconfig
===================================================================
@@ -1,20 +0,0 @@
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  Due to firmware bugs, you may need to use the "nohalt" boot
-	  option if you're using OProfile with the hardware performance
-	  counters.
-
-	  If unsure, say N.
-
arch/m32r/oprofile/Kconfig deleted +0 -23
Index: linux-2.6-lttng/arch/m32r/oprofile/Kconfig
===================================================================
@@ -1,23 +0,0 @@
-
-menu "Profiling support"
-	depends on EXPERIMENTAL
-
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
-endmenu
-
arch/mips/oprofile/Kconfig deleted +0 -23
Index: linux-2.6-lttng/arch/mips/oprofile/Kconfig
===================================================================
@@ -1,23 +0,0 @@
-
-menu "Profiling support"
-	depends on EXPERIMENTAL
-
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING && !MIPS_MT_SMTC && EXPERIMENTAL
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
-endmenu
-
arch/parisc/oprofile/Kconfig deleted +0 -23
Index: linux-2.6-lttng/arch/parisc/oprofile/Kconfig
===================================================================
@@ -1,23 +0,0 @@
-
-menu "Profiling support"
-	depends on EXPERIMENTAL
-
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-	  
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
-endmenu
-
arch/powerpc/oprofile/Kconfig deleted +0 -24
Index: linux-2.6-lttng/arch/powerpc/oprofile/Kconfig
===================================================================
@@ -1,24 +0,0 @@
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
-config OPROFILE_CELL
-	bool "OProfile for Cell Broadband Engine"
-	depends on (SPU_FS = y && OPROFILE = m) || (SPU_FS = y && OPROFILE = y) || (SPU_FS = m && OPROFILE = m)
-	default y
-	help
-	  Profiling of Cell BE SPUs requires special support enabled
-	  by this option.
arch/s390/oprofile/Kconfig deleted +0 -22
Index: linux-2.6-lttng/arch/s390/oprofile/Kconfig
===================================================================
@@ -1,22 +0,0 @@
-
-menu "Profiling support"
-
-config PROFILING
-	bool "Profiling support"
-	help
-	  Say Y here to enable profiling support mechanisms used by
-	  profilers such as readprofile or OProfile.
-
-
-config OPROFILE
-	tristate "OProfile system profiling"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
-endmenu
-
arch/sh/oprofile/Kconfig deleted +0 -23
Index: linux-2.6-lttng/arch/sh/oprofile/Kconfig
===================================================================
@@ -1,23 +0,0 @@
-
-menu "Profiling support"
-	depends on EXPERIMENTAL
-
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-	  
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
-endmenu
-
arch/sh64/oprofile/Kconfig deleted +0 -23
Index: linux-2.6-lttng/arch/sh64/oprofile/Kconfig
===================================================================
@@ -1,23 +0,0 @@
-
-menu "Profiling support"
-	depends on EXPERIMENTAL
-
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
-endmenu
-
arch/sparc/oprofile/Kconfig deleted +0 -17
Index: linux-2.6-lttng/arch/sparc/oprofile/Kconfig
===================================================================
@@ -1,17 +0,0 @@
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-	  
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
arch/sparc64/oprofile/Kconfig deleted +0 -17
Index: linux-2.6-lttng/arch/sparc64/oprofile/Kconfig
===================================================================
@@ -1,17 +0,0 @@
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-	  
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
arch/x86_64/oprofile/Kconfig deleted +0 -17
Index: linux-2.6-lttng/arch/x86_64/oprofile/Kconfig
===================================================================
@@ -1,17 +0,0 @@
-config PROFILING
-	bool "Profiling support (EXPERIMENTAL)"
-	help
-	  Say Y here to enable the extended profiling support mechanisms used
-	  by profilers such as OProfile.
-	  
-
-config OPROFILE
-	tristate "OProfile system profiling (EXPERIMENTAL)"
-	depends on PROFILING
-	help
-	  OProfile is a profiling system capable of profiling the
-	  whole system, include the kernel, kernel modules, libraries,
-	  and applications.
-
-	  If unsure, say N.
-
kernel/Kconfig.instrumentation new file +43 -0

43 lines not on this page · raw message

arch/i386/Kconfig +1 -24
Index: linux-2.6-lttng/arch/i386/Kconfig
===================================================================
@@ -1251,30 +1251,7 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-menuconfig INSTRUMENTATION
-	bool "Instrumentation Support"
-	default y
-	---help---
-	  Say Y here to get to see options related to performance measurement,
-	  debugging, and testing. This option alone does not add any kernel code.
-
-	  If you say N, all options in this submenu will be skipped and disabled.
-
-if INSTRUMENTATION
-
-source "arch/i386/oprofile/Kconfig"
-
-config KPROBES
-	bool "Kprobes"
-	depends on KALLSYMS && MODULES
-	help
-	  Kprobes allows you to trap at almost any kernel address and
-	  execute a callback function.  register_kprobe() establishes
-	  a probepoint and specifies the callback.  Kprobes is useful
-	  for kernel debugging, non-intrusive instrumentation and testing.
-	  If in doubt, say "N".
-
-endif # INSTRUMENTATION
+source "kernel/Kconfig.instrumentation"
 
 source "arch/i386/Kconfig.debug"
 
arch/alpha/Kconfig +1 -1
Index: linux-2.6-lttng/arch/alpha/Kconfig
===================================================================
@@ -654,7 +654,7 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-source "arch/alpha/oprofile/Kconfig"
+source "kernel/Kconfig.instrumentation"
 
 source "arch/alpha/Kconfig.debug"
 
arch/arm/Kconfig +1 -1
Index: linux-2.6-lttng/arch/arm/Kconfig
===================================================================
@@ -1061,7 +1061,7 @@ endmenu
 
 source "fs/Kconfig"
 
-source "arch/arm/oprofile/Kconfig"
+source "kernel/Kconfig.instrumentation"
 
 source "arch/arm/Kconfig.debug"
 
arch/blackfin/Kconfig +1 -1
Index: linux-2.6-lttng/arch/blackfin/Kconfig
===================================================================
@@ -914,7 +914,7 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-source "arch/blackfin/oprofile/Kconfig"
+source "kernel/Kconfig.instrumentation"
 
 menu "Kernel hacking"
 
arch/cris/Kconfig +2 -0
Index: linux-2.6-lttng/arch/cris/Kconfig
===================================================================
@@ -196,6 +196,8 @@ source "sound/Kconfig"
 
 source "drivers/usb/Kconfig"
 
+source "kernel/Kconfig.instrumentation"
+
 source "arch/cris/Kconfig.debug"
 
 source "security/Kconfig"
arch/frv/Kconfig +2 -0
Index: linux-2.6-lttng/arch/frv/Kconfig
===================================================================
@@ -375,6 +375,8 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
+source "kernel/Kconfig.instrumentation"
+
 source "arch/frv/Kconfig.debug"
 
 source "security/Kconfig"
arch/h8300/Kconfig +2 -0
Index: linux-2.6-lttng/arch/h8300/Kconfig
===================================================================
@@ -223,6 +223,8 @@ endmenu
 
 source "fs/Kconfig"
 
+source "kernel/Kconfig.instrumentation"
+
 source "arch/h8300/Kconfig.debug"
 
 source "security/Kconfig"
arch/ia64/Kconfig +1 -14
Index: linux-2.6-lttng/arch/ia64/Kconfig
===================================================================
@@ -582,20 +582,7 @@ config IRQ_PER_CPU
 
 source "arch/ia64/hp/sim/Kconfig"
 
-menu "Instrumentation Support"
-
-source "arch/ia64/oprofile/Kconfig"
-
-config KPROBES
-	bool "Kprobes"
-	depends on KALLSYMS && MODULES
-	help
-	  Kprobes allows you to trap at almost any kernel address and
-	  execute a callback function.  register_kprobe() establishes
-	  a probepoint and specifies the callback.  Kprobes is useful
-	  for kernel debugging, non-intrusive instrumentation and testing.
-	  If in doubt, say "N".
-endmenu
+source "kernel/Kconfig.instrumentation"
 
 source "arch/ia64/Kconfig.debug"
 
arch/m32r/Kconfig +1 -1
Index: linux-2.6-lttng/arch/m32r/Kconfig
===================================================================
@@ -426,7 +426,7 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-source "arch/m32r/oprofile/Kconfig"
+source "kernel/Kconfig.instrumentation"
 
 source "arch/m32r/Kconfig.debug"
 
arch/m68k/Kconfig +2 -0
Index: linux-2.6-lttng/arch/m68k/Kconfig
===================================================================
@@ -683,6 +683,8 @@ endmenu
 
 source "fs/Kconfig"
 
+source "kernel/Kconfig.instrumentation"
+
 source "arch/m68k/Kconfig.debug"
 
 source "security/Kconfig"
arch/m68knommu/Kconfig +2 -0
Index: linux-2.6-lttng/arch/m68knommu/Kconfig
===================================================================
@@ -696,6 +696,8 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
+source "kernel/Kconfig.instrumentation"
+
 source "arch/m68knommu/Kconfig.debug"
 
 source "security/Kconfig"
arch/mips/Kconfig +1 -1
Index: linux-2.6-lttng/arch/mips/Kconfig
===================================================================
@@ -1961,7 +1961,7 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-source "arch/mips/oprofile/Kconfig"
+source "kernel/Kconfig.instrumentation"
 
 source "arch/mips/Kconfig.debug"
 
arch/parisc/Kconfig +1 -1
Index: linux-2.6-lttng/arch/parisc/Kconfig
===================================================================
@@ -267,7 +267,7 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-source "arch/parisc/oprofile/Kconfig"
+source "kernel/Kconfig.instrumentation"
 
 source "arch/parisc/Kconfig.debug"
 
arch/powerpc/Kconfig +1 -14
Index: linux-2.6-lttng/arch/powerpc/Kconfig
===================================================================
@@ -638,20 +638,7 @@ source "arch/powerpc/sysdev/qe_lib/Kconf
 
 source "lib/Kconfig"
 
-menu "Instrumentation Support"
-
-source "arch/powerpc/oprofile/Kconfig"
-
-config KPROBES
-	bool "Kprobes"
-	depends on !BOOKE && !4xx && KALLSYMS && MODULES
-	help
-	  Kprobes allows you to trap at almost any kernel address and
-	  execute a callback function.  register_kprobe() establishes
-	  a probepoint and specifies the callback.  Kprobes is useful
-	  for kernel debugging, non-intrusive instrumentation and testing.
-	  If in doubt, say "N".
-endmenu
+source "kernel/Kconfig.instrumentation"
 
 source "arch/powerpc/Kconfig.debug"
 
arch/ppc/Kconfig +1 -1
Index: linux-2.6-lttng/arch/ppc/Kconfig
===================================================================
@@ -1307,7 +1307,7 @@ endmenu
 
 source "lib/Kconfig"
 
-source "arch/powerpc/oprofile/Kconfig"
+source "kernel/Kconfig.instrumentation"
 
 source "arch/ppc/Kconfig.debug"
 
arch/s390/Kconfig +1 -15
Index: linux-2.6-lttng/arch/s390/Kconfig
===================================================================
@@ -529,21 +529,7 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-menu "Instrumentation Support"
-
-source "arch/s390/oprofile/Kconfig"
-
-config KPROBES
-	bool "Kprobes (EXPERIMENTAL)"
-	depends on EXPERIMENTAL && MODULES
-	help
-	  Kprobes allows you to trap at almost any kernel address and
-	  execute a callback function.	register_kprobe() establishes
-	  a probepoint and specifies the callback.  Kprobes is useful
-	  for kernel debugging, non-intrusive instrumentation and testing.
-	  If in doubt, say "N".
-
-endmenu
+source "kernel/Kconfig.instrumentation"
 
 source "arch/s390/Kconfig.debug"
 
arch/sh/Kconfig +1 -1
Index: linux-2.6-lttng/arch/sh/Kconfig
===================================================================
@@ -749,7 +749,7 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-source "arch/sh/oprofile/Kconfig"
+source "kernel/Kconfig.instrumentation"
 
 source "arch/sh/Kconfig.debug"
 
arch/sh64/Kconfig +1 -1
Index: linux-2.6-lttng/arch/sh64/Kconfig
===================================================================
@@ -285,7 +285,7 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-source "arch/sh64/oprofile/Kconfig"
+source "kernel/Kconfig.instrumentation"
 
 source "arch/sh64/Kconfig.debug"
 
arch/sparc/Kconfig +1 -5
Index: linux-2.6-lttng/arch/sparc/Kconfig
===================================================================
@@ -320,11 +320,7 @@ endmenu
 
 source "fs/Kconfig"
 
-menu "Instrumentation Support"
-
-source "arch/sparc/oprofile/Kconfig"
-
-endmenu
+source "kernel/Kconfig.instrumentation"
 
 source "arch/sparc/Kconfig.debug"
 
arch/sparc64/Kconfig +1 -14
Index: linux-2.6-lttng/arch/sparc64/Kconfig
===================================================================
@@ -460,20 +460,7 @@ source "drivers/fc4/Kconfig"
 
 source "fs/Kconfig"
 
-menu "Instrumentation Support"
-
-source "arch/sparc64/oprofile/Kconfig"
-
-config KPROBES
-	bool "Kprobes (EXPERIMENTAL)"
-	depends on KALLSYMS && EXPERIMENTAL && MODULES
-	help
-	  Kprobes allows you to trap at almost any kernel address and
-	  execute a callback function.  register_kprobe() establishes
-	  a probepoint and specifies the callback.  Kprobes is useful
-	  for kernel debugging, non-intrusive instrumentation and testing.
-	  If in doubt, say "N".
-endmenu
+source "kernel/Kconfig.instrumentation"
 
 source "arch/sparc64/Kconfig.debug"
 
arch/um/Kconfig +2 -0
Index: linux-2.6-lttng/arch/um/Kconfig
===================================================================
@@ -289,4 +289,6 @@ config INPUT
 	bool
 	default n
 
+source "kernel/Kconfig.instrumentation"
+
 source "arch/um/Kconfig.debug"
arch/v850/Kconfig +2 -0
Index: linux-2.6-lttng/arch/v850/Kconfig
===================================================================
@@ -331,6 +331,8 @@ source "sound/Kconfig"
 
 source "drivers/usb/Kconfig"
 
+source "kernel/Kconfig.instrumentation"
+
 source "arch/v850/Kconfig.debug"
 
 source "security/Kconfig"
arch/x86_64/Kconfig +1 -14
Index: linux-2.6-lttng/arch/x86_64/Kconfig
===================================================================
@@ -829,20 +829,7 @@ source "drivers/firmware/Kconfig"
 
 source fs/Kconfig
 
-menu "Instrumentation Support"
-
-source "arch/x86_64/oprofile/Kconfig"
-
-config KPROBES
-	bool "Kprobes"
-	depends on KALLSYMS && MODULES
-	help
-	  Kprobes allows you to trap at almost any kernel address and
-	  execute a callback function.  register_kprobe() establishes
-	  a probepoint and specifies the callback.  Kprobes is useful
-	  for kernel debugging, non-intrusive instrumentation and testing.
-	  If in doubt, say "N".
-endmenu
+source "kernel/Kconfig.instrumentation"
 
 source "arch/x86_64/Kconfig.debug"
 
arch/xtensa/Kconfig +2 -0
Index: linux-2.6-lttng/arch/xtensa/Kconfig
===================================================================
@@ -251,6 +251,8 @@ config EMBEDDED_RAMDISK_IMAGE
 	  provide one yourself.
 endmenu
 
+source "kernel/Kconfig.instrumentation"
+
 source "arch/xtensa/Kconfig.debug"
 
 source "security/Kconfig"
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#2 lore raw

PATCH 2/5 Linux Kernel Markers

In reply to Mathieu Desnoyers

The marker activation functions sits in kernel/marker.c. A hash table is used to keep track of the registered probes and armed markers, so the markers within a newly loaded module that should be active can be activated at module load time.

marker_query has been removed. marker_get_first, marker_get_next and marker_release should be used as iterators on the markers.

Changelog:
- markers_mutex now nests inside module_mutex rather than the opposite.
- Iteration on modules is now done in module.c.
- module_mutex is not exported anymore.
- Don't declare a __markers_strings section.
- Simplified: do not use immediate values, just a simple variable read. (removed dependency on immediate values).
- Removed the args field in the marker structure : it was not used.
- Removed the iterators. Will come back with the actual users.
- Merge the markers menu entry.

---

 include/asm-generic/vmlinux.lds.h |    7 
 include/linux/marker.h            |  130 +++++++++
 include/linux/module.h            |   12 
 kernel/Kconfig.instrumentation    |    6 
 kernel/Makefile                   |    1 
 kernel/marker.c                   |  527 ++++++++++++++++++++++++++++++++++++++
 kernel/module.c                   |   30 ++
 7 files changed, 711 insertions(+), 2 deletions(-)
include/asm-generic/vmlinux.lds.h +6 -1
Index: linux-2.6-lttng/include/asm-generic/vmlinux.lds.h
===================================================================
@@ -12,7 +12,11 @@
 /* .data section */
 #define DATA_DATA							\
 	*(.data)							\
-	*(.data.init.refok)
+	*(.data.init.refok)						\
+	. = ALIGN(8);							\
+	VMLINUX_SYMBOL(__start___markers) = .;				\
+	*(__markers)							\
+	VMLINUX_SYMBOL(__stop___markers) = .;
 
 #define RO_DATA(align)							\
 	. = ALIGN((align));						\
@@ -20,6 +24,7 @@
 		VMLINUX_SYMBOL(__start_rodata) = .;			\
 		*(.rodata) *(.rodata.*)					\
 		*(__vermagic)		/* Kernel version magic */	\
+		*(__markers_strings)	/* Markers: strings */		\
 	}								\
 									\
 	.rodata1          : AT(ADDR(.rodata1) - LOAD_OFFSET) {		\
include/linux/marker.h new file +130 -0

130 lines not on this page · raw message

include/linux/module.h +12 -0
Index: linux-2.6-lttng/include/linux/module.h
===================================================================
@@ -15,6 +15,7 @@
 #include <linux/stringify.h>
 #include <linux/kobject.h>
 #include <linux/moduleparam.h>
+#include <linux/marker.h>
 #include <asm/local.h>
 
 #include <asm/module.h>
@@ -370,6 +371,10 @@ struct module
 	/* The command line arguments (may be mangled).  People like
 	   keeping pointers to this stuff */
 	char *args;
+#ifdef CONFIG_MARKERS
+	struct __mark_marker *markers;
+	unsigned int num_markers;
+#endif
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
@@ -473,6 +478,8 @@ int unregister_module_notifier(struct no
 
 extern void print_modules(void);
 
+extern void module_update_markers(struct module *probe_module, int *refcount);
+
 #else /* !CONFIG_MODULES... */
 #define EXPORT_SYMBOL(sym)
 #define EXPORT_SYMBOL_GPL(sym)
@@ -572,6 +579,11 @@ static inline void print_modules(void)
 {
 }
 
+static inline void module_update_markers(struct module *probe_module,
+		int *refcount)
+{
+}
+
 #endif /* CONFIG_MODULES */
 
 struct device_driver;
kernel/module.c +29 -1
Index: linux-2.6-lttng/kernel/module.c
===================================================================
@@ -1717,6 +1717,8 @@ static struct module *load_module(void _
 	unsigned int unusedcrcindex;
 	unsigned int unusedgplindex;
 	unsigned int unusedgplcrcindex;
+	unsigned int markersindex;
+	unsigned int markersstringsindex;
 	struct module *mod;
 	long err = 0;
 	void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */
@@ -1982,6 +1984,8 @@ static struct module *load_module(void _
 		add_taint_module(mod, TAINT_FORCED_MODULE);
 	}
 #endif
+	markersindex = find_sec(hdr, sechdrs, secstrings, "__markers");
+ 	markersstringsindex = find_sec(hdr, sechdrs, secstrings, "__markers_strings");
 
 	/* Now do relocations. */
 	for (i = 1; i < hdr->e_shnum; i++) {
@@ -2004,6 +2008,11 @@ static struct module *load_module(void _
 		if (err < 0)
 			goto cleanup;
 	}
+#ifdef CONFIG_MARKERS
+	mod->markers = (void *)sechdrs[markersindex].sh_addr;
+	mod->num_markers =
+		sechdrs[markersindex].sh_size / sizeof(*mod->markers);
+#endif
 
         /* Find duplicate symbols */
 	err = verify_export_symbols(mod);
@@ -2027,7 +2036,11 @@ static struct module *load_module(void _
 	 if (err < 0)
 		 goto nomodsectinfo;
 #endif
-
+#ifdef CONFIG_MARKERS
+	if (!mod->taints)
+		marker_update_probe_range(mod->markers,
+			mod->markers + mod->num_markers, NULL, NULL);
+#endif
 	err = module_finalize(hdr, sechdrs, mod);
 	if (err < 0)
 		goto cleanup;
@@ -2629,3 +2642,18 @@ EXPORT_SYMBOL(module_remove_driver);
 void struct_module(struct module *mod) { return; }
 EXPORT_SYMBOL(struct_module);
 #endif
+
+#ifdef CONFIG_MARKERS
+void module_update_markers(struct module *probe_module, int *refcount)
+{
+	struct module *mod;
+
+	mutex_lock(&module_mutex);
+	list_for_each_entry(mod, &modules, list)
+		if (!mod->taints)
+			marker_update_probe_range(mod->markers,
+				mod->markers + mod->num_markers,
+				probe_module, refcount);
+	mutex_unlock(&module_mutex);
+}
+#endif
kernel/marker.c new file +527 -0

527 lines not on this page · raw message

kernel/Kconfig.instrumentation +6 -0
Index: linux-2.6-lttng/kernel/Kconfig.instrumentation
===================================================================
@@ -40,4 +40,10 @@ config KPROBES
 	  for kernel debugging, non-intrusive instrumentation and testing.
 	  If in doubt, say "N".
 
+config MARKERS
+	bool "Activate markers"
+	help
+	  Place an empty function call at each marker site. Can be
+	  dynamically changed for a probe function.
+
 endif # INSTRUMENTATION
kernel/Makefile +1 -0
Index: linux-2.6-lttng/kernel/Makefile
===================================================================
@@ -61,6 +61,7 @@ obj-$(CONFIG_SYSCTL) += utsname_sysctl.o
 obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
 obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
 obj-$(CONFIG_RESOURCE_COUNTERS) += res_counter.o
+obj-$(CONFIG_MARKERS) += marker.o
 
 ifneq ($(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER),y)
 # According to Alan Modra <[email protected]>, the -fno-omit-frame-pointer is
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#3 lore raw

Re: [patch 2/5] Linux Kernel Markers

Quoted 1 line · Mathieu Desnoyers

+struct __mark_marker;

Hi Mathieu,

How about, "struct marker". You've taken the "marker*" namespace, so
all these underscores are __gratuitious__ :)

kernel/marker.c line 34

Quoted 5 lines
kernel/marker.c new file +5 -0
+/*
+ * module_mutex nests inside markers_mutex. Markers mutex protects the builtin
+ * and module markers, the hash table and deferred_sync.
+ */
+DEFINE_MUTEX(markers_mutex);

This can be static AFAICT.

The rest looks fine.

Cheers,
Rusty.

#4 lore raw

Linux Kernel Markers - Coding Style Fixes

Linux Kernel Markers - Coding Style Fixes

- Use struct marker instead of struct __mark_marker.
- Change a "private_data" parameter name for "private".
- DEFINE_MUTEX(markers_mutex) is made static.

This patch applies after linux-kernel-markers.patch.

---
 include/linux/marker.h |   18 +++++++++---------
 include/linux/module.h |    2 +-
 kernel/marker.c        |   22 ++++++++++------------
 3 files changed, 20 insertions(+), 22 deletions(-)
include/linux/marker.h +9 -9
Index: linux-2.6-lttng/include/linux/marker.h
===================================================================
@@ -15,11 +15,11 @@
 #include <linux/types.h>
 
 struct module;
-struct __mark_marker;
+struct marker;
 
 /**
  * marker_probe_func - Type of a marker probe function
- * @mdata: pointer of type struct __mark_marker
+ * @mdata: pointer of type struct marker
  * @private_data: caller site private data
  * @fmt: format string
  * @...: variable argument list
@@ -27,10 +27,10 @@ struct __mark_marker;
  * Type of marker probe functions. They receive the mdata and need to parse the
  * format string to recover the variable argument list.
  */
-typedef void marker_probe_func(const struct __mark_marker *mdata,
+typedef void marker_probe_func(const struct marker *mdata,
 	void *private_data, const char *fmt, ...);
 
-struct __mark_marker {
+struct marker {
 	const char *name;	/* Marker name */
 	const char *format;	/* Marker format string, describing the
 				 * variable argument list.
@@ -57,7 +57,7 @@ struct __mark_marker {
 		static const char __mstrtab_format_##name[]		\
 		__attribute__((section("__markers_strings")))		\
 		= format;						\
-		static struct __mark_marker __mark_##name		\
+		static struct marker __mark_##name			\
 		__attribute__((section("__markers"))) =			\
 		{ __mstrtab_name_##name, __mstrtab_format_##name,	\
 		0, __mark_empty_function, NULL };			\
@@ -72,13 +72,13 @@ struct __mark_marker {
 		}							\
 	} while (0)
 
-extern void marker_update_probe_range(struct __mark_marker *begin,
-	struct __mark_marker *end, struct module *probe_module, int *refcount);
+extern void marker_update_probe_range(struct marker *begin,
+	struct marker *end, struct module *probe_module, int *refcount);
 #else /* !CONFIG_MARKERS */
 #define __trace_mark(name, call_data, format, args...) \
 		__mark_check_format(format, ## args)
-static inline void marker_update_probe_range(struct __mark_marker *begin,
-	struct __mark_marker *end, struct module *probe_module, int *refcount)
+static inline void marker_update_probe_range(struct marker *begin,
+	struct marker *end, struct module *probe_module, int *refcount)
 { }
 #endif /* CONFIG_MARKERS */
 
include/linux/module.h +1 -1
Index: linux-2.6-lttng/include/linux/module.h
===================================================================
@@ -372,7 +372,7 @@ struct module
 	   keeping pointers to this stuff */
 	char *args;
 #ifdef CONFIG_MARKERS
-	struct __mark_marker *markers;
+	struct marker *markers;
 	unsigned int num_markers;
 #endif
 };
kernel/marker.c +10 -12
Index: linux-2.6-lttng/kernel/marker.c
===================================================================
@@ -24,14 +24,14 @@
 #include <linux/marker.h>
 #include <linux/err.h>
 
-extern struct __mark_marker __start___markers[];
-extern struct __mark_marker __stop___markers[];
+extern struct marker __start___markers[];
+extern struct marker __stop___markers[];
 
 /*
  * module_mutex nests inside markers_mutex. Markers mutex protects the builtin
  * and module markers, the hash table and deferred_sync.
  */
-DEFINE_MUTEX(markers_mutex);
+static DEFINE_MUTEX(markers_mutex);
 
 /*
  * Marker deferred synchronization.
@@ -63,7 +63,7 @@ static struct hlist_head marker_table[MA
 
 /**
  * __mark_empty_function - Empty probe callback
- * @mdata: pointer of type const struct __mark_marker
+ * @mdata: pointer of type const struct marker
  * @fmt: format string
  * @...: variable argument list
  *
@@ -72,8 +72,7 @@ static struct hlist_head marker_table[MA
  * though the function pointer change and the marker enabling are two distinct
  * operations that modifies the execution flow of preemptible code.
  */
-void __mark_empty_function(const struct __mark_marker *mdata,
-	void *private_data,
+void __mark_empty_function(const struct marker *mdata, void *private,
 	const char *fmt, ...)
 {
 }
@@ -207,8 +206,7 @@ static int marker_set_format(struct mark
 /*
  * Sets the probe callback corresponding to one marker.
  */
-static int set_marker(struct marker_entry **entry,
-			struct __mark_marker *elem)
+static int set_marker(struct marker_entry **entry, struct marker *elem)
 {
 	int ret;
 	WARN_ON(strcmp((*entry)->name, elem->name) != 0);
@@ -240,7 +238,7 @@ static int set_marker(struct marker_entr
  * empty function insures that the original callback is not used anymore. This
  * insured by preemption disabling around the call site.
  */
-static void disable_marker(struct __mark_marker *elem)
+static void disable_marker(struct marker *elem)
 {
 	elem->state = 0;
 	elem->call = __mark_empty_function;
@@ -261,11 +259,11 @@ static void disable_marker(struct __mark
  * Updates the probe callback corresponding to a range of markers.
  * Must be called with markers_mutex held.
  */
-void marker_update_probe_range(struct __mark_marker *begin,
-	struct __mark_marker *end, struct module *probe_module,
+void marker_update_probe_range(struct marker *begin,
+	struct marker *end, struct module *probe_module,
 	int *refcount)
 {
-	struct __mark_marker *iter;
+	struct marker *iter;
 	struct marker_entry *mark_entry;
 
 	for (iter = begin; iter < end; iter++) {
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#5 lore raw

Re: Linux Kernel Markers - Coding Style Fixes

Quoted 8 lines · * Mathieu Desnoyers ([email protected]) wrote:

Linux Kernel Markers - Coding Style Fixes

- Use struct marker instead of struct __mark_marker.
- Change a "private_data" parameter name for "private".
- DEFINE_MUTEX(markers_mutex) is made static.

This patch applies after linux-kernel-markers.patch.

Hi Andrew,

Just to be precise wrt what you have, it applies right after:
linux-kernel-markers-checkpatch-fixes.patch
in your series.

Mathieu

Quoted 158 lines
---
 include/linux/marker.h |   18 +++++++++---------
 include/linux/module.h |    2 +-
 kernel/marker.c        |   22 ++++++++++------------
 3 files changed, 20 insertions(+), 22 deletions(-)

Index: linux-2.6-lttng/include/linux/marker.h
===================================================================

include/linux/marker.h +9 -9
@@ -15,11 +15,11 @@
 #include <linux/types.h>
 
 struct module;
-struct __mark_marker;
+struct marker;
 
 /**
  * marker_probe_func - Type of a marker probe function
- * @mdata: pointer of type struct __mark_marker
+ * @mdata: pointer of type struct marker
  * @private_data: caller site private data
  * @fmt: format string
  * @...: variable argument list
@@ -27,10 +27,10 @@ struct __mark_marker;
  * Type of marker probe functions. They receive the mdata and need to parse the
  * format string to recover the variable argument list.
  */
-typedef void marker_probe_func(const struct __mark_marker *mdata,
+typedef void marker_probe_func(const struct marker *mdata,
 	void *private_data, const char *fmt, ...);
 
-struct __mark_marker {
+struct marker {
 	const char *name;	/* Marker name */
 	const char *format;	/* Marker format string, describing the
 				 * variable argument list.
@@ -57,7 +57,7 @@ struct __mark_marker {
 		static const char __mstrtab_format_##name[]		\
 		__attribute__((section("__markers_strings")))		\
 		= format;						\
-		static struct __mark_marker __mark_##name		\
+		static struct marker __mark_##name			\
 		__attribute__((section("__markers"))) =			\
 		{ __mstrtab_name_##name, __mstrtab_format_##name,	\
 		0, __mark_empty_function, NULL };			\
@@ -72,13 +72,13 @@ struct __mark_marker {
 		}							\
 	} while (0)
 
-extern void marker_update_probe_range(struct __mark_marker *begin,
-	struct __mark_marker *end, struct module *probe_module, int *refcount);
+extern void marker_update_probe_range(struct marker *begin,
+	struct marker *end, struct module *probe_module, int *refcount);
 #else /* !CONFIG_MARKERS */
 #define __trace_mark(name, call_data, format, args...) \
 		__mark_check_format(format, ## args)
-static inline void marker_update_probe_range(struct __mark_marker *begin,
-	struct __mark_marker *end, struct module *probe_module, int *refcount)
+static inline void marker_update_probe_range(struct marker *begin,
+	struct marker *end, struct module *probe_module, int *refcount)
 { }
 #endif /* CONFIG_MARKERS */
 

Index: linux-2.6-lttng/include/linux/module.h
===================================================================

include/linux/module.h +1 -1
@@ -372,7 +372,7 @@ struct module
 	   keeping pointers to this stuff */
 	char *args;
 #ifdef CONFIG_MARKERS
-	struct __mark_marker *markers;
+	struct marker *markers;
 	unsigned int num_markers;
 #endif
 };

Index: linux-2.6-lttng/kernel/marker.c
===================================================================

kernel/marker.c +10 -12
@@ -24,14 +24,14 @@
 #include <linux/marker.h>
 #include <linux/err.h>
 
-extern struct __mark_marker __start___markers[];
-extern struct __mark_marker __stop___markers[];
+extern struct marker __start___markers[];
+extern struct marker __stop___markers[];
 
 /*
  * module_mutex nests inside markers_mutex. Markers mutex protects the builtin
  * and module markers, the hash table and deferred_sync.
  */
-DEFINE_MUTEX(markers_mutex);
+static DEFINE_MUTEX(markers_mutex);
 
 /*
  * Marker deferred synchronization.
@@ -63,7 +63,7 @@ static struct hlist_head marker_table[MA
 
 /**
  * __mark_empty_function - Empty probe callback
- * @mdata: pointer of type const struct __mark_marker
+ * @mdata: pointer of type const struct marker
  * @fmt: format string
  * @...: variable argument list
  *
@@ -72,8 +72,7 @@ static struct hlist_head marker_table[MA
  * though the function pointer change and the marker enabling are two distinct
  * operations that modifies the execution flow of preemptible code.
  */
-void __mark_empty_function(const struct __mark_marker *mdata,
-	void *private_data,
+void __mark_empty_function(const struct marker *mdata, void *private,
 	const char *fmt, ...)
 {
 }
@@ -207,8 +206,7 @@ static int marker_set_format(struct mark
 /*
  * Sets the probe callback corresponding to one marker.
  */
-static int set_marker(struct marker_entry **entry,
-			struct __mark_marker *elem)
+static int set_marker(struct marker_entry **entry, struct marker *elem)
 {
 	int ret;
 	WARN_ON(strcmp((*entry)->name, elem->name) != 0);
@@ -240,7 +238,7 @@ static int set_marker(struct marker_entr
  * empty function insures that the original callback is not used anymore. This
  * insured by preemption disabling around the call site.
  */
-static void disable_marker(struct __mark_marker *elem)
+static void disable_marker(struct marker *elem)
 {
 	elem->state = 0;
 	elem->call = __mark_empty_function;
@@ -261,11 +259,11 @@ static void disable_marker(struct __mark
  * Updates the probe callback corresponding to a range of markers.
  * Must be called with markers_mutex held.
  */
-void marker_update_probe_range(struct __mark_marker *begin,
-	struct __mark_marker *end, struct module *probe_module,
+void marker_update_probe_range(struct marker *begin,
+	struct marker *end, struct module *probe_module,
 	int *refcount)
 {
-	struct __mark_marker *iter;
+	struct marker *iter;
 	struct marker_entry *mark_entry;
 
 	for (iter = begin; iter < end; iter++) {
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#6 lore raw

PATCH 1/1 Linux Kernel Markers - Alignment Fix

In reply to Mathieu Desnoyers

Linux Kernel Markers - Alignment Fix

Fix the alignment of the struct marker declaration in the trace_mark() macro. Otherwise, we run into problems on 64 bits architectures where the struct marker structure is bigger than 32 bytes : gcc becomes alignment-happy and align these structures on 32 bytes while the iteration on the markers is itself only aligned on 8 bytes, as specified by the type attribute. Specifying the alignmentof the type only is not enough to restrain gcc happiness; we must specify a variable alignment attribute too.

This bug causes NULL pointer dereference at module load time on x86_64 when we load marker-example.ko.

Thanks to Mike Mason for reporting this.

It applies to 2.6.23-rc8-mm2, after the linux kernel markers coding style fixes. This is an important bugfix that should be merged with the markers.

CC Christoph Hellwig <[email protected]>
CC Mike Mason <[email protected]>
CC "Frank Ch. Eigler" <[email protected]>
---
 include/linux/marker.h |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/marker.h +1 -1
Index: linux-2.6-lttng/include/linux/marker.h
===================================================================
@@ -58,7 +58,7 @@ struct marker {
 		__attribute__((section("__markers_strings")))		\
 		= format;						\
 		static struct marker __mark_##name			\
-		__attribute__((section("__markers"))) =			\
+		__attribute__((section("__markers"), aligned(8))) =	\
 		{ __mstrtab_name_##name, __mstrtab_format_##name,	\
 		0, __mark_empty_function, NULL };			\
 		asm volatile ("" : : "i" (&__mark_##name));		\
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#7 lore raw

PATCH 1/1 Change struct marker users

In reply to Rusty Russell

Change struct marker users

Prior to use struct marker in the linux kernel markers, we need to clean two drivers which use this structure name.

Change bonding driver types :
- struct marker to struct bond_marker.
- marker_t to bond_marker_t.
- marker_header to bond_marker_header.
- marker_header_t to bond_marker_header_t.

Change qla4xxx struct marker_entry usage :
- Change struct marker_entry for struct qla4_marker_entry.

This patch applies before the
linux-kernel-markers-coding-style-fix.patch.

---
 drivers/net/bonding/bond_3ad.c  |   32 +++++++++++++++++---------------
 drivers/net/bonding/bond_3ad.h  |   12 ++++++------
 drivers/scsi/qla4xxx/ql4_fw.h   |    2 +-
 drivers/scsi/qla4xxx/ql4_iocb.c |    2 +-
 4 files changed, 25 insertions(+), 23 deletions(-)
drivers/scsi/qla4xxx/ql4_fw.h +1 -1
Index: linux-2.6-lttng/drivers/scsi/qla4xxx/ql4_fw.h
===================================================================
@@ -671,7 +671,7 @@ struct continuation_t1_entry {
 #define ET_CONTINUE	ET_CONT_T1
 
 /* Marker entry structure*/
-struct marker_entry {
+struct qla4_marker_entry {
 	struct qla4_header hdr;	/* 00-03 */
 
 	uint32_t system_defined; /* 04-07 */
drivers/scsi/qla4xxx/ql4_iocb.c +1 -1
Index: linux-2.6-lttng/drivers/scsi/qla4xxx/ql4_iocb.c
===================================================================
@@ -69,7 +69,7 @@ static int qla4xxx_get_req_pkt(struct sc
 static int qla4xxx_send_marker_iocb(struct scsi_qla_host *ha,
 				    struct ddb_entry *ddb_entry, int lun)
 {
-	struct marker_entry *marker_entry;
+	struct qla4_marker_entry *marker_entry;
 	unsigned long flags = 0;
 	uint8_t status = QLA_SUCCESS;
 
drivers/net/bonding/bond_3ad.c +17 -15
Index: linux-2.6-lttng/drivers/net/bonding/bond_3ad.c
===================================================================
@@ -126,7 +126,7 @@ static struct aggregator *__get_active_a
 
 // ================= main 802.3ad protocol functions ==================
 static int ad_lacpdu_send(struct port *port);
-static int ad_marker_send(struct port *port, struct marker *marker);
+static int ad_marker_send(struct port *port, struct bond_marker *marker);
 static void ad_mux_machine(struct port *port);
 static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port);
 static void ad_tx_machine(struct port *port);
@@ -139,8 +139,8 @@ static void ad_initialize_port(struct po
 static void ad_initialize_lacpdu(struct lacpdu *Lacpdu);
 static void ad_enable_collecting_distributing(struct port *port);
 static void ad_disable_collecting_distributing(struct port *port);
-static void ad_marker_info_received(struct marker *marker_info, struct port *port);
-static void ad_marker_response_received(struct marker *marker, struct port *port);
+static void ad_marker_info_received(struct bond_marker *marker_info, struct port *port);
+static void ad_marker_response_received(struct bond_marker *marker, struct port *port);
 
 
 /////////////////////////////////////////////////////////////////////////////////
@@ -889,12 +889,12 @@ static int ad_lacpdu_send(struct port *p
  * Returns:   0 on success
  *          < 0 on error
  */
-static int ad_marker_send(struct port *port, struct marker *marker)
+static int ad_marker_send(struct port *port, struct bond_marker *marker)
 {
 	struct slave *slave = port->slave;
 	struct sk_buff *skb;
-	struct marker_header *marker_header;
-	int length = sizeof(struct marker_header);
+	struct bond_marker_header *marker_header;
+	int length = sizeof(struct bond_marker_header);
 	struct mac_addr lacpdu_multicast_address = AD_MULTICAST_LACPDU_ADDR;
 
 	skb = dev_alloc_skb(length + 16);
@@ -909,7 +909,7 @@ static int ad_marker_send(struct port *p
 	skb->network_header = skb->mac_header + ETH_HLEN;
 	skb->protocol = PKT_TYPE_LACPDU;
 
-	marker_header = (struct marker_header *)skb_put(skb, length);
+	marker_header = (struct bond_marker_header *)skb_put(skb, length);
 
 	marker_header->ad_header.destination_address = lacpdu_multicast_address;
 	/* Note: source addres is set to be the member's PERMANENT address, because we use it
@@ -1709,7 +1709,7 @@ static void ad_disable_collecting_distri
  */
 static void ad_marker_info_send(struct port *port)
 {
-	struct marker marker;
+	struct bond_marker marker;
 	u16 index;
 
 	// fill the marker PDU with the appropriate values
@@ -1742,13 +1742,14 @@ static void ad_marker_info_send(struct p
  * @port: the port we're looking at
  *
  */
-static void ad_marker_info_received(struct marker *marker_info,struct port *port)
+static void ad_marker_info_received(struct bond_marker *marker_info,
+	struct port *port)
 {
-	struct marker marker;
+	struct bond_marker marker;
 
 	// copy the received marker data to the response marker
 	//marker = *marker_info;
-	memcpy(&marker, marker_info, sizeof(struct marker));
+	memcpy(&marker, marker_info, sizeof(struct bond_marker));
 	// change the marker subtype to marker response
 	marker.tlv_type=AD_MARKER_RESPONSE_SUBTYPE;
 	// send the marker response
@@ -1767,7 +1768,8 @@ static void ad_marker_info_received(stru
  * response for marker PDU's, in this stage, but only to respond to marker
  * information.
  */
-static void ad_marker_response_received(struct marker *marker, struct port *port)
+static void ad_marker_response_received(struct bond_marker *marker,
+	struct port *port)
 {
 	marker=NULL; // just to satisfy the compiler
 	port=NULL;  // just to satisfy the compiler
@@ -2164,15 +2166,15 @@ static void bond_3ad_rx_indication(struc
 		case AD_TYPE_MARKER:
 			// No need to convert fields to Little Endian since we don't use the marker's fields.
 
-			switch (((struct marker *)lacpdu)->tlv_type) {
+			switch (((struct bond_marker *)lacpdu)->tlv_type) {
 			case AD_MARKER_INFORMATION_SUBTYPE:
 				dprintk("Received Marker Information on port %d\n", port->actor_port_number);
-				ad_marker_info_received((struct marker *)lacpdu, port);
+				ad_marker_info_received((struct bond_marker *)lacpdu, port);
 				break;
 
 			case AD_MARKER_RESPONSE_SUBTYPE:
 				dprintk("Received Marker Response on port %d\n", port->actor_port_number);
-				ad_marker_response_received((struct marker *)lacpdu, port);
+				ad_marker_response_received((struct bond_marker *)lacpdu, port);
 				break;
 
 			default:
drivers/net/bonding/bond_3ad.h +6 -6
Index: linux-2.6-lttng/drivers/net/bonding/bond_3ad.h
===================================================================
@@ -92,7 +92,7 @@ typedef enum {
 typedef enum {
 	AD_MARKER_INFORMATION_SUBTYPE = 1, // marker imformation subtype
 	AD_MARKER_RESPONSE_SUBTYPE     // marker response subtype
-} marker_subtype_t;
+} bond_marker_subtype_t;
 
 // timers types(43.4.9 in the 802.3ad standard)
 typedef enum {
@@ -148,7 +148,7 @@ typedef struct lacpdu_header {
 } lacpdu_header_t;
 
 // Marker Protocol Data Unit(PDU) structure(43.5.3.2 in the 802.3ad standard)
-typedef struct marker {
+typedef struct bond_marker {
 	u8 subtype;		 //  = 0x02  (marker PDU)
 	u8 version_number;	 //  = 0x01
 	u8 tlv_type;		 //  = 0x01  (marker information)
@@ -161,12 +161,12 @@ typedef struct marker {
 	u8 tlv_type_terminator;	     //  = 0x00
 	u8 terminator_length;	     //  = 0x00
 	u8 reserved_90[90];	     //  = 0
-} marker_t;
+} bond_marker_t;
 
-typedef struct marker_header {
+typedef struct bond_marker_header {
 	struct ad_header ad_header;
-	struct marker marker;
-} marker_header_t;
+	struct bond_marker marker;
+} bond_marker_header_t;
 
 #pragma pack()
 
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#8 lore raw

PATCH 3/5 Add samples subdir

In reply to Mathieu Desnoyers

From: Mathieu Desnoyers <[email protected]>

Begin infrastructure for kernel code samples in the samples/ directory. Add its Kconfig and Kbuild files.
Source its Kconfig file in all arch/ Kconfigs.

Changelog:
- Move menu to Kernel Hacking
- Don't build with the kernel image

---
 Makefile          |    3 +++
 lib/Kconfig.debug |    2 ++
 samples/Kconfig   |   11 +++++++++++
 3 files changed, 16 insertions(+)
Makefile +3 -0
Index: linux-2.6-lttng/Makefile
===================================================================
@@ -772,6 +772,9 @@ vmlinux: $(vmlinux-lds) $(vmlinux-init) 
 ifdef CONFIG_HEADERS_CHECK
 	$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
 endif
+ifdef CONFIG_SAMPLES
+	$(Q)$(MAKE) $(build)=samples
+endif
 	$(call vmlinux-modpost)
 	$(call if_changed_rule,vmlinux__)
 	$(Q)rm -f .old_version
samples/Kconfig new file +11 -0
Index: linux-2.6-lttng/samples/Kconfig
===================================================================
@@ -0,0 +1,11 @@
+# samples/Kconfig
+
+menuconfig SAMPLES
+	bool "Sample kernel code"
+	help
+	  You can build and test sample kernel code here.
+
+if SAMPLES
+
+
+endif # SAMPLES
lib/Kconfig.debug +2 -0
Index: linux-2.6-lttng/lib/Kconfig.debug
===================================================================
@@ -558,3 +558,5 @@ config FAULT_INJECTION_STACKTRACE_FILTER
 	  Provide stacktrace filter for fault-injection capabilities
 
 source "lib/Kconfig.kgdb"
+
+source "samples/Kconfig"
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#9 lore raw

Re: [patch 3/5] Add samples subdir

Quoted 11 lines · Mathieu Desnoyers

From: Mathieu Desnoyers <[email protected]>

Begin infrastructure for kernel code samples in the samples/ directory. Add its Kconfig and Kbuild files.
Source its Kconfig file in all arch/ Kconfigs.

Changelog:
- Move menu to Kernel Hacking
- Don't build with the kernel image

I think that this one is S-O-B by both of us.

Signature · 2 lines
~Randy
Phaedrus says that Quality is about caring.
#10 lore raw

Re: [patch 3/5] Add samples subdir

Quoted 7 lines · * Randy Dunlap ([email protected]) wrote:
Quoted 6 lines · Mathieu Desnoyers

From: Mathieu Desnoyers <[email protected]>

Begin infrastructure for kernel code samples in the samples/ directory. Add its Kconfig and Kbuild files.
Source its Kconfig file in all arch/ Kconfigs.

Quoted 8 lines
Quoted 5 lines

Changelog:
- Move menu to Kernel Hacking
- Don't build with the kernel image

I think that this one is S-O-B by both of us.

Yes, thanks,

Quoted 3 lines
Signature · 2 lines
~Randy
Phaedrus says that Quality is about caring.
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#11 lore raw

PATCH 4/5 Linux Kernel Markers - Samples

In reply to Mathieu Desnoyers

Module example showing how to use the Linux Kernel Markers.

---
 samples/Kconfig                  |    5 +
 samples/Makefile                 |    3 +
 samples/markers/Makefile         |    4 +
 samples/markers/marker-example.c |   55 +++++++++++++++++++++
 samples/markers/probe-example.c  |   98 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 165 insertions(+)
samples/markers/Makefile new file +4 -0
Index: linux-2.6-lttng/samples/markers/Makefile
===================================================================
@@ -0,0 +1,4 @@
+# builds the kprobes example kernel modules;
+# then to use one (as root):  insmod <module_name.ko>
+
+obj-$(CONFIG_SAMPLE_MARKERS) += probe-example.o marker-example.o
samples/markers/marker-example.c new file +55 -0

55 lines not on this page · raw message

samples/markers/probe-example.c new file +98 -0

98 lines not on this page · raw message

samples/Makefile new file +3 -0
Index: linux-2.6-lttng/samples/Makefile
===================================================================
@@ -0,0 +1,3 @@
+# Makefile for Linux samples code
+
+obj-$(CONFIG_SAMPLES)	+= markers/
samples/Kconfig +5 -0
Index: linux-2.6-lttng/samples/Kconfig
===================================================================
@@ -7,5 +7,10 @@ menuconfig SAMPLES
 
 if SAMPLES
 
+config SAMPLE_MARKERS
+	tristate "Build markers examples -- loadable modules only"
+	depends on MARKERS && m
+	help
+	  This build markers example modules.
 
 endif # SAMPLES
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#12 lore raw

PATCH 1/1 Linux Kernel Markers - Samples Coding Style Fix

Linux Kernel Markers - Samples Coding Style Fix

- Change struct __mark_marker to struct marker.

It applies after linux-kernel-markers-samples-checkpatch-fixes.patch in the series.

---
 samples/markers/probe-example.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
samples/markers/probe-example.c +4 -4
Index: linux-2.6-lttng/samples/markers/probe-example.c
===================================================================
@@ -20,8 +20,8 @@ struct probe_data {
 	marker_probe_func *probe_func;
 };
 
-void probe_subsystem_event(const struct __mark_marker *mdata,
-		void *private, const char *format, ...)
+void probe_subsystem_event(const struct marker *mdata, void *private,
+	const char *format, ...)
 {
 	va_list ap;
 	/* Declare args */
@@ -43,8 +43,8 @@ void probe_subsystem_event(const struct 
 
 atomic_t eventb_count = ATOMIC_INIT(0);
 
-void probe_subsystem_eventb(const struct __mark_marker *mdata,
-	void *private, const char *format, ...)
+void probe_subsystem_eventb(const struct marker *mdata, void *private,
+	const char *format, ...)
 {
 	/* Increment counter */
 	atomic_inc(&eventb_count);
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
maintainer
#13 lore raw

Re: [patch 4/5] Linux Kernel Markers - Samples

In reply to Mathieu Desnoyers
Quoted 1 line · On Fri, 28 Sep 2007 10:28:49 -0400 Mathieu Desnoyers…

Module example showing how to use the Linux Kernel Markers.

s390:

samples/markers/marker-example.c: In function 'my_open':
samples/markers/marker-example.c:22: warning: asm operand 0 probably doesn't match constraints samples/markers/marker-example.c:24: warning: asm operand 0 probably doesn't match constraints samples/markers/marker-example.c:22: error: impossible constraint in 'asm' samples/markers/marker-example.c:24: error: impossible constraint in 'asm'

#14 lore raw

Re: [patch 4/5] Linux Kernel Markers - Samples

Quoted 11 lines · * Andrew Morton ([email protected]) wrote:
Quoted 1 line · On Fri, 28 Sep 2007 10:28:49 -0400 Mathieu Desnoyers…

Module example showing how to use the Linux Kernel Markers.

s390:

samples/markers/marker-example.c: In function 'my_open':
samples/markers/marker-example.c:22: warning: asm operand 0 probably doesn't match constraints samples/markers/marker-example.c:24: warning: asm operand 0 probably doesn't match constraints samples/markers/marker-example.c:22: error: impossible constraint in 'asm' samples/markers/marker-example.c:24: error: impossible constraint in 'asm'

Hrm, I have s390 gcc-4.1.1 here and cannot reproduce the problem with it.

What compiler are you using ?

This is clearly caused by the :
asm volatile ("" : : "i" (&__mark_##name));

It is there to specify that the __mark_##name variable is used. In the first implementations, I did not pass it as a parameter to the following function call, so I had to find a way to tell gcc that it should not go away. I first planned to use a "__used" attribute, but Jeremy said it was buggy on some gcc versions. (http://lkml.org/lkml/2006/10/17/235)

He suggested the following:
asm volatile("" : : "m" (thing));

But I guess it ended up not working so well, since I changed it for a "i" operand. However, if some s390 gccs do not like it, it's better to figure out another solution.

Well, as a very very simple solution, let's just remove the asm. It is not needed anymore since the pointer is passed as parameter to the called function.

The patch follows.

Mathieu

Linux Kernel Markers - Remove Unneeded asm

On s390 (with some compiler) :

Quoted 7 lines

samples/markers/marker-example.c: In function 'my_open':
samples/markers/marker-example.c:22: warning: asm operand 0 probably doesn't match constraints
samples/markers/marker-example.c:24: warning: asm operand 0 probably doesn't match constraints
samples/markers/marker-example.c:22: error: impossible constraint in 'asm' samples/markers/marker-example.c:24: error: impossible constraint in 'asm'

It is there to specify that the __mark_##name variable is used. In the first implementations, I did not pass it as a parameter to the following function call, so I had to find a way to tell gcc that it should not go away. I first planned to use a "__used" attribute, but Jeremy said it was buggy on some gcc versions. (http://lkml.org/lkml/2006/10/17/235)

He suggested the following:
asm volatile("" : : "m" (thing));

But I guess it ended up not working so well, since I changed it for a "i" operand. However, if some s390 gccs do not like it, it's better to figure out another solution.

Well, as a very very simple solution, let's just remove the asm. It is not needed anymore since the pointer is passed as parameter to the called function.

---
 include/linux/marker.h |    1 -
 1 file changed, 1 deletion(-)
include/linux/marker.h +0 -1
Index: linux-2.6-lttng/include/linux/marker.h
===================================================================
@@ -61,7 +61,6 @@ struct marker {
 		__attribute__((section("__markers"), aligned(8))) =	\
 		{ __mstrtab_name_##name, __mstrtab_format_##name,	\
 		0, __mark_empty_function, NULL };			\
-		asm volatile ("" : : "i" (&__mark_##name));		\
 		__mark_check_format(format, ## args);			\
 		if (unlikely(__mark_##name.state)) {			\
 			preempt_disable();				\
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
maintainer
#15 lore raw

Re: [patch 4/5] Linux Kernel Markers - Samples

Quoted 9 lines · On Thu, 11 Oct 2007 09:27:12 -0400 Mathieu Desnoyers…
Quoted 5 lines

samples/markers/marker-example.c: In function 'my_open':
samples/markers/marker-example.c:22: warning: asm operand 0 probably doesn't match constraints samples/markers/marker-example.c:24: warning: asm operand 0 probably doesn't match constraints samples/markers/marker-example.c:22: error: impossible constraint in 'asm' samples/markers/marker-example.c:24: error: impossible constraint in 'asm'

Hrm, I have s390 gcc-4.1.1 here and cannot reproduce the problem with it.

What compiler are you using ?

4.1.0, from http://userweb.kernel.org/~akpm/cross-compilers/s390-cross.tar.gz

#16 lore raw

PATCH 5/5 Linux Kernel Markers - Documentation

In reply to Mathieu Desnoyers

Here is some documentation explaining what is/how to use the Linux Kernel Markers.

Changelog:
- Move the examples to a separate "samples" patch.

---

 Documentation/markers.txt |   81 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)
Documentation/markers.txt new file +81 -0
Index: linux-2.6-lttng/Documentation/markers.txt
===================================================================
@@ -0,0 +1,81 @@
+ 	             Using the Linux Kernel Markers
+
+			    Mathieu Desnoyers
+
+
+This document introduces Linux Kernel Markers and their use. It provides
+examples of how to insert markers in the kernel and connect probe functions to
+them and provides some examples of probe functions.
+
+
+* Purpose of markers
+
+A marker placed in code provides a hook to call a function (probe) that you can
+provide at runtime. A marker can be "on" (a probe is connected to it) or "off"
+(no probe is attached). When a marker is "off" it has no effect, except for
+adding a tiny time penalty (checking a condition for a branch) and space
+penalty (adding a few bytes for the function call at the end of the
+instrumented function and adds a data structure in a separate section).  When a
+marker is "on", the function you provide is called each time the marker is
+executed, in the execution context of the caller. When the function provided
+ends its execution, it returns to the caller (continuing from the marker site).
+
+You can put markers at important locations in the code. Markers are
+lightweight hooks that can pass an arbitrary number of parameters,
+described in a printk-like format string, to the attached probe function.
+
+They can be used for tracing and performance accounting.
+
+
+* Usage
+
+In order to use the macro trace_mark, you should include linux/marker.h.
+
+#include <linux/marker.h>
+
+And,
+
+trace_mark(subsystem_event, "%d %s", someint, somestring);
+Where :
+- subsystem_event is an identifier unique to your event
+    - subsystem is the name of your subsystem.
+    - event is the name of the event to mark.
+- "%d %s" is the formatted string for the serializer.
+- someint is an integer.
+- somestring is a char pointer.
+
+Connecting a function (probe) to a marker is done by providing a probe (function
+to call) for the specific marker through marker_probe_register() and can be
+activated by calling marker_arm(). Marker deactivation can be done by calling
+marker_disarm() as many times as marker_arm() has been called. Removing a probe
+is done through marker_probe_unregister(); it will disarm the probe and make
+sure there is no caller left using the probe when it returns. Probe removal is
+preempt-safe because preemption is disabled around the probe call. See the
+"Probe example" section below for a sample probe module.
+
+The marker mechanism supports inserting multiple instances of the same marker.
+Markers can be put in inline functions, inlined static functions, and
+unrolled loops as well as regular functions.
+
+The naming scheme "subsystem_event" is suggested here as a convention intended
+to limit collisions. Marker names are global to the kernel: they are considered
+as being the same whether they are in the core kernel image or in modules.
+Conflicting format strings for markers with the same name will cause the markers
+to be detected to have a different format string not to be armed and will output
+a printk warning which identifies the inconsistency:
+
+"Format mismatch for probe probe_name (format), marker (format)"
+
+
+* Probe / marker example
+
+See the example provided in samples/markers/src
+
+Compile them with your kernel.
+
+Run, as root :
+modprobe marker-example (insmod order is not important)
+modprobe probe-example
+cat /proc/marker-example (returns an expected error)
+rmmod marker-example probe-example
+dmesg
Signature · 3 lines
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68