mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
alloc_tag: handle module codetag load errors as module load failures
Failures inside codetag_load_module() are currently ignored. As a result an error there would not cause a module load failure and freeing of the associated resources. Correct this behavior by propagating the error code to the caller and handling possible errors. With this change, error to allocate percpu counters, which happens at this stage, will not be ignored and will cause a module load failure and freeing of resources. With this change we also do not need to disable memory allocation profiling when this error happens, instead we fail to load the module. Link: https://lkml.kernel.org/r/20250521160602.1940771-1-surenb@google.com Fixes: 10075262888b ("alloc_tag: allocate percpu counters for module tags dynamically") Signed-off-by: Suren Baghdasaryan <surenb@google.com> Reported-by: Casey Chen <cachen@purestorage.com> Closes: https://lore.kernel.org/all/20250520231620.15259-1-cachen@purestorage.com/ Cc: Daniel Gomez <da.gomez@samsung.com> Cc: David Wang <00107082@163.com> Cc: Kent Overstreet <kent.overstreet@linux.dev> Cc: Luis Chamberalin <mcgrof@kernel.org> Cc: Petr Pavlu <petr.pavlu@suse.com> Cc: Sami Tolvanen <samitolvanen@google.com> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
9c49e5d09f
commit
044d2aee6c
@@ -167,6 +167,7 @@ static int codetag_module_init(struct codetag_type *cttype, struct module *mod)
|
||||
{
|
||||
struct codetag_range range;
|
||||
struct codetag_module *cmod;
|
||||
int mod_id;
|
||||
int err;
|
||||
|
||||
range = get_section_range(mod, cttype->desc.section);
|
||||
@@ -190,11 +191,20 @@ static int codetag_module_init(struct codetag_type *cttype, struct module *mod)
|
||||
cmod->range = range;
|
||||
|
||||
down_write(&cttype->mod_lock);
|
||||
err = idr_alloc(&cttype->mod_idr, cmod, 0, 0, GFP_KERNEL);
|
||||
if (err >= 0) {
|
||||
cttype->count += range_size(cttype, &range);
|
||||
if (cttype->desc.module_load)
|
||||
cttype->desc.module_load(mod, range.start, range.stop);
|
||||
mod_id = idr_alloc(&cttype->mod_idr, cmod, 0, 0, GFP_KERNEL);
|
||||
if (mod_id >= 0) {
|
||||
if (cttype->desc.module_load) {
|
||||
err = cttype->desc.module_load(mod, range.start, range.stop);
|
||||
if (!err)
|
||||
cttype->count += range_size(cttype, &range);
|
||||
else
|
||||
idr_remove(&cttype->mod_idr, mod_id);
|
||||
} else {
|
||||
cttype->count += range_size(cttype, &range);
|
||||
err = 0;
|
||||
}
|
||||
} else {
|
||||
err = mod_id;
|
||||
}
|
||||
up_write(&cttype->mod_lock);
|
||||
|
||||
@@ -295,17 +305,23 @@ void codetag_module_replaced(struct module *mod, struct module *new_mod)
|
||||
mutex_unlock(&codetag_lock);
|
||||
}
|
||||
|
||||
void codetag_load_module(struct module *mod)
|
||||
int codetag_load_module(struct module *mod)
|
||||
{
|
||||
struct codetag_type *cttype;
|
||||
int ret = 0;
|
||||
|
||||
if (!mod)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
mutex_lock(&codetag_lock);
|
||||
list_for_each_entry(cttype, &codetag_types, link)
|
||||
codetag_module_init(cttype, mod);
|
||||
list_for_each_entry(cttype, &codetag_types, link) {
|
||||
ret = codetag_module_init(cttype, mod);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&codetag_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void codetag_unload_module(struct module *mod)
|
||||
|
||||
Reference in New Issue
Block a user