s390 it has been observed, that even with 16384 such pre-allocated objects ODEBUG would still be disabled during boot. Similarly to other debug features like KMEMLEAK add a Kconfig option CONFIG_DEBUG_OBJECTS_POOL_SIZE_SHIFT that allows to increase the amount of pre-allocated objects (in both the static and later dynamic cases). Use it as exponential, rather than linear value to allow for head-room to grow into once set in a configuration. The calculation is done as such: N_OBJECTS = 2^DEBUG_OBJECTS_POOL_SIZE_SHIFT * N_BATCH By default it is set to 6, so the actual amount is unchanged, unless the new options is changed: N_OBJECTS = 2^6 * 16 N_OBJECTS = 1024 For the previously mentioned observations on s390 it was necessary to increase the option to 11 in order to have enough space during boot. Signed-off-by: Benjamin Block --- lib/Kconfig.debug | 32 ++++++++++++++++++++++++++++++++ lib/debugobjects.c | 15 +++++++++++++-- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 318df4c75454..c6afc5b03572 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -811,6 +811,38 @@ config DEBUG_OBJECTS_PERCPU_COUNTER percpu counter routines to track the life time of percpu counter objects and validate the percpu counter operations. +config DEBUG_OBJECTS_POOL_SIZE_SHIFT + int "Metadata objects pool size" + depends on DEBUG_OBJECTS + range 0 21 + default 6 + help + To debug object operations a certain amount of metadata has to be + kept per object that is tracked. During boot a static amount of pre- + allocated objects is set aside to be used for this task until such a + time a dynamic allocator can be used. Once a dynamic allocator can be + used an initial amount of objects is pre-allocated to be used when + needed. + + This option sets the amount of both: the amount of initially + statically allocated objects; and later the amount of dynamically + pre-allocated objects. It is used as exponent to the power of 2, + multiplied by the batch size used to set how many objects are move + between pools at once. + + For example, when left at the default of 6: + N_OBJECTS = 2^DEBUG_OBJECTS_POOL_SIZE_SHIFT * N_BATCH + N_OBJECTS = 2^6 * 16 + N_OBJECTS = 1024 + By increasing the option by 1, you double the amount of objects. + + An indication that you need to increase this option is that during + boot you see messages like this: + ODEBUG: Out of memory. ODEBUG disabled + + If in doubt, leave the default. + + config DEBUG_OBJECTS_ENABLE_DEFAULT int "debug_objects bootup default value (0-1)" range 0 1 diff --git a/lib/debugobjects.c b/lib/debugobjects.c index 89a1d6745dc2..20e93d0074fa 100644 --- a/lib/debugobjects.c +++ b/lib/debugobjects.c @@ -22,11 +22,18 @@ #define ODEBUG_HASH_BITS 14 #define ODEBUG_HASH_SIZE (1 << ODEBUG_HASH_BITS) -/* Must be power of two */ +/* + * Must be power of two. + * Please change Kconfig help text of DEBUG_OBJECTS_POOL_SIZE_SHIFT when + * changed. + */ #define ODEBUG_BATCH_SIZE 16 +#define ODEBUG_POOL_SHIFT CONFIG_DEBUG_OBJECTS_POOL_SIZE_SHIFT +static_assert(ODEBUG_POOL_SHIFT >= 0); + /* Initial values. Must all be a multiple of batch size */ -#define ODEBUG_POOL_SIZE (64 * ODEBUG_BATCH_SIZE) +#define ODEBUG_POOL_SIZE ((1 << ODEBUG_POOL_SHIFT) * ODEBUG_BATCH_SIZE) #define ODEBUG_POOL_MIN_LEVEL (ODEBUG_POOL_SIZE / 4) #define ODEBUG_POOL_PERCPU_SIZE (8 * ODEBUG_BATCH_SIZE) @@ -569,6 +576,10 @@ static void debug_objects_oom(void) struct debug_bucket *db = obj_hash; HLIST_HEAD(freelist); + /* + * Please change Kconfig help text of DEBUG_OBJECTS_POOL_SIZE_SHIFT + * when changed. + */ pr_warn("Out of memory. ODEBUG disabled\n"); for (int i = 0; i < ODEBUG_HASH_SIZE; i++, db++) { -- 2.53.0[PATCH] debugobjects: Allow to configure the amount of pre-allocated objectsBenjamin Block undefinedAndrew Morton , Thomas Gleixner undefined undefined undefined undefined