summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>2019-04-12 18:54:11 -0600
committerGerrit - the friendly Code Review server <code-review@localhost>2019-04-17 17:25:49 -0700
commita046b9df8665bf18f559926c1e5689016be40a1b (patch)
tree712c2f89d4c4710a2a84a0ce2deddbc38030a916
parent99da95a096ac9cc549ec665f246d574baf48a7c1 (diff)
downloaddata-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.c10
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;
}