lkml.org 
[lkml]   [2006]   [Sep]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] Linux Kernel Markers
    Hello,

    Following this huge discussion thread, I tried to come with a marker mechanism
    (which is something everyone seems to agree that is a necessity) that would be
    useful to each kind of tracing (dynamic and static) (concerned projects :
    SystemTAP, LKET, LKST, LTTng) and even combinations of those. Religious
    considerations aside, I really think that this kind of generic markup is
    necessary to fill *everybody*'s need. If I forgot about a specific genericity
    aspect, please tell me.

    I take for agreed that both static and dynamic tracing are useful for different
    needs and that a full markup must support both and combinations, letting the
    user or the distribution choose.

    If you like it, please add the right menuconfig lines in arch/*/Kconfig and a
    NOPS macro in include/asm-*/marker.h.

    Comments are, as always, welcome.

    Mathieu

    --- BEGIN ---

    --- a/arch/i386/Kconfig
    +++ b/arch/i386/Kconfig
    @@ -1082,6 +1082,8 @@ config KPROBES
    for kernel debugging, non-intrusive instrumentation and testing.
    If in doubt, say "N".

    +source "kernel/Kconfig.marker"
    +
    source "ltt/Kconfig"

    endmenu
    --- /dev/null
    +++ b/include/asm-i386/marker.h
    @@ -0,0 +1,12 @@
    +/*****************************************************************************
    + * marker.h
    + *
    + * Code markup for dynamic and static tracing. i386 support.
    + *
    + * Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
    + *
    + * September 2006
    + */
    +
    +#define JPROBE_TARGET \
    + __asm__ ( GENERIC_NOP5 )
    --- /dev/null
    +++ b/include/linux/marker.h
    @@ -0,0 +1,77 @@
    +/*****************************************************************************
    + * marker.h
    + *
    + * Code markup for dynamic and static tracing.
    + *
    + * Use either :
    + * MARK
    + * MARK_NOPRINT (will never call printk)
    + * MARK_STATIC (not dynamically instrumentable, will never call printk)
    + *
    + * Example :
    + *
    + * MARK(subsystem_event, "Event happened %d %s", someint, somestring);
    + * Where :
    + * - Subsystem is the name of your subsystem.
    + * - event is the name of the event to mark.
    + * - "Event happened %d %s" is the formatted string for printk.
    + * - someint is an integer.
    + * - somestring is a char *.
    + *
    + * Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
    + *
    + * September 2006
    + */
    +
    +#include <linux/config.h>
    +#include <linux/kernel.h>
    +
    +#include <asm/marker.h>
    +
    +#define MARK_SYM(event) \
    + __asm__ ( "__mark_" KBUILD_BASENAME "_" #event ":" )
    +
    +#define MARK_INACTIVE(event, format, args...)
    +
    +#define MARK_PRINT(event, format, args...) printk(format, ##args);
    +
    +#define MARK_FPROBE(event, format, args...) fprobe_##event(args);
    +
    +#define MARK_KPROBE(event, format, args...) MARK_SYM(event);
    +
    +#define MARK_JPROBE(event, format, args...) \
    + do { \
    + MARK_SYM(event); \
    + JPROBE_TARGET; \
    + } while(0)
    +
    +/* Menu configured markers */
    +#ifndef CONFIG_MARK
    +#define MARK MARK_INACTIVE
    +#elif defined(CONFIG_MARK_PRINT)
    +#define MARK MARK_PRINT
    +#elif defined(CONFIG_MARK_FPROBE)
    +#define MARK MARK_FPROBE
    +#elif defined(CONFIG_MARK_KPROBE)
    +#define MARK MARK_KPROBE
    +#elif defined(CONFIG_MARK_JPROBE)
    +#define MARK MARK_JPROBE
    +#endif
    +
    +#ifndef CONFIG_MARK_NOPRINT
    +#define MARK_NOPRINT MARK_INACTIVE
    +#elif defined(CONFIG_MARK_NOPRINT_FPROBE)
    +#define MARK_NOPRINT MARK_FPROBE
    +#elif defined(CONFIG_MARK_NOPRINT_KPROBE)
    +#define MARK_NOPRINT MARK_KPROBE
    +#elif defined(CONFIG_MARK_NOPRINT_JPROBE)
    +#define MARK_NOPRINT MARK_JPROBE
    +#endif
    +
    +#ifndef CONFIG_MARK_STATIC
    +#define MARK_STATIC MARK_INACTIVE
    +#else
    +#define MARK_STATIC MARK_FPROBE
    +#endif
    +
    +
    --- /dev/null
    +++ b/kernel/Kconfig.marker
    @@ -0,0 +1,75 @@
    +# Code markers configuration
    +
    +menu "Marker configuration"
    +
    +
    +config MARK
    + bool "Enable MARK code markers"
    + default y
    + help
    + Activate markers that can call printk or can be instrumented
    + dynamically.
    +
    +choice
    + prompt "MARK code marker behavior"
    + default MARK_KPROBE
    + depends on MARK
    + help
    + Configuration of markers that can call printk or can be
    + instrumented dynamically.
    +
    +config MARK_KPROBE
    + bool "KPROBE"
    + ---help---
    + Change markers for a symbol "__mark_modulename_event".
    +config MARK_JPROBE
    + bool "JPROBE"
    + ---help---
    + Change markers for a symbol "__mark_modulename_event"
    + and create a target for a high speed dynamic probe.
    +config MARK_FPROBE
    + bool "FPROBE"
    + ---help---
    + Change markers for a function call.
    +config MARK_PRINT
    + bool "PRINT"
    + ---help---
    + Call printk from the marker.
    +endchoice
    +
    +config MARK_NOPRINT
    + bool "Enable MARK_NOPRINT code markers"
    + default y
    + help
    + Activate markers that cannot call printk.
    +
    +choice
    + prompt "MARK_NOPRINT code marker behavior"
    + default MARK_NOPRINT_KPROBE
    + depends on MARK_NOPRINT
    + help
    + Configuration of markers that cannot call printk.
    +
    +config MARK_NOPRINT_KPROBE
    + bool "KPROBE"
    + ---help---
    + Change markers for a symbol "__mark_modulename_event".
    +config MARK_NOPRINT_JPROBE
    + bool "JPROBE"
    + ---help---
    + Change markers for a symbol "__mark_modulename_event"
    + and create a target for a high speed dynamic probe.
    +config MARK_NOPRINT_FPROBE
    + bool "FPROBE"
    + ---help---
    + Change markers for a function call.
    +endchoice
    +
    +config MARK_STATIC
    + bool "Enable MARK_STATIC code markers"
    + default y
    + help
    + Activate markers that cannot be instrumented dynamically. They will
    + generate function calls to each function-style probe.
    +
    +endmenu

    --- END ---

    OpenPGP public key: http://krystal.dyndns.org:8080/key/compudj.gpg
    Key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-09-19 01:47    [W:0.052 / U:0.900 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site