public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: LKML <linux-kernel@vger.kernel.org>, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Christoph Hellwig <hch@infradead.org>,
	Gregory Haskins <ghaskins@novell.com>,
	Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
	"William L. Irwin" <sparclinux@vger.kernel.org>,
	Steven Rostedt <srostedt@redhat.com>
Subject: Re: [RFC PATCH 03/11] Annotate core code that should not be traced
Date: Thu, 3 Jan 2008 12:42:50 -0500	[thread overview]
Message-ID: <20080103174250.GC30582@Krystal> (raw)
In-Reply-To: <20080103072227.087067007@goodmis.org>

* Steven Rostedt (rostedt@goodmis.org) wrote:
> Mark with "notrace" functions in core code that should not be
> traced.  The "notrace" attribute will prevent gcc from adding
> a call to mcount on the annotated funtions.
> 
> Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
> Signed-off-by: Steven Rostedt <srostedt@redhat.com>
> 
> ---
>  drivers/clocksource/acpi_pm.c |    8 ++++----
>  include/linux/preempt.h       |    4 ++--
>  kernel/irq/handle.c           |    2 +-
>  kernel/lockdep.c              |   27 ++++++++++++++-------------
>  kernel/rcupdate.c             |    2 +-
>  kernel/spinlock.c             |    2 +-
>  lib/smp_processor_id.c        |    2 +-
>  7 files changed, 24 insertions(+), 23 deletions(-)
> 
> Index: linux-compile.git/drivers/clocksource/acpi_pm.c
> ===================================================================
> --- linux-compile.git.orig/drivers/clocksource/acpi_pm.c	2007-12-20 01:00:29.000000000 -0500
> +++ linux-compile.git/drivers/clocksource/acpi_pm.c	2007-12-20 01:00:48.000000000 -0500
> @@ -30,13 +30,13 @@
>   */
>  u32 pmtmr_ioport __read_mostly;
>  
> -static inline u32 read_pmtmr(void)
> +static inline notrace u32 read_pmtmr(void)
>  {
>  	/* mask the output to 24 bits */
>  	return inl(pmtmr_ioport) & ACPI_PM_MASK;
>  }
>  
> -u32 acpi_pm_read_verified(void)
> +notrace u32 acpi_pm_read_verified(void)
>  {
>  	u32 v1 = 0, v2 = 0, v3 = 0;
>  
> @@ -56,12 +56,12 @@ u32 acpi_pm_read_verified(void)
>  	return v2;
>  }
>  
> -static cycle_t acpi_pm_read_slow(void)
> +static notrace cycle_t acpi_pm_read_slow(void)
>  {
>  	return (cycle_t)acpi_pm_read_verified();
>  }
>  
> -static cycle_t acpi_pm_read(void)
> +static notrace cycle_t acpi_pm_read(void)
>  {
>  	return (cycle_t)read_pmtmr();
>  }

What precision can you get from this clock source ? How many cycles are
required to read it ? Would it be useful to fall back on the CPU TSC
when they are synchronized ? Does acpi_pm_read_verified read the
timestamp atomically ? Is is a reason why you need to disable
interrupts, and therefore cannot trace NMI handlers ?

