diff options
author | Subash Abhinov Kasiviswanathan <subashab@codeaurora.org> | 2019-04-12 18:54:11 -0600 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2019-04-17 17:25:49 -0700 |
commit | a046b9df8665bf18f559926c1e5689016be40a1b (patch) | |
tree | 712c2f89d4c4710a2a84a0ce2deddbc38030a916 | |
parent | 99da95a096ac9cc549ec665f246d574baf48a7c1 (diff) | |
download | data-kernel-a046b9df8665bf18f559926c1e5689016be40a1b.tar.gz |
rmnet_perf: Spinlock fix for module param
Previously rmnet_perf_opt_mode was spinlocking without disabling
softirqs. This caused a potential deadlock if it was preempted on
the core rmnet would try to spinlock from.
This change adds softirq disable before attempting to lock preventing
this scenario
Change-Id: Ic56820dd9462ea81f11b22abb1314dca0ec9fd94
Acked-by: Raul Martinez <mraul@qti.qualcomm.com>
Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
-rw-r--r-- | drivers/rmnet/perf/rmnet_perf_opt.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/rmnet/perf/rmnet_perf_opt.c b/drivers/rmnet/perf/rmnet_perf_opt.c index 91d7e72..991800d 100644 --- a/drivers/rmnet/perf/rmnet_perf_opt.c +++ b/drivers/rmnet/perf/rmnet_perf_opt.c @@ -78,13 +78,17 @@ static int rmnet_perf_set_opt_mode(const char *val, const struct kernel_param *kp) { struct rmnet_perf *perf; + unsigned long ht_flags; int old_mode = rmnet_perf_opt_mode; int rc = -EINVAL; char value[4]; strlcpy(value, val, 4); value[3] = '\0'; - spin_lock(&rmnet_perf_opt_lock); + + local_bh_disable(); + spin_lock_irqsave(&rmnet_perf_opt_lock, ht_flags); + if (!strcmp(value, "tcp")) rmnet_perf_opt_mode = RMNET_PERF_OPT_MODE_TCP; else if (!strcmp(value, "udp")) @@ -121,7 +125,9 @@ static int rmnet_perf_set_opt_mode(const char *val, } out: - spin_unlock(&rmnet_perf_opt_lock); + spin_unlock_irqrestore(&rmnet_perf_opt_lock, ht_flags); + local_bh_enable(); + return rc; } |