2007-06-12 13:07:37

by Peter Zijlstra

[permalink] [raw]
Subject: [patch 1/4] lockdep: variuos fixes

- update the copyright notices
- use the default hash function
- fix a thinko in a BUILD_BUG_ON
- add a WARN_ON to spot inconsitent naming
- fix a termination issue in /proc/lock_stat

Signed-off-by: Peter Zijlstra <[email protected]>
Acked-by: Ingo Molnar <[email protected]>
---
include/linux/lockdep.h | 3 ++-
kernel/lockdep.c | 20 +++++++++++---------
kernel/lockdep_proc.c | 6 +++++-
3 files changed, 18 insertions(+), 11 deletions(-)

Index: linux-2.6/kernel/lockdep.c
===================================================================
--- linux-2.6.orig/kernel/lockdep.c
+++ linux-2.6/kernel/lockdep.c
@@ -5,7 +5,8 @@
*
* Started by Ingo Molnar:
*
- * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <[email protected]>
+ * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <[email protected]>
+ * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra <[email protected]>
*
* this code maps all the lock dependencies as they occur in a live kernel
* and will warn about the following classes of locking bugs:
@@ -37,6 +38,7 @@
#include <linux/debug_locks.h>
#include <linux/irqflags.h>
#include <linux/utsname.h>
+#include <linux/hash.h>

#include <asm/sections.h>

@@ -238,8 +240,7 @@ LIST_HEAD(all_lock_classes);
*/
#define CLASSHASH_BITS (MAX_LOCKDEP_KEYS_BITS - 1)
#define CLASSHASH_SIZE (1UL << CLASSHASH_BITS)
-#define CLASSHASH_MASK (CLASSHASH_SIZE - 1)
-#define __classhashfn(key) ((((unsigned long)key >> CLASSHASH_BITS) + (unsigned long)key) & CLASSHASH_MASK)
+#define __classhashfn(key) hash_long((unsigned long)key, CLASSHASH_BITS)
#define classhashentry(key) (classhash_table + __classhashfn((key)))

