public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: akpm@linux-foundation.org, Ingo Molnar <mingo@elte.hu>,
	linux-kernel@vger.kernel.org
Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Subject: [patch 26/26] Linux Kernel Markers - Use Immediate Values
Date: Thu, 24 Jan 2008 15:27:32 -0500	[thread overview]
Message-ID: <20080124203343.541464477@polymtl.ca> (raw)
In-Reply-To: 20080124202706.250598537@polymtl.ca

[-- Attachment #1: linux-kernel-markers-immediate-values.patch --]
[-- Type: text/plain, Size: 7882 bytes --]

Make markers use immediate values.

Changelog :
- Use imv_* instead of immediate_*.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
---
 Documentation/markers.txt |   17 +++++++++++++----
 include/linux/marker.h    |   42 ++++++++++++++++++++++++++++++++----------
 kernel/marker.c           |    8 ++++++--
 kernel/module.c           |    1 +
 4 files changed, 52 insertions(+), 16 deletions(-)

Index: linux-2.6-lttng.mm/include/linux/marker.h
===================================================================
--- linux-2.6-lttng.mm.orig/include/linux/marker.h	2008-01-24 14:40:50.000000000 -0500
+++ linux-2.6-lttng.mm/include/linux/marker.h	2008-01-24 14:44:30.000000000 -0500
@@ -12,6 +12,7 @@
  * See the file COPYING for more details.
  */
 
+#include <linux/immediate.h>
 #include <linux/types.h>
 
 struct module;
@@ -42,7 +43,7 @@ struct marker {
 	const char *format;	/* Marker format string, describing the
 				 * variable argument list.
 				 */
-	char state;		/* Marker state. */
+	DEFINE_IMV(char, state);/* Immediate value state. */
 	char ptype;		/* probe type : 0 : single, 1 : multi */
 	void (*call)(const struct marker *mdata,	/* Probe wrapper */
 		void *call_private, const char *fmt, ...);
@@ -53,13 +54,14 @@ struct marker {
 #ifdef CONFIG_MARKERS
 
 /*
+ * Generic marker flavor always available.
  * Note : the empty asm volatile with read constraint is used here instead of a
  * "used" attribute to fix a gcc 4.1.x bug.
  * Make sure the alignment of the structure in the __markers section will
  * not add unwanted padding between the beginning of the section and the
  * structure. Force alignment to the same alignment as the section start.
  */
-#define __trace_mark(name, call_private, format, args...)		\
+#define __trace_mark(generic, name, call_private, format, args...)	\
 	do {								\
 		static const char __mstrtab_##name[]			\
 		__attribute__((section("__markers_strings")))		\
@@ -70,17 +72,23 @@ struct marker {
 		0, 0, marker_probe_cb,					\
 		{ __mark_empty_function, NULL}, NULL };			\
 		__mark_check_format(format, ## args);			\
-		if (unlikely(__mark_##name.state)) {			\
-			(*__mark_##name.call)				\
-				(&__mark_##name, call_private,		\
-				format, ## args);			\
+		if (!generic) {						\
+			if (unlikely(imv_read(__mark_##name.state)))	\
+				(*__mark_##name.call)			\
+					(&__mark_##name, call_private,	\
+					format, ## args);		\
+		} else {						\
+			if (unlikely(_imv_read(__mark_##name.state)))	\
+				(*__mark_##name.call)			\
+					(&__mark_##name, call_private,	\
+					format, ## args);		\
 		}							\
 	} while (0)
 
 extern void marker_update_probe_range(struct marker *begin,
 	struct marker *end);
 #else /* !CONFIG_MARKERS */
-#define __trace_mark(name, call_private, format, args...) \
+#define __trace_mark(generic, name, call_private, format, args...) \
 		__mark_check_format(format, ## args)
 static inline void marker_update_probe_range(struct marker *begin,
 	struct marker *end)
@@ -88,15 +96,29 @@ static inline void marker_update_probe_r
 #endif /* CONFIG_MARKERS */
 
 /**
- * trace_mark - Marker
+ * trace_mark - Marker using code patching
  * @name: marker name, not quoted.
  * @format: format string
  * @args...: variable argument list
  *
- * Places a marker.
+ * Places a marker using optimized code patching technique (imv_read())
+ * to be enabled.
  */
 #define trace_mark(name, format, args...) \
-	__trace_mark(name, NULL, format, ## args)
+	__trace_mark(0, name, NULL, format, ## args)
+
+/**
+ * _trace_mark - Marker using variable read
+ * @name: marker name, not quoted.
+ * @format: format string
+ * @args...: variable argument list
+ *
+ * Places a marker using a standard memory read (_imv_read()) to be
+ * enabled. Should be used for markers in __init and __exit functions and in
+ * lockdep code.
+ */
+#define _trace_mark(name, format, args...) \
+	__trace_mark(1, name, NULL, format, ## args)
 
 /**
  * MARK_NOARGS - Format string for a marker with no argument.
Index: linux-2.6-lttng.mm/kernel/marker.c
===================================================================
--- linux-2.6-lttng.mm.orig/kernel/marker.c	2008-01-24 14:40:50.000000000 -0500
+++ linux-2.6-lttng.mm/kernel/marker.c	2008-01-24 14:44:30.000000000 -0500
@@ -23,6 +23,7 @@
 #include <linux/rcupdate.h>
 #include <linux/marker.h>
 #include <linux/err.h>
+#include <linux/immediate.h>
 
 extern struct marker __start___markers[];
 extern struct marker __stop___markers[];
@@ -544,7 +545,7 @@ static int set_marker(struct marker_entr
 	 */
 	smp_wmb();
 	elem->ptype = (*entry)->ptype;
-	elem->state = active;
+	elem->state__imv = active;
 
 	return 0;
 }
@@ -558,7 +559,7 @@ static int set_marker(struct marker_entr
 static void disable_marker(struct marker *elem)
 {
 	/* leave "call" as is. It is known statically. */
-	elem->state = 0;
+	elem->state__imv = 0;
 	elem->single.func = __mark_empty_function;
 	/* Update the function before setting the ptype */
 	smp_wmb();
@@ -625,6 +626,9 @@ static void marker_update_probes(void)
 	marker_update_probe_range(__start___markers, __stop___markers);
 	/* Markers in modules. */
 	module_update_markers();
+	/* Update immediate values */
+	core_imv_update();
+	module_imv_update();
 }
 
 /**
Index: linux-2.6-lttng.mm/Documentation/markers.txt
===================================================================
--- linux-2.6-lttng.mm.orig/Documentation/markers.txt	2008-01-24 14:09:00.000000000 -0500
+++ linux-2.6-lttng.mm/Documentation/markers.txt	2008-01-24 14:44:30.000000000 -0500
@@ -15,10 +15,12 @@ provide at runtime. A marker can be "on"
 (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).
+instrumented function and adds a data structure in a separate section). The
+immediate values are used to minimize the impact on data cache, encoding the
+condition in the instruction stream. 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,
@@ -69,6 +71,13 @@ a printk warning which identifies the in
 "Format mismatch for probe probe_name (format), marker (format)"
 
 
+* Optimization for a given architecture
+
+To force use of a non-optimized version of the markers, _trace_mark() should be
+used. It takes the same parameters as the normal markers, but it does not use
+the immediate values based on code patching.
+
+
 * Probe / marker example
 
 See the example provided in samples/markers/src
Index: linux-2.6-lttng.mm/kernel/module.c
===================================================================
--- linux-2.6-lttng.mm.orig/kernel/module.c	2008-01-24 14:41:09.000000000 -0500
+++ linux-2.6-lttng.mm/kernel/module.c	2008-01-24 14:44:30.000000000 -0500
@@ -2002,6 +2002,7 @@ static struct module *load_module(void _
 			mod->markers + mod->num_markers);
 #endif
 #ifdef CONFIG_IMMEDIATE
+		/* Immediate values must be updated after markers */
 		imv_update_range(mod->immediate,
 			mod->immediate + mod->num_immediate);
 #endif

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

      parent reply	other threads:[~2008-01-24 20:34 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-24 20:27 [patch 00/26] Instrumentation Support Enhancement (2.6.24-rc8-mm1) Mathieu Desnoyers
2008-01-24 20:27 ` [patch 01/26] Linux Kernel Markers Support for Proprierary Modules Mathieu Desnoyers
2008-01-24 22:19   ` Jon Masters
2008-01-24 20:27 ` [patch 02/26] Fix ARM to play nicely with generic Instrumentation menu Mathieu Desnoyers
2008-01-24 21:13   ` Russell King
2008-01-24 21:23     ` Mathieu Desnoyers
2008-01-24 22:17       ` Russell King
2008-01-24 20:27 ` [patch 03/26] Move Kconfig.instrumentation to arch/Kconfig and init/Kconfig Mathieu Desnoyers
2008-01-24 21:00   ` Randy Dunlap
2008-01-24 21:05     ` Mathieu Desnoyers
2008-01-24 22:03   ` Mathieu Desnoyers
2008-01-24 23:05   ` Haavard Skinnemoen
2008-01-24 20:27 ` [patch 04/26] Kprobes - use a mutex to protect the instruction pages list Mathieu Desnoyers
2008-01-24 20:27 ` [patch 05/26] Kprobes - do not use kprobes mutex in arch code Mathieu Desnoyers
2008-01-24 20:27 ` [patch 06/26] Kprobes - declare kprobe_mutex static Mathieu Desnoyers
2008-01-24 20:27 ` [patch 07/26] Add INIT_ARRAY() to kernel.h Mathieu Desnoyers
2008-01-24 20:39   ` Jan Engelhardt
2008-01-24 20:54     ` [patch 07/26] Add INIT_ARRAY() to kernel.h (updated) Mathieu Desnoyers
2008-01-24 21:08       ` Jan Engelhardt
2008-01-24 21:18         ` Mathieu Desnoyers
2008-01-24 20:58   ` [patch 07/26] Add INIT_ARRAY() to kernel.h Randy Dunlap
2008-01-24 21:04     ` Mathieu Desnoyers
2008-01-24 22:02       ` Stefan Richter
2008-01-24 22:10         ` [patch 07/26] Add INIT_ARRAY() to kernel.h (update 2) Mathieu Desnoyers
2008-01-24 22:50           ` Alexey Dobriyan
2008-01-24 23:04       ` [patch 07/26] Add INIT_ARRAY() to kernel.h H. Peter Anvin
2008-01-25 13:14         ` Mathieu Desnoyers
2008-01-25  8:03       ` Jan Engelhardt
2008-01-24 23:03   ` H. Peter Anvin
2008-01-24 20:27 ` [patch 08/26] Text Edit Lock - Architecture Independent Code Mathieu Desnoyers
2008-01-24 20:27 ` [patch 09/26] Text Edit Lock - Alternative code for x86 Mathieu Desnoyers
2008-01-24 20:27 ` [patch 10/26] Text Edit Lock - kprobes architecture independent support Mathieu Desnoyers
2008-01-24 20:27 ` [patch 11/26] Text Edit Lock - kprobes x86 Mathieu Desnoyers
2008-01-24 20:27 ` [patch 12/26] Text Edit Lock - x86_32 standardize debug rodata Mathieu Desnoyers
2008-01-24 20:27 ` [patch 13/26] Text Edit Lock - x86_64 " Mathieu Desnoyers
2008-01-24 20:27 ` [patch 14/26] Immediate Values - Architecture Independent Code Mathieu Desnoyers
2008-01-24 20:27 ` [patch 15/26] Immediate Values - Kconfig menu in EMBEDDED Mathieu Desnoyers
2008-01-24 20:27 ` [patch 16/26] Immediate Values - x86 Optimization Mathieu Desnoyers
2008-01-24 20:27 ` [patch 17/26] Add text_poke and sync_core to powerpc Mathieu Desnoyers
2008-01-24 20:27 ` [patch 18/26] Immediate Values - Powerpc Optimization Mathieu Desnoyers
2008-01-24 20:27 ` [patch 19/26] Immediate Values - Documentation Mathieu Desnoyers
2008-01-24 20:27 ` [patch 20/26] Scheduler Profiling - Use Immediate Values Mathieu Desnoyers
2008-01-24 20:27 ` [patch 21/26] Immediate Values - Move Kprobes x86 restore_interrupt to kdebug.h Mathieu Desnoyers
2008-01-24 20:27 ` [patch 22/26] Add __discard section to x86 Mathieu Desnoyers
2008-01-24 20:27 ` [patch 23/26] Immediate Values - x86 Optimization NMI and MCE support Mathieu Desnoyers
2008-01-24 20:27 ` [patch 24/26] Immediate Values - Powerpc Optimization NMI " Mathieu Desnoyers
2008-01-24 20:27 ` [patch 25/26] Immediate Values Use Arch NMI and MCE Support Mathieu Desnoyers
2008-01-24 20:27 ` Mathieu Desnoyers [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080124203343.541464477@polymtl.ca \
    --to=mathieu.desnoyers@polymtl.ca \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox