Re: [syzbot] Re: [syzbot] [pm?] possible deadlock in lock_system_sleep

From: syzbot
Date: Fri Feb 21 2025 - 01:27:31 EST


For archival purposes, forwarding an incoming command email to
linux-kernel@xxxxxxxxxxxxxxx.

***

Subject: Re: [syzbot] [pm?] possible deadlock in lock_system_sleep
Author: lizhi.xu@xxxxxxxxxxxxx

#syz test

diff --git a/kernel/params.c b/kernel/params.c
index 0074d29c9b80..d19881fbb2ec 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -583,7 +583,9 @@ static ssize_t param_attr_store(const struct module_attribute *mattr,
if (!attribute->param->ops->set)
return -EPERM;

- kernel_param_lock(mk->mod);
+ if (!kernel_param_trylock(mk->mod))
+ return -EPERM;
+
if (param_check_unsafe(attribute->param))
err = attribute->param->ops->set(buf, attribute->param);
else
@@ -607,6 +609,11 @@ void kernel_param_lock(struct module *mod)
mutex_lock(KPARAM_MUTEX(mod));
}

+int kernel_param_trylock(struct module *mod)
+{
+ return mutex_trylock(KPARAM_MUTEX(mod));
+}
+
void kernel_param_unlock(struct module *mod)
{
mutex_unlock(KPARAM_MUTEX(mod));
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
index bfb85fd13e1f..cbcbfd8db721 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -306,11 +306,15 @@ struct kparam_array

#ifdef CONFIG_SYSFS
extern void kernel_param_lock(struct module *mod);
+extern int kernel_param_trylock(struct module *mod);
extern void kernel_param_unlock(struct module *mod);
#else
static inline void kernel_param_lock(struct module *mod)
{
}
+static inline int kernel_param_trylock(struct module *mod)
+{
+}
static inline void kernel_param_unlock(struct module *mod)
{
}
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c
index 0d056db9f81e..aecf7ff51cd9 100644
--- a/net/mac80211/rate.c
+++ b/net/mac80211/rate.c
@@ -217,7 +217,9 @@ ieee80211_rate_control_ops_get(const char *name)
const struct rate_control_ops *ops;
const char *alg_name;

- kernel_param_lock(THIS_MODULE);
+ if (!kernel_param_trylock(THIS_MODULE))
+ return NULL;
+
if (!name)
alg_name = ieee80211_default_rc_algo;
else