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.