static struct list_head classhash_table[CLASSHASH_SIZE];
@@ -250,9 +251,7 @@ static struct list_head classhash_table[
*/
#define CHAINHASH_BITS (MAX_LOCKDEP_CHAINS_BITS-1)
#define CHAINHASH_SIZE (1UL << CHAINHASH_BITS)
-#define CHAINHASH_MASK (CHAINHASH_SIZE - 1)
-#define __chainhashfn(chain) \
- (((chain >> CHAINHASH_BITS) + chain) & CHAINHASH_MASK)
+#define __chainhashfn(chain) hash_long(chain, CHAINHASH_BITS)
#define chainhashentry(chain) (chainhash_table + __chainhashfn((chain)))

static struct list_head chainhash_table[CHAINHASH_SIZE];
@@ -680,7 +679,7 @@ look_up_lock_class(struct lockdep_map *l
* (or spin_lock_init()) call - which acts as the key. For static
* locks we use the lock object itself as the key.
*/
- BUILD_BUG_ON(sizeof(struct lock_class_key) > sizeof(struct lock_class));
+ BUILD_BUG_ON(sizeof(struct lock_class_key) > sizeof(struct lockdep_map));

key = lock->key->subkeys + subclass;

@@ -690,9 +689,12 @@ look_up_lock_class(struct lockdep_map *l
* We can walk the hash lockfree, because the hash only
* grows, and we are careful when adding entries to the end:
*/
- list_for_each_entry(class, hash_head, hash_entry)
- if (class->key == key)
+ list_for_each_entry(class, hash_head, hash_entry) {
+ if (class->key == key) {
+ WARN_ON_ONCE(class->name != lock->name);
return class;
+ }
+ }

return NULL;
}
Index: linux-2.6/include/linux/lockdep.h
===================================================================
--- linux-2.6.orig/include/linux/lockdep.h
+++ linux-2.6/include/linux/lockdep.h
@@ -1,7 +1,8 @@
/*
* Runtime locking correctness validator
*
- * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <[email protected]>
+ * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <[email protected]>
+ * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra <[email protected]>
*
* see Documentation/lockdep-design.txt for more details.
*/
Index: linux-2.6/kernel/lockdep_proc.c
===================================================================
--- linux-2.6.orig/kernel/lockdep_proc.c
+++ linux-2.6/kernel/lockdep_proc.c
@@ -5,7 +5,8 @@
*
* Started by Ingo Molnar:
*
- * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <[email protected]>
+ * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <[email protected]>
+ * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra <[email protected]>
*
* Code for /proc/lockdep and /proc/lockdep_stats:
*
@@ -498,6 +499,9 @@ static void *ls_start(struct seq_file *m
if (data->iter == data->stats)
seq_header(m);

+ if (data->iter == data->iter_end)
+ data->iter = NULL;
+
return data->iter;
}


--


2007-06-12 13:47:18

by Andev

[permalink] [raw]
Subject: Re: [patch 1/4] lockdep: variuos fixes

What exactly is being copyright'ed here?

On 6/12/07, Peter Zijlstra <[email protected]> wrote:
> - update the copyright notices
> - use the default hash function
> - fix a thinko in a BUILD_BUG_ON
> - add a WARN_ON to spot inconsitent naming
> - fix a termination issue in /proc/lock_stat
>
> Signed-off-by: Peter Zijlstra <[email protected]>
> Acked-by: Ingo Molnar <[email protected]>
> ---
> include/linux/lockdep.h | 3 ++-
> kernel/lockdep.c | 20 +++++++++++---------
> kernel/lockdep_proc.c | 6 +++++-
> 3 files changed, 18 insertions(+), 11 deletions(-)
>
> Index: linux-2.6/kernel/lockdep.c
> ===================================================================
> --- linux-2.6.orig/kernel/lockdep.c
> +++ linux-2.6/kernel/lockdep.c
> @@ -5,7 +5,8 @@
> *
> * Started by Ingo Molnar:
> *
> - * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <[email protected]>
> + * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <[email protected]>
> + * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra <[email protected]>
> *
> * this code maps all the lock dependencies as they occur in a live kernel
> * and will warn about the following classes of locking bugs:
> @@ -37,6 +38,7 @@
> #include <linux/debug_locks.h>
> #include <linux/irqflags.h>
> #include <linux/utsname.h>
> +#include <linux/hash.h>
>
> #include <asm/sections.h>
>
> @@ -238,8 +240,7 @@ LIST_HEAD(all_lock_classes);
> */
> #define CLASSHASH_BITS (MAX_LOCKDEP_KEYS_BITS - 1)
> #define CLASSHASH_SIZE (1UL << CLASSHASH_BITS)
> -#define CLASSHASH_MASK (CLASSHASH_SIZE - 1)
> -#define __classhashfn(key) ((((unsigned long)key >> CLASSHASH_BITS) + (unsigned long)key) & CLASSHASH_MASK)
> +#define __classhashfn(key) hash_long((unsigned long)key, CLASSHASH_BITS)
> #define classhashentry(key) (classhash_table + __classhashfn((key)))
>
> static struct list_head classhash_table[CLASSHASH_SIZE];
> @@ -250,9 +251,7 @@ static struct list_head classhash_table[
> */
> #define CHAINHASH_BITS (MAX_LOCKDEP_CHAINS_BITS-1)
> #define CHAINHASH_SIZE (1UL << CHAINHASH_BITS)
> -#define CHAINHASH_MASK (CHAINHASH_SIZE - 1)
> -#define __chainhashfn(chain) \
> - (((chain >> CHAINHASH_BITS) + chain) & CHAINHASH_MASK)
> +#define __chainhashfn(chain) hash_long(chain, CHAINHASH_BITS)
> #define chainhashentry(chain) (chainhash_table + __chainhashfn((chain)))
>
> static struct list_head chainhash_table[CHAINHASH_SIZE];
> @@ -680,7 +679,7 @@ look_up_lock_class(struct lockdep_map *l
> * (or spin_lock_init()) call - which acts as the key. For static
> * locks we use the lock object itself as the key.
> */
> - BUILD_BUG_ON(sizeof(struct lock_class_key) > sizeof(struct lock_class));
> + BUILD_BUG_ON(sizeof(struct lock_class_key) > sizeof(struct lockdep_map));
>
> key = lock->key->subkeys + subclass;
>
> @@ -690,9 +689,12 @@ look_up_lock_class(struct lockdep_map *l
> * We can walk the hash lockfree, because the hash only
> * grows, and we are careful when adding entries to the end:
> */
> - list_for_each_entry(class, hash_head, hash_entry)
> - if (class->key == key)
> + list_for_each_entry(class, hash_head, hash_entry) {
> + if (class->key == key) {
> + WARN_ON_ONCE(class->name != lock->name);
> return class;
> + }
> + }
>
> return NULL;
> }
> Index: linux-2.6/include/linux/lockdep.h
> ===================================================================
> --- linux-2.6.orig/include/linux/lockdep.h
> +++ linux-2.6/include/linux/lockdep.h
> @@ -1,7 +1,8 @@
> /*
> * Runtime locking correctness validator
> *
> - * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <[email protected]>
> + * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <[email protected]>
> + * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra <[email protected]>
> *
> * see Documentation/lockdep-design.txt for more details.
> */
> Index: linux-2.6/kernel/lockdep_proc.c
> ===================================================================
> --- linux-2.6.orig/kernel/lockdep_proc.c
> +++ linux-2.6/kernel/lockdep_proc.c
> @@ -5,7 +5,8 @@
> *
> * Started by Ingo Molnar:
> *
> - * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <[email protected]>
> + * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <[email protected]>
> + * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra <[email protected]>
> *
> * Code for /proc/lockdep and /proc/lockdep_stats:
> *
> @@ -498,6 +499,9 @@ static void *ls_start(struct seq_file *m
> if (data->iter == data->stats)
> seq_header(m);
>
> + if (data->iter == data->iter_end)
> + data->iter = NULL;
> +
> return data->iter;
> }
>
>
> --
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>

2007-06-12 14:08:46

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [patch 1/4] lockdep: variuos fixes

On Tue, 2007-06-12 at 19:17 +0530, debian developer wrote:

> On 6/12/07, Peter Zijlstra <[email protected]> wrote:

> > Index: linux-2.6/kernel/lockdep.c
> > ===================================================================
> > --- linux-2.6.orig/kernel/lockdep.c
> > +++ linux-2.6/kernel/lockdep.c
> > @@ -5,7 +5,8 @@
> > *
> > * Started by Ingo Molnar:
> > *
> > - * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <[email protected]>
> > + * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <[email protected]>
> > + * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra <[email protected]>
> > *
> > * this code maps all the lock dependencies as they occur in a live kernel
> > * and will warn about the following classes of locking bugs:

> What exactly is being copyright'ed here?

Thanks for being triply impolite! You score: anonymous, top-posting and
dropping CC-lists.

The code in these files, as in most other files in the Linux kernel, is
copyrighted. The code is Licensed under GPLv2, but copyright belongs to
Red Hat and it's authors are Ingo and myself.

That is, say you want to use this code in a non GPLv2 project (say this
GPLv3 thing) then you would need to contact the copyright owner of this
code.