v3 was a single patch. After discussion with Suren and Andrew we went for a more graceful approach: rather than failing the module load on overflow, let it load without profiling. Once profiling is disabled, codetag_needs_module_section() returns false, so on retry the codetag section is placed as regular module data.
A new patch (1/2) is added to move release_module_tags() above reserve_module_tags(), since the overflow path now has to call it and the helper sits below it. release_module_tags() is what module unload calls to drop a module's reservation from the maple tree. By the time reserve_module_tags() detects the overflow it has already stored that reservation, and the -EAGAIN return skips vm_module_tags_populate(), so the backing pages never get mapped. If reserve_module_tags() returns without calling release_module_tags(), the stale entry keeps pointing at that unmapped range; when the module is later unloaded, release_module_tags() walks it and panics. Tested on an x86_64 virtual machine: # insmod overflow_tag.ko # dmesg With module overflow_tag there are too many tags to fit in 13 page flag bits. Memory allocation profiling is disabled! # rmmod overflow_tag The module loads without profiling. Changes in v4: - add a new patch (1/2) to move release_module_tags() above reserve_module_tags(); the overflow fix is 2/2 - release the reservation on the -EAGAIN path - return -EAGAIN instead of -ENOMEM so the module can still load without profiling (Suren) - reset sh_addr, mem[type].size and sym/str SHF_ALLOC before retry - skip percpu counters in load_module() when profiling is off Changes in v3: - use pr_warn_once() instead of pr_warn() - return -ENOMEM instead of -ENOSPC (Suren) - expand the commit message to describe the /proc/allocinfo impact (Andrew) Changes in v2: - return an error after shutdown_mem_profiling() to skip vm_module_tags_populate() v1: https://lore.kernel.org/all/[email protected]/ v2: https://lore.kernel.org/all/[email protected]/ v3: https://lore.kernel.org/all/[email protected]/ Hao Ge (2): alloc_tag: move release_module_tags() above reserve_module_tags() alloc_tag: fix undetected compressed tag overflow when profiling is disabled kernel/module/main.c | 17 ++++++++- mm/alloc_tag.c | 103 +++++++++++++++++++++++++++------------------------ 2 files changed, 69 insertions(+), 51 deletions(-) -- 2.25.1

