From 792c813662c49f5fa6cbc7aa15ca95b8e69abde9 Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Thu, 29 Mar 2012 12:38:20 +0200 Subject: [PATCH] --- yaml --- r: 314297 b: refs/heads/master c: 5d52dad27a08d2c8851acb12b041088ec07881dd h: refs/heads/master i: 314295: 898e151cabb0a55d844d4e141bd023e6705d4a15 v: v3 --- [refs] | 2 +- trunk/net/batman-adv/bridge_loop_avoidance.c | 13 +++++++++++++ trunk/net/batman-adv/hash.c | 9 +++++++++ trunk/net/batman-adv/hash.h | 4 ++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index fbc0c0002fe7..65350e101776 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d2b6cc8e460494251442a877fcbc150faa175b4f +refs/heads/master: 5d52dad27a08d2c8851acb12b041088ec07881dd diff --git a/trunk/net/batman-adv/bridge_loop_avoidance.c b/trunk/net/batman-adv/bridge_loop_avoidance.c index 8bf97515a77d..5c1ac559edbb 100644 --- a/trunk/net/batman-adv/bridge_loop_avoidance.c +++ b/trunk/net/batman-adv/bridge_loop_avoidance.c @@ -1127,6 +1127,14 @@ static void bla_periodic_work(struct work_struct *work) bla_start_timer(bat_priv); } +/* The hash for claim and backbone hash receive the same key because they + * are getting initialized by hash_new with the same key. Reinitializing + * them with to different keys to allow nested locking without generating + * lockdep warnings + */ +static struct lock_class_key claim_hash_lock_class_key; +static struct lock_class_key backbone_hash_lock_class_key; + /* initialize all bla structures */ int bla_init(struct bat_priv *bat_priv) { @@ -1164,6 +1172,11 @@ int bla_init(struct bat_priv *bat_priv) if (!bat_priv->claim_hash || !bat_priv->backbone_hash) return -1; + batadv_hash_set_lock_class(bat_priv->claim_hash, + &claim_hash_lock_class_key); + batadv_hash_set_lock_class(bat_priv->backbone_hash, + &backbone_hash_lock_class_key); + bat_dbg(DBG_BLA, bat_priv, "bla hashes initialized\n"); bla_start_timer(bat_priv); diff --git a/trunk/net/batman-adv/hash.c b/trunk/net/batman-adv/hash.c index 117687bedf25..5b2eabe7c4e0 100644 --- a/trunk/net/batman-adv/hash.c +++ b/trunk/net/batman-adv/hash.c @@ -69,3 +69,12 @@ struct hashtable_t *hash_new(uint32_t size) kfree(hash); return NULL; } + +void batadv_hash_set_lock_class(struct hashtable_t *hash, + struct lock_class_key *key) +{ + uint32_t i; + + for (i = 0; i < hash->size; i++) + lockdep_set_class(&hash->list_locks[i], key); +} diff --git a/trunk/net/batman-adv/hash.h b/trunk/net/batman-adv/hash.h index d4bd7862719b..93b3c71aeaf8 100644 --- a/trunk/net/batman-adv/hash.h +++ b/trunk/net/batman-adv/hash.h @@ -45,6 +45,10 @@ struct hashtable_t { /* allocates and clears the hash */ struct hashtable_t *hash_new(uint32_t size); +/* set class key for all locks */ +void batadv_hash_set_lock_class(struct hashtable_t *hash, + struct lock_class_key *key); + /* free only the hashtable and the hash itself. */ void hash_destroy(struct hashtable_t *hash);