diff mbox series

module: Remove preempt_disable() from module reference counting.

Message ID 20230509134902.yQ-EWRpI@linutronix.de (mailing list archive)
State New, archived
Headers show
Series module: Remove preempt_disable() from module reference counting. | expand

Commit Message

Sebastian Andrzej Siewior May 9, 2023, 1:49 p.m. UTC
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>
---
 kernel/module/main.c | 7 -------
 1 file changed, 7 deletions(-)

Comments

Luis Chamberlain May 24, 2023, 5:23 a.m. UTC | #1
On Tue, May 09, 2023 at 03:49:02PM +0200, Sebastian Andrzej Siewior wrote:
> 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>

Thanks! Queued up onto modules-next.

  Luis
diff mbox series

Patch

diff --git a/kernel/module/main.c b/kernel/module/main.c
index 044aa2c9e3cb0..ea7d0c7f3e60d 100644
--- a/kernel/module/main.c
+++ b/kernel/module/main.c
@@ -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);