From: Thomas Graf > Each per bucket lock covers a configurable number of buckets. While > shrinking, two buckets in the old table contain entries for a single > bucket in the new table. We need to lock down both while linking. > Check if they are protected by different locks to avoid a recursive > lock. Thought, could the shrunk table use the same locks as the lower half of the old table? I also wonder whether shrinking hash tables is ever actually worth the effort. Most likely they'll need to grow again very quickly. > spin_lock_bh(old_bucket_lock1); > - spin_lock_bh_nested(old_bucket_lock2, RHT_LOCK_NESTED); > - spin_lock_bh_nested(new_bucket_lock, RHT_LOCK_NESTED2); > + > + /* Depending on the lock per buckets mapping, the bucket in > + * the lower and upper region may map to the same lock. > + */ > + if (old_bucket_lock1 != old_bucket_lock2) { > + spin_lock_bh_nested(old_bucket_lock2, RHT_LOCK_NESTED); > + spin_lock_bh_nested(new_bucket_lock, RHT_LOCK_NESTED2); > + } else { > + spin_lock_bh_nested(new_bucket_lock, RHT_LOCK_NESTED); > + } Acquiring 3 locks of much the same type looks like a locking hierarchy violation just waiting to happen. David -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html