> Index: linux-compile.git/include/linux/preempt.h
> ===================================================================
> --- linux-compile.git.orig/include/linux/preempt.h	2007-12-20 01:00:29.000000000 -0500
> +++ linux-compile.git/include/linux/preempt.h	2007-12-20 01:00:48.000000000 -0500
> @@ -11,8 +11,8 @@
>  #include <linux/list.h>
>  
>  #ifdef CONFIG_DEBUG_PREEMPT
> -  extern void fastcall add_preempt_count(int val);
> -  extern void fastcall sub_preempt_count(int val);
> +  extern notrace void fastcall add_preempt_count(int val);
> +  extern notrace void fastcall sub_preempt_count(int val);
>  #else
>  # define add_preempt_count(val)	do { preempt_count() += (val); } while (0)
>  # define sub_preempt_count(val)	do { preempt_count() -= (val); } while (0)
> Index: linux-compile.git/kernel/irq/handle.c
> ===================================================================
> --- linux-compile.git.orig/kernel/irq/handle.c	2007-12-20 01:00:29.000000000 -0500
> +++ linux-compile.git/kernel/irq/handle.c	2007-12-20 01:00:48.000000000 -0500
> @@ -163,7 +163,7 @@ irqreturn_t handle_IRQ_event(unsigned in
>   * This is the original x86 implementation which is used for every
>   * interrupt type.
>   */
> -fastcall unsigned int __do_IRQ(unsigned int irq)
> +notrace fastcall unsigned int __do_IRQ(unsigned int irq)

Can you explain the notrace here ?

>  {
>  	struct irq_desc *desc = irq_desc + irq;
>  	struct irqaction *action;
> Index: linux-compile.git/kernel/lockdep.c
> ===================================================================
> --- linux-compile.git.orig/kernel/lockdep.c	2007-12-20 01:00:29.000000000 -0500
> +++ linux-compile.git/kernel/lockdep.c	2007-12-20 01:00:48.000000000 -0500
> @@ -270,14 +270,14 @@ static struct list_head chainhash_table[
>  	((key1) >> (64-MAX_LOCKDEP_KEYS_BITS)) ^ \
>  	(key2))
>  
> -void lockdep_off(void)
> +notrace void lockdep_off(void)
>  {
>  	current->lockdep_recursion++;
>  }
>  

Due to interrupt disabling in your tracing code I suppose.

>  EXPORT_SYMBOL(lockdep_off);
>  
> -void lockdep_on(void)
> +notrace void lockdep_on(void)
>  {
>  	current->lockdep_recursion--;
>  }
> @@ -1036,7 +1036,7 @@ find_usage_forwards(struct lock_class *s
>   * Return 1 otherwise and keep <backwards_match> unchanged.
>   * Return 0 on error.
>   */
> -static noinline int
> +static noinline notrace int
>  find_usage_backwards(struct lock_class *source, unsigned int depth)
>  {
>  	struct lock_list *entry;
> @@ -1586,7 +1586,7 @@ static inline int validate_chain(struct 
>   * We are building curr_chain_key incrementally, so double-check
>   * it from scratch, to make sure that it's done correctly:
>   */
> -static void check_chain_key(struct task_struct *curr)
> +static notrace void check_chain_key(struct task_struct *curr)
>  {
>  #ifdef CONFIG_DEBUG_LOCKDEP
>  	struct held_lock *hlock, *prev_hlock = NULL;
> @@ -1962,7 +1962,7 @@ static int mark_lock_irq(struct task_str
>  /*
>   * Mark all held locks with a usage bit:
>   */
> -static int
> +static notrace int
>  mark_held_locks(struct task_struct *curr, int hardirq)
>  {
>  	enum lock_usage_bit usage_bit;
> @@ -2009,7 +2009,7 @@ void early_boot_irqs_on(void)
>  /*
>   * Hardirqs will be enabled:
>   */
> -void trace_hardirqs_on(void)
> +notrace void trace_hardirqs_on(void)
>  {
>  	struct task_struct *curr = current;
>  	unsigned long ip;
> @@ -2057,7 +2057,7 @@ EXPORT_SYMBOL(trace_hardirqs_on);
>  /*
>   * Hardirqs were disabled:
>   */
> -void trace_hardirqs_off(void)
> +notrace void trace_hardirqs_off(void)
>  {
>  	struct task_struct *curr = current;
>  
> @@ -2241,8 +2241,8 @@ static inline int separate_irq_context(s
>  /*
>   * Mark a lock with a usage bit, and validate the state transition:
>   */
> -static int mark_lock(struct task_struct *curr, struct held_lock *this,
> -		     enum lock_usage_bit new_bit)
> +static notrace int mark_lock(struct task_struct *curr, struct held_lock *this,
> +			     enum lock_usage_bit new_bit)
>  {
>  	unsigned int new_mask = 1 << new_bit, ret = 1;
>  
> @@ -2648,7 +2648,7 @@ __lock_release(struct lockdep_map *lock,
>  /*
>   * Check whether we follow the irq-flags state precisely:
>   */
> -static void check_flags(unsigned long flags)
> +static notrace void check_flags(unsigned long flags)
>  {
>  #if defined(CONFIG_DEBUG_LOCKDEP) && defined(CONFIG_TRACE_IRQFLAGS)
>  	if (!debug_locks)
> @@ -2685,8 +2685,8 @@ static void check_flags(unsigned long fl
>   * We are not always called with irqs disabled - do that here,
>   * and also avoid lockdep recursion:
>   */
> -void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
> -		  int trylock, int read, int check, unsigned long ip)
> +notrace void lock_acquire(struct lockdep_map *lock, unsigned int subclass,
> +			  int trylock, int read, int check, unsigned long ip)
>  {
>  	unsigned long flags;
>  
> @@ -2708,7 +2708,8 @@ void lock_acquire(struct lockdep_map *lo
>  
>  EXPORT_SYMBOL_GPL(lock_acquire);
>  
> -void lock_release(struct lockdep_map *lock, int nested, unsigned long ip)
> +notrace void lock_release(struct lockdep_map *lock, int nested,
> +			  unsigned long ip)
>  {
>  	unsigned long flags;

Do you really use locks in your tracing code ? I thought you were using
per cpu buffers.

>  
> Index: linux-compile.git/kernel/rcupdate.c
> ===================================================================
> --- linux-compile.git.orig/kernel/rcupdate.c	2007-12-20 01:00:29.000000000 -0500
> +++ linux-compile.git/kernel/rcupdate.c	2007-12-20 01:00:48.000000000 -0500
> @@ -504,7 +504,7 @@ static int __rcu_pending(struct rcu_ctrl
>   * by the current CPU, returning 1 if so.  This function is part of the
>   * RCU implementation; it is -not- an exported member of the RCU API.
>   */
> -int rcu_pending(int cpu)
> +notrace int rcu_pending(int cpu)
>  {
>  	return __rcu_pending(&rcu_ctrlblk, &per_cpu(rcu_data, cpu)) ||
>  		__rcu_pending(&rcu_bh_ctrlblk, &per_cpu(rcu_bh_data, cpu));
> Index: linux-compile.git/kernel/spinlock.c
> ===================================================================
> --- linux-compile.git.orig/kernel/spinlock.c	2007-12-20 01:00:29.000000000 -0500
> +++ linux-compile.git/kernel/spinlock.c	2007-12-20 01:00:48.000000000 -0500
> @@ -437,7 +437,7 @@ int __lockfunc _spin_trylock_bh(spinlock
>  }
>  EXPORT_SYMBOL(_spin_trylock_bh);
>  
> -int in_lock_functions(unsigned long addr)
> +notrace int in_lock_functions(unsigned long addr)
>  {
>  	/* Linker adds these: start and end of __lockfunc functions */
>  	extern char __lock_text_start[], __lock_text_end[];
> Index: linux-compile.git/lib/smp_processor_id.c
> ===================================================================
> --- linux-compile.git.orig/lib/smp_processor_id.c	2007-12-20 01:00:29.000000000 -0500
> +++ linux-compile.git/lib/smp_processor_id.c	2007-12-20 01:00:48.000000000 -0500
> @@ -7,7 +7,7 @@
>  #include <linux/kallsyms.h>
>  #include <linux/sched.h>
>  
> -unsigned int debug_smp_processor_id(void)
> +notrace unsigned int debug_smp_processor_id(void)
>  {
>  	unsigned long preempt_count = preempt_count();
>  	int this_cpu = raw_smp_processor_id();
> 
> -- 

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

  reply	other threads:[~2008-01-03 17:43 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-03  7:16 [RFC PATCH 00/11] mcount tracing utility Steven Rostedt
2008-01-03  7:16 ` [RFC PATCH 01/11] Add basic support for gcc profiler instrumentation Steven Rostedt
2008-01-03  8:31   ` Sam Ravnborg
2008-01-03 14:03     ` Steven Rostedt
2008-01-03  9:21   ` Ingo Molnar
2008-01-03 13:58     ` Steven Rostedt
2008-01-03 18:16       ` Chris Wright
2008-01-03 19:15         ` Steven Rostedt
2008-01-03 19:17           ` Chris Wright
2008-01-03 19:18         ` Jeremy Fitzhardinge
2008-01-03 16:01   ` Daniel Walker
2008-01-03 17:35   ` Mathieu Desnoyers
2008-01-03 17:55     ` Steven Rostedt
2008-01-03  7:16 ` [RFC PATCH 02/11] Add fastcall to do_IRQ for i386 Steven Rostedt
2008-01-03 17:36   ` Mathieu Desnoyers
2008-01-03 17:47     ` Steven Rostedt
2008-01-07  4:50       ` H. Peter Anvin
2008-01-07 12:42         ` Steven Rostedt
2008-01-03  7:16 ` [RFC PATCH 03/11] Annotate core code that should not be traced Steven Rostedt
2008-01-03 17:42   ` Mathieu Desnoyers [this message]
2008-01-03 18:07     ` Steven Rostedt
2008-01-03 18:34       ` Mathieu Desnoyers
2008-01-03  7:16 ` [RFC PATCH 04/11] i386: notrace annotations Steven Rostedt
2008-01-03 17:52   ` Mathieu Desnoyers
2008-01-03  7:16 ` [RFC PATCH 05/11] x86_64: " Steven Rostedt
2008-01-03  7:16 ` [RFC PATCH 06/11] add notrace annotations to vsyscall Steven Rostedt
2008-01-03  7:16 ` [RFC PATCH 07/11] mcount based trace in the form of a header file library Steven Rostedt
2008-01-03  7:16 ` [RFC PATCH 08/11] tracer add debugfs interface Steven Rostedt
2008-01-03  7:16 ` [RFC PATCH 09/11] mcount tracer output file Steven Rostedt
2008-01-03  7:16 ` [RFC PATCH 10/11] mcount tracer show task comm and pid Steven Rostedt
2008-01-03 17:56   ` Mathieu Desnoyers
2008-01-06 15:37     ` Ingo Molnar
2008-01-07  4:45       ` Mathieu Desnoyers
2008-01-09 16:45         ` Ingo Molnar
2008-01-03  7:16 ` [RFC PATCH 11/11] Add a symbol only trace output Steven Rostedt
2008-01-03 17:22 ` [RFC PATCH 00/11] mcount tracing utility Mathieu Desnoyers
2008-01-03 17:42   ` Steven Rostedt
2008-01-03 18:05 ` Andi Kleen
2008-01-04  6:42 ` Frank Ch. Eigler
2008-01-08 20:35 ` Tim Bird

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=20080103174250.GC30582@Krystal \
    --to=mathieu.desnoyers@polymtl.ca \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@ghostprotocols.net \
    --cc=akpm@linux-foundation.org \
    --cc=ghaskins@novell.com \
    --cc=hch@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=rostedt@goodmis.org \
    --cc=sparclinux@vger.kernel.org \
    --cc=srostedt@redhat.com \
    --cc=torvalds@linux-foundation.org \
    /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