Merge branches 'slab/for-5.19/stackdepot' and 'slab/for-5.19/refactor' into slab/for-linus
This commit is contained in:
@@ -709,6 +709,7 @@ config DEBUG_SLAB
|
||||
config SLUB_DEBUG_ON
|
||||
bool "SLUB debugging on by default"
|
||||
depends on SLUB && SLUB_DEBUG
|
||||
select STACKDEPOT_ALWAYS_INIT if STACKTRACE_SUPPORT
|
||||
default n
|
||||
help
|
||||
Boot with debugging on by default. SLUB boots by default with
|
||||
|
||||
@@ -66,6 +66,9 @@ struct stack_record {
|
||||
unsigned long entries[]; /* Variable-sized array of entries. */
|
||||
};
|
||||
|
||||
static bool __stack_depot_want_early_init __initdata = IS_ENABLED(CONFIG_STACKDEPOT_ALWAYS_INIT);
|
||||
static bool __stack_depot_early_init_passed __initdata;
|
||||
|
||||
static void *stack_slabs[STACK_ALLOC_MAX_SLABS];
|
||||
|
||||
static int depot_index;
|
||||
@@ -162,38 +165,58 @@ static int __init is_stack_depot_disabled(char *str)
|
||||
}
|
||||
early_param("stack_depot_disable", is_stack_depot_disabled);
|
||||
|
||||
/*
|
||||
* __ref because of memblock_alloc(), which will not be actually called after
|
||||
* the __init code is gone, because at that point slab_is_available() is true
|
||||
*/
|
||||
__ref int stack_depot_init(void)
|
||||
void __init stack_depot_want_early_init(void)
|
||||
{
|
||||
/* Too late to request early init now */
|
||||
WARN_ON(__stack_depot_early_init_passed);
|
||||
|
||||
__stack_depot_want_early_init = true;
|
||||
}
|
||||
|
||||
int __init stack_depot_early_init(void)
|
||||
{
|
||||
size_t size;
|
||||
|
||||
/* This is supposed to be called only once, from mm_init() */
|
||||
if (WARN_ON(__stack_depot_early_init_passed))
|
||||
return 0;
|
||||
|
||||
__stack_depot_early_init_passed = true;
|
||||
|
||||
if (!__stack_depot_want_early_init || stack_depot_disable)
|
||||
return 0;
|
||||
|
||||
size = (STACK_HASH_SIZE * sizeof(struct stack_record *));
|
||||
pr_info("Stack Depot early init allocating hash table with memblock_alloc, %zu bytes\n",
|
||||
size);
|
||||
stack_table = memblock_alloc(size, SMP_CACHE_BYTES);
|
||||
|
||||
if (!stack_table) {
|
||||
pr_err("Stack Depot hash table allocation failed, disabling\n");
|
||||
stack_depot_disable = true;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int stack_depot_init(void)
|
||||
{
|
||||
static DEFINE_MUTEX(stack_depot_init_mutex);
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&stack_depot_init_mutex);
|
||||
if (!stack_depot_disable && !stack_table) {
|
||||
size_t size = (STACK_HASH_SIZE * sizeof(struct stack_record *));
|
||||
int i;
|
||||
|
||||
if (slab_is_available()) {
|
||||
pr_info("Stack Depot allocating hash table with kvmalloc\n");
|
||||
stack_table = kvmalloc(size, GFP_KERNEL);
|
||||
} else {
|
||||
pr_info("Stack Depot allocating hash table with memblock_alloc\n");
|
||||
stack_table = memblock_alloc(size, SMP_CACHE_BYTES);
|
||||
}
|
||||
if (stack_table) {
|
||||
for (i = 0; i < STACK_HASH_SIZE; i++)
|
||||
stack_table[i] = NULL;
|
||||
} else {
|
||||
pr_info("Stack Depot allocating hash table with kvcalloc\n");
|
||||
stack_table = kvcalloc(STACK_HASH_SIZE, sizeof(struct stack_record *), GFP_KERNEL);
|
||||
if (!stack_table) {
|
||||
pr_err("Stack Depot hash table allocation failed, disabling\n");
|
||||
stack_depot_disable = true;
|
||||
mutex_unlock(&stack_depot_init_mutex);
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&stack_depot_init_mutex);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(stack_depot_init);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user