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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to