Skip to content
Snippets Groups Projects
Commit 2642c1fd authored by Skylar Chang's avatar Skylar Chang Committed by Oleg Matcovschi
Browse files

msm: ipa3: add lock for num_q6_rule


There is a race condition be observed
on global variable num_q6_rule used in
ipa wan-driver. The fix is to add lock
to prevent different threads are accessing
it at the same time.

Bug: 68992477
Signed-off-by: default avatarSkylar Chang <chiaweic@codeaurora.org>
parent 82870752
Branches
Tags
No related merge requests found
...@@ -398,12 +398,15 @@ int copy_ul_filter_rule_to_ipa(struct ipa_install_fltr_rule_req_msg_v01 ...@@ -398,12 +398,15 @@ int copy_ul_filter_rule_to_ipa(struct ipa_install_fltr_rule_req_msg_v01
{ {
int i, j; int i, j;
/* prevent multi-threads accessing num_q6_rule */
mutex_lock(&add_mux_channel_lock);
if (rule_req->filter_spec_list_valid == true) { if (rule_req->filter_spec_list_valid == true) {
num_q6_rule = rule_req->filter_spec_list_len; num_q6_rule = rule_req->filter_spec_list_len;
IPAWANDBG("Received (%d) install_flt_req\n", num_q6_rule); IPAWANDBG("Received (%d) install_flt_req\n", num_q6_rule);
} else { } else {
num_q6_rule = 0; num_q6_rule = 0;
IPAWANERR("got no UL rules from modem\n"); IPAWANERR("got no UL rules from modem\n");
mutex_unlock(&add_mux_channel_lock);
return -EINVAL; return -EINVAL;
} }
...@@ -597,9 +600,11 @@ failure: ...@@ -597,9 +600,11 @@ failure:
num_q6_rule = 0; num_q6_rule = 0;
memset(ipa_qmi_ctx->q6_ul_filter_rule, 0, memset(ipa_qmi_ctx->q6_ul_filter_rule, 0,
sizeof(ipa_qmi_ctx->q6_ul_filter_rule)); sizeof(ipa_qmi_ctx->q6_ul_filter_rule));
mutex_unlock(&add_mux_channel_lock);
return -EINVAL; return -EINVAL;
success: success:
mutex_unlock(&add_mux_channel_lock);
return 0; return 0;
} }
...@@ -1499,9 +1504,12 @@ static int ipa_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -1499,9 +1504,12 @@ static int ipa_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
/* already got Q6 UL filter rules*/ /* already got Q6 UL filter rules*/
if (ipa_qmi_ctx && if (ipa_qmi_ctx &&
ipa_qmi_ctx->modem_cfg_emb_pipe_flt ipa_qmi_ctx->modem_cfg_emb_pipe_flt
== false) == false) {
/* protect num_q6_rule */
mutex_lock(&add_mux_channel_lock);
rc = wwan_add_ul_flt_rule_to_ipa(); rc = wwan_add_ul_flt_rule_to_ipa();
else mutex_unlock(&add_mux_channel_lock);
} else
rc = 0; rc = 0;
egress_set = true; egress_set = true;
if (rc) if (rc)
......
...@@ -412,6 +412,8 @@ int ipa3_copy_ul_filter_rule_to_ipa(struct ipa_install_fltr_rule_req_msg_v01 ...@@ -412,6 +412,8 @@ int ipa3_copy_ul_filter_rule_to_ipa(struct ipa_install_fltr_rule_req_msg_v01
{ {
int i, j; int i, j;
/* prevent multi-threads accessing rmnet_ipa3_ctx->num_q6_rules */
mutex_lock(&rmnet_ipa3_ctx->add_mux_channel_lock);
if (rule_req->filter_spec_ex_list_valid == true) { if (rule_req->filter_spec_ex_list_valid == true) {
rmnet_ipa3_ctx->num_q6_rules = rmnet_ipa3_ctx->num_q6_rules =
rule_req->filter_spec_ex_list_len; rule_req->filter_spec_ex_list_len;
...@@ -420,6 +422,8 @@ int ipa3_copy_ul_filter_rule_to_ipa(struct ipa_install_fltr_rule_req_msg_v01 ...@@ -420,6 +422,8 @@ int ipa3_copy_ul_filter_rule_to_ipa(struct ipa_install_fltr_rule_req_msg_v01
} else { } else {
rmnet_ipa3_ctx->num_q6_rules = 0; rmnet_ipa3_ctx->num_q6_rules = 0;
IPAWANERR("got no UL rules from modem\n"); IPAWANERR("got no UL rules from modem\n");
mutex_unlock(&rmnet_ipa3_ctx->
add_mux_channel_lock);
return -EINVAL; return -EINVAL;
} }
...@@ -622,9 +626,13 @@ failure: ...@@ -622,9 +626,13 @@ failure:
rmnet_ipa3_ctx->num_q6_rules = 0; rmnet_ipa3_ctx->num_q6_rules = 0;
memset(ipa3_qmi_ctx->q6_ul_filter_rule, 0, memset(ipa3_qmi_ctx->q6_ul_filter_rule, 0,
sizeof(ipa3_qmi_ctx->q6_ul_filter_rule)); sizeof(ipa3_qmi_ctx->q6_ul_filter_rule));
mutex_unlock(&rmnet_ipa3_ctx->
add_mux_channel_lock);
return -EINVAL; return -EINVAL;
success: success:
mutex_unlock(&rmnet_ipa3_ctx->
add_mux_channel_lock);
return 0; return 0;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment