Re: [PATCH v2] lockdep: upper limit LOCKDEP_CHAINS_BITS

From: Andrew Morton
Date: Wed Jul 31 2024 - 19:48:33 EST


On Tue, 23 Jul 2024 16:40:17 +0000 Carlos Llamas <cmllamas@xxxxxxxxxx> wrote:

> From: "J. R. Okajima" <hooanon05g@xxxxxxxxx>
>
> CONFIG_LOCKDEP_CHAINS_BITS value decides the size of chain_hlocks[] in
> kernel/locking/lockdep.c, and it is checked by add_chain_cache() with
> BUILD_BUG_ON((1UL << 24) <= ARRAY_SIZE(chain_hlocks));
> This patch is just to silence BUILD_BUG_ON().
>
> ...
>
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -1515,7 +1515,7 @@ config LOCKDEP_BITS
> config LOCKDEP_CHAINS_BITS
> int "Bitsize for MAX_LOCKDEP_CHAINS"
> depends on LOCKDEP && !LOCKDEP_SMALL
> - range 10 30
> + range 10 21
> default 16
> help
> Try increasing this value if you hit "BUG: MAX_LOCKDEP_CHAINS too low!" message.

checking your homework...

With LOCKDEP_CHAINS_BITS == 21:

#define MAX_LOCKDEP_CHAINS_BITS CONFIG_LOCKDEP_CHAINS_BITS

gives MAX_LOCKDEP_CHAINS_BITS == 21

#define MAX_LOCKDEP_CHAINS (1UL << MAX_LOCKDEP_CHAINS_BITS)

gives MAX_LOCKDEP_CHAINS == (1UL << 21)

#define MAX_LOCKDEP_CHAIN_HLOCKS (MAX_LOCKDEP_CHAINS*5)

gives MAX_LOCKDEP_CHAIN_HLOCKS = 5 * (1UL << 21)

static u16 chain_hlocks[MAX_LOCKDEP_CHAIN_HLOCKS];

gives ARRAY_SIZE(chain_hlocks) == 5 * (1UL << 21)

so

BUILD_BUG_ON((1UL << 24) <= ARRAY_SIZE(chain_hlocks));
ie, BUILD_BUG_ON((1UL << 24) <= 5 * (1UL << 21));

is OK, whereas

BUILD_BUG_ON((1UL << 24) <= 5 * (1UL << 22));

will bug out. So LGTM, I'll add it to mm.git.


btw, the help text "Bitsize for MAX_LOCKDEP_CHAINS" is odd. What's a
bitsize? Maybe "bit shift count for..." or such.