module: Remove preempt_disable() from module reference counting.

The preempt_disable() section in module_put() was added in commit
   e1783a240f ("module: Use this_cpu_xx to dynamically allocate counters")

while the per-CPU counter were switched to another API. The API requires
that during the RMW operation the CPU remained the same.

This counting API was later replaced with atomic_t in commit
   2f35c41f58 ("module: Replace module_ref with atomic_t refcnt")

Since this atomic_t replacement there is no need to keep preemption
disabled while the reference counter is modified.

Remove preempt_disable() from module_put(), __module_get() and
try_module_get().

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
This commit is contained in:
Sebastian Andrzej Siewior 2023-05-09 15:49:02 +02:00 коммит произвёл Luis Chamberlain
Родитель d36f6efbe0
Коммит cb0b50b813
1 изменённых файлов: 0 добавлений и 7 удалений

Просмотреть файл

@ -820,10 +820,8 @@ static struct module_attribute modinfo_refcnt =
void __module_get(struct module *module) void __module_get(struct module *module)
{ {
if (module) { if (module) {
preempt_disable();
atomic_inc(&module->refcnt); atomic_inc(&module->refcnt);
trace_module_get(module, _RET_IP_); trace_module_get(module, _RET_IP_);
preempt_enable();
} }
} }
EXPORT_SYMBOL(__module_get); EXPORT_SYMBOL(__module_get);
@ -833,15 +831,12 @@ bool try_module_get(struct module *module)
bool ret = true; bool ret = true;
if (module) { if (module) {
preempt_disable();
/* Note: here, we can fail to get a reference */ /* Note: here, we can fail to get a reference */
if (likely(module_is_live(module) && if (likely(module_is_live(module) &&
atomic_inc_not_zero(&module->refcnt) != 0)) atomic_inc_not_zero(&module->refcnt) != 0))
trace_module_get(module, _RET_IP_); trace_module_get(module, _RET_IP_);
else else
ret = false; ret = false;
preempt_enable();
} }
return ret; return ret;
} }
@ -852,11 +847,9 @@ void module_put(struct module *module)
int ret; int ret;
if (module) { if (module) {
preempt_disable();
ret = atomic_dec_if_positive(&module->refcnt); ret = atomic_dec_if_positive(&module->refcnt);
WARN_ON(ret < 0); /* Failed to put refcount */ WARN_ON(ret < 0); /* Failed to put refcount */
trace_module_put(module, _RET_IP_); trace_module_put(module, _RET_IP_);
preempt_enable();
} }
} }
EXPORT_SYMBOL(module_put); EXPORT_SYMBOL(module_put);