public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: Martin Peschke <mp3@de.ibm.com>
Cc: linux-kernel@vger.kernel.org, jbaron@redhat.com,
	rostedt@goodmis.org, billh@gnuppy.monkey.org, mingo@elte.hu,
	linux-s390@vger.kernel.org
Subject: Re: [RFC] [Patch 4/4] lock contention tracking slimmed down
Date: Thu, 07 Jun 2007 09:44:18 +0200	[thread overview]
Message-ID: <1181202258.7348.217.camel@twins> (raw)
In-Reply-To: <1181165656.7133.23.camel@dix>

On Wed, 2007-06-06 at 23:34 +0200, Martin Peschke wrote:

> 
> Signed-off-by: Martin Peschke <mp3@de.ibm.com>
> ---
> 
>  include/linux/lockdep.h |   35 ++---
>  kernel/lockdep.c        |  122 ++-----------------
>  kernel/lockdep_proc.c   |  294 +++++++-----------------------------------------
>  3 files changed, 76 insertions(+), 375 deletions(-)
> 
> Index: linux/kernel/lockdep.c
> ===================================================================
> --- linux.orig/kernel/lockdep.c
> +++ linux/kernel/lockdep.c
> @@ -37,6 +37,7 @@
>  #include <linux/debug_locks.h>
>  #include <linux/irqflags.h>
>  #include <linux/utsname.h>
> +#include <linux/statistic.h>
>  
>  #include <asm/sections.h>
>  
> @@ -119,93 +120,9 @@ unsigned long nr_lock_classes;
>  static struct lock_class lock_classes[MAX_LOCKDEP_KEYS];
>  
>  #ifdef CONFIG_LOCK_STAT
>  static void lock_release_holdtime(struct held_lock *hlock)
>  {
> +	struct statistic *stat = hlock->class->stat;
>  	s64 holdtime;
>  
>  	if (!lock_stat)
> @@ -213,12 +130,10 @@ static void lock_release_holdtime(struct
>  
>  	holdtime = sched_clock() - hlock->holdtime_stamp;
>  
>  	if (hlock->read)
> +		statistic_inc(stat, LOCK_STAT_HOLD_READ, holdtime);
>  	else
> +		statistic_inc(stat, LOCK_STAT_HOLD_WRITE, holdtime);
>  }
>  #else
>  static inline void lock_release_holdtime(struct held_lock *hlock)
> @@ -2745,9 +2660,8 @@ __lock_contended(struct lockdep_map *loc
>  {
>  	struct task_struct *curr = current;
>  	struct held_lock *hlock, *prev_hlock;
>  	unsigned int depth;
> +	int i;
>  
>  	depth = curr->lockdep_depth;
>  	if (DEBUG_LOCKS_WARN_ON(!depth))
> @@ -2761,22 +2675,15 @@ __lock_contended(struct lockdep_map *loc
>  		 */
>  		if (prev_hlock && prev_hlock->irq_context != hlock->irq_context)
>  			break;
> +		if (hlock->instance == lock) {
> +			hlock->waittime_stamp = sched_clock();
> +			_statistic_inc(hlock->class->stat, LOCK_STAT_CONT, ip);
> +			return;
> +		}
>  		prev_hlock = hlock;
>  	}
>  	print_lock_contention_bug(curr, lock, ip);
>  	return;
>  }
>  
>  static void
> @@ -2784,7 +2691,7 @@ __lock_acquired(struct lockdep_map *lock
>  {
>  	struct task_struct *curr = current;
>  	struct held_lock *hlock, *prev_hlock;
> +	struct statistic *stat;
>  	unsigned int depth;
>  	u64 now;
>  	s64 waittime;
> @@ -2817,12 +2724,11 @@ found_it:
>  	waittime = now - hlock->waittime_stamp;
>  	hlock->holdtime_stamp = now;
>  
> +	stat = hlock->class->stat;
>  	if (hlock->read)
> +		_statistic_inc(stat, LOCK_STAT_WAIT_READ, waittime);
>  	else
> +		_statistic_inc(stat, LOCK_STAT_WAIT_WRITE, waittime);
>  }
>  
>  void lock_contended(struct lockdep_map *lock, unsigned long ip)
> Index: linux/include/linux/lockdep.h
> ===================================================================
> --- linux.orig/include/linux/lockdep.h
> +++ linux/include/linux/lockdep.h
> @@ -17,6 +17,7 @@ struct lockdep_map;
>  #include <linux/list.h>
>  #include <linux/debug_locks.h>
>  #include <linux/stacktrace.h>
> +#include <linux/statistic.h>
>  
>  /*
>   * Lock-class usage-state bits:
> @@ -72,6 +73,17 @@ struct lock_class_key {
>  	struct lockdep_subclass_key	subkeys[MAX_LOCKDEP_SUBCLASSES];
>  };
>  
> +#ifdef CONFIG_LOCK_STAT
> +enum lock_stat_enum {
> +	LOCK_STAT_CONT,
> +	LOCK_STAT_WAIT_READ,
> +	LOCK_STAT_WAIT_WRITE,
> +	LOCK_STAT_HOLD_READ,
> +	LOCK_STAT_HOLD_WRITE,
> +	_LOCK_STAT_NUMBER
> +};
> +#endif
> +
>  /*
>   * The lock-class itself:
>   */
> @@ -117,30 +129,11 @@ struct lock_class {
>  	int				name_version;
>  
>  #ifdef CONFIG_LOCK_STAT
> +	struct statistic		stat[_LOCK_STAT_NUMBER];
> +	struct statistic_coll		stat_coll;
>  #endif
>  };
>  
>  /*
>   * Map the lock object (the lock instance) to the lock-class object.
>   * This is embedded into specific lock instances:
> Index: linux/kernel/lockdep_proc.c
> ===================================================================
> --- linux.orig/kernel/lockdep_proc.c
> +++ linux/kernel/lockdep_proc.c
> @@ -349,260 +349,64 @@ static const struct file_operations proc
>  };
>  
>  #ifdef CONFIG_LOCK_STAT
> +struct statistic_info lock_stat_info[_LOCK_STAT_NUMBER] = {
> +	[LOCK_STAT_CONT] = {
> +		.name	  = "contentions",
> +		.x_unit	  = "instruction_pointer",
> +		.y_unit	  = "occurrence",
> +		.defaults = "type=sparse entries=4",
> +		.flags	  = STATISTIC_FLAGS_LABEL,
> +	},
> +	[LOCK_STAT_WAIT_READ] = {
> +		.name	  = "wait_read",
> +		.x_unit	  = "nanoseconds",
> +		.y_unit	  = "occurrence",
> +		.defaults = "type=utilisation",
> +	},
> +	[LOCK_STAT_WAIT_WRITE] = {
> +		.name	  = "wait_write",
> +		.x_unit	  = "nanoseconds",
> +		.y_unit	  = "occurrence",
> +		.defaults = "type=utilisation",
> +	},
> +	[LOCK_STAT_HOLD_READ] = {
> +		.name	  = "hold_read",
> +		.x_unit	  = "nanoseconds",
> +		.y_unit	  = "occurrence",
> +		.defaults = "type=utilisation",
> +	},
> +	[LOCK_STAT_HOLD_WRITE] = {
> +		.name	  = "hold_write",
> +		.x_unit	  = "nanoseconds",
> +		.y_unit	  = "occurrence",
> +		.defaults = "type=utilisation",
>  	}
>  };
>  
> +struct statistic_ui lock_stat_ui;
>  
> +static void lock_stat_label(struct statistic_coll *coll, int i,
> +			    void *key, char *buf, int size)
> +{
> +	sprint_symbol(buf, *(unsigned long *)key);
>  }
>  
> +static void lock_stat_init(void)
>  {
>  	struct lock_class *class;
> +	statistic_create(&lock_stat_ui, "lockstat");
> +	list_for_each_entry(class, &all_lock_classes, lock_entry) {
> +		class->stat_coll.stat = class->stat;
> +		class->stat_coll.info = lock_stat_info;
> +		class->stat_coll.number  = _LOCK_STAT_NUMBER;
> +		class->stat_coll.label = lock_stat_label;
> +		strncpy(class->stat_coll.name, class->name,
> +			STATISTIC_COLL_NAME_SIZE - 1);
> +		statistic_attach(&class->stat_coll, &lock_stat_ui);
>  	}
>  }
> +#endif
>  
>  static int __init lockdep_proc_init(void)
>  {
> @@ -617,9 +421,7 @@ static int __init lockdep_proc_init(void
>  		entry->proc_fops = &proc_lockdep_stats_operations;
>  
>  #ifdef CONFIG_LOCK_STAT
> +	lock_stat_init();
>  #endif
>  
>  	return 0;

I'm confused as to where the class->stat objects are initialised? Is
that done in lock_stat_init()? If so, then you have a bug.


  parent reply	other threads:[~2007-06-07  7:44 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-06-06 21:34 [RFC] [Patch 4/4] lock contention tracking slimmed down Martin Peschke
2007-06-06 23:06 ` Ingo Molnar
2007-06-07  0:17   ` Martin Peschke
2007-06-07  4:40     ` Bill Huey
2007-06-07  7:03       ` Martin Peschke
2007-06-07  7:30         ` Ingo Molnar
2007-06-07  8:56           ` Bill Huey
2007-06-11 11:26             ` Martin Peschke
2007-06-08 16:27           ` Martin Peschke
2007-06-07  6:39     ` Peter Zijlstra
2007-06-07  6:59       ` Martin Peschke
2007-06-07  7:27         ` Ingo Molnar
2007-06-08 16:07           ` Martin Peschke
2007-06-06 23:10 ` Ingo Molnar
2007-06-07  0:21   ` Martin Peschke
2007-06-07  7:44 ` Peter Zijlstra [this message]
2007-06-08 17:00   ` Martin Peschke
     [not found]     ` <1181322460.5728.2.camel@lappy>
     [not found]       ` <46698F7F.4090407@de.ibm.com>
2007-06-08 17:27         ` Peter Zijlstra
2007-06-08 17:37           ` Martin Peschke
2007-06-08 17:50             ` Peter Zijlstra
2007-06-11 10:31               ` Martin Peschke
2007-06-07  7:51 ` Peter Zijlstra
2007-06-08 17:13   ` Martin Peschke
2007-06-07  8:17 ` Peter Zijlstra
2007-06-07 10:21   ` Ingo Molnar
2007-06-11 12:20   ` Martin Peschke

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=1181202258.7348.217.camel@twins \
    --to=a.p.zijlstra@chello.nl \
    --cc=billh@gnuppy.monkey.org \
    --cc=jbaron@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=mp3@de.ibm.com \
    --cc=rostedt@goodmis.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