module: Remove preempt_disable() from module reference counting.
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Tue, 9 May 2023 13:49:02 +0000 (15:49 +0200)
committerLuis Chamberlain <mcgrof@kernel.org>
Wed, 24 May 2023 05:23:18 +0000 (22:23 -0700)
The preempt_disable() section in module_put() was added in commit
   e1783a240f491 ("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
   2f35c41f58a97 ("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>
kernel/module/main.c

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