RE: [PATCH net-next] rhashtable: Lower/upper bucket may map to same lock while shrinking

From: David Laight
Date: Tue Jan 13 2015 - 04:50:55 EST


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 linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/