From 197d8139033f8bb4d5ebdc3b6a6955fa4fd91548 Mon Sep 17 00:00:00 2001 From: Avinash Kumar Date: Mon, 27 May 2024 12:39:41 +0530 Subject: [PATCH 1/2] msm: ipa: Add additional cleanup in finish rt rule addition In case of rt rules overflow, clean up the rt entry in rt tables list and free the rt entry memory. Change-Id: I3e532d310acc5115e5c31c911544ac5db46106ed Signed-off-by: Avinash Kumar --- drivers/platform/msm/ipa/ipa_v3/ipa_rt.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c index 79166258abae..6223af33cf86 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -1078,12 +1079,14 @@ error: static int __ipa_finish_rt_rule_add(struct ipa3_rt_entry *entry, u32 *rule_hdl, struct ipa3_rt_tbl *tbl) { - int id; + int id, res = 0; if (tbl->rule_cnt < IPA_RULE_CNT_MAX) tbl->rule_cnt++; - else - goto table_insert_failed; + else { + res = -EINVAL; + goto failed; + } if (entry->hdr) entry->hdr->ref_cnt++; else if (entry->proc_ctx) @@ -1092,6 +1095,7 @@ static int __ipa_finish_rt_rule_add(struct ipa3_rt_entry *entry, u32 *rule_hdl, if (id < 0) { IPAERR_RL("failed to add to tree\n"); WARN_ON_RATELIMIT_IPA(1); + res = -EPERM; goto ipa_insert_failed; } IPADBG("add rt rule tbl_idx=%d rule_cnt=%d rule_id=%d\n", @@ -1106,11 +1110,11 @@ ipa_insert_failed: entry->hdr->ref_cnt--; else if (entry->proc_ctx) entry->proc_ctx->ref_cnt--; +failed: idr_remove(tbl->rule_ids, entry->rule_id); -table_insert_failed: list_del(&entry->link); kmem_cache_free(ipa3_ctx->rt_rule_cache, entry); - return -EPERM; + return res; } static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name, From 3f5330ed3a5fca9068ca2e037b0e8ec4a7f6709b Mon Sep 17 00:00:00 2001 From: Avinash Kumar Date: Mon, 27 May 2024 12:39:41 +0530 Subject: [PATCH 2/2] msm: ipa: Add additional cleanup in finish rt rule addition In case of rt rules overflow, clean up the rt entry in rt tables list and free the rt entry memory. Change-Id: I3e532d310acc5115e5c31c911544ac5db46106ed Signed-off-by: Avinash Kumar (cherry picked from commit 197d8139033f8bb4d5ebdc3b6a6955fa4fd91548) --- drivers/platform/msm/ipa/ipa_v3/ipa_rt.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c index 79166258abae..6223af33cf86 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -1078,12 +1079,14 @@ error: static int __ipa_finish_rt_rule_add(struct ipa3_rt_entry *entry, u32 *rule_hdl, struct ipa3_rt_tbl *tbl) { - int id; + int id, res = 0; if (tbl->rule_cnt < IPA_RULE_CNT_MAX) tbl->rule_cnt++; - else - goto table_insert_failed; + else { + res = -EINVAL; + goto failed; + } if (entry->hdr) entry->hdr->ref_cnt++; else if (entry->proc_ctx) @@ -1092,6 +1095,7 @@ static int __ipa_finish_rt_rule_add(struct ipa3_rt_entry *entry, u32 *rule_hdl, if (id < 0) { IPAERR_RL("failed to add to tree\n"); WARN_ON_RATELIMIT_IPA(1); + res = -EPERM; goto ipa_insert_failed; } IPADBG("add rt rule tbl_idx=%d rule_cnt=%d rule_id=%d\n", @@ -1106,11 +1110,11 @@ ipa_insert_failed: entry->hdr->ref_cnt--; else if (entry->proc_ctx) entry->proc_ctx->ref_cnt--; +failed: idr_remove(tbl->rule_ids, entry->rule_id); -table_insert_failed: list_del(&entry->link); kmem_cache_free(ipa3_ctx->rt_rule_cache, entry); - return -EPERM; + return res; } static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name,