|
@@ -1,7 +1,7 @@
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
/*
|
|
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
|
|
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
|
|
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
|
|
|
|
+ * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
*/
|
|
*/
|
|
|
|
|
|
#include <linux/bitops.h>
|
|
#include <linux/bitops.h>
|
|
@@ -1105,12 +1105,14 @@ error:
|
|
static int __ipa_finish_rt_rule_add(struct ipa3_rt_entry *entry, u32 *rule_hdl,
|
|
static int __ipa_finish_rt_rule_add(struct ipa3_rt_entry *entry, u32 *rule_hdl,
|
|
struct ipa3_rt_tbl *tbl)
|
|
struct ipa3_rt_tbl *tbl)
|
|
{
|
|
{
|
|
- int id;
|
|
|
|
|
|
+ int id, res = 0;
|
|
|
|
|
|
if (tbl->rule_cnt < IPA_RULE_CNT_MAX)
|
|
if (tbl->rule_cnt < IPA_RULE_CNT_MAX)
|
|
tbl->rule_cnt++;
|
|
tbl->rule_cnt++;
|
|
- else
|
|
|
|
- return -EINVAL;
|
|
|
|
|
|
+ else {
|
|
|
|
+ res = -EINVAL;
|
|
|
|
+ goto failed;
|
|
|
|
+ }
|
|
if (entry->hdr)
|
|
if (entry->hdr)
|
|
entry->hdr->ref_cnt++;
|
|
entry->hdr->ref_cnt++;
|
|
else if (entry->proc_ctx)
|
|
else if (entry->proc_ctx)
|
|
@@ -1119,6 +1121,7 @@ static int __ipa_finish_rt_rule_add(struct ipa3_rt_entry *entry, u32 *rule_hdl,
|
|
if (id < 0) {
|
|
if (id < 0) {
|
|
IPAERR_RL("failed to add to tree\n");
|
|
IPAERR_RL("failed to add to tree\n");
|
|
WARN_ON_RATELIMIT_IPA(1);
|
|
WARN_ON_RATELIMIT_IPA(1);
|
|
|
|
+ res = -EPERM;
|
|
goto ipa_insert_failed;
|
|
goto ipa_insert_failed;
|
|
}
|
|
}
|
|
IPADBG("add rt rule tbl_idx=%d rule_cnt=%d rule_id=%d\n",
|
|
IPADBG("add rt rule tbl_idx=%d rule_cnt=%d rule_id=%d\n",
|
|
@@ -1133,10 +1136,11 @@ ipa_insert_failed:
|
|
entry->hdr->ref_cnt--;
|
|
entry->hdr->ref_cnt--;
|
|
else if (entry->proc_ctx)
|
|
else if (entry->proc_ctx)
|
|
entry->proc_ctx->ref_cnt--;
|
|
entry->proc_ctx->ref_cnt--;
|
|
|
|
+failed:
|
|
idr_remove(tbl->rule_ids, entry->rule_id);
|
|
idr_remove(tbl->rule_ids, entry->rule_id);
|
|
list_del(&entry->link);
|
|
list_del(&entry->link);
|
|
kmem_cache_free(ipa3_ctx->rt_rule_cache, entry);
|
|
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,
|
|
static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name,
|