mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2025-11-01 07:28:49 +00:00
This is an automatically generated commit. When doing `git bisect`, consider `git bisect --skip`. Signed-off-by: Kenneth Kasilag <kenneth@kasilag.me> Link: https://github.com/openwrt/openwrt/pull/19038 Signed-off-by: Robert Marko <robimarko@gmail.com>
93 lines
2.9 KiB
Diff
93 lines
2.9 KiB
Diff
From 38358fa3cc8e16c6862a3e5c5c233f9f652e3a6d Mon Sep 17 00:00:00 2001
|
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Date: Thu, 31 Jul 2025 12:29:08 +0200
|
|
Subject: [PATCH] net: airoha: Fix PPE table access in
|
|
airoha_ppe_debugfs_foe_show()
|
|
|
|
In order to avoid any possible race we need to hold the ppe_lock
|
|
spinlock accessing the hw PPE table. airoha_ppe_foe_get_entry routine is
|
|
always executed holding ppe_lock except in airoha_ppe_debugfs_foe_show
|
|
routine. Fix the problem introducing airoha_ppe_foe_get_entry_locked
|
|
routine.
|
|
|
|
Fixes: 3fe15c640f380 ("net: airoha: Introduce PPE debugfs support")
|
|
Reviewed-by: Dawid Osuchowski <dawid.osuchowski@linux.intel.com>
|
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Link: https://patch.msgid.link/20250731-airoha_ppe_foe_get_entry_locked-v2-1-50efbd8c0fd6@kernel.org
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
drivers/net/ethernet/airoha/airoha_ppe.c | 26 ++++++++++++++++++------
|
|
1 file changed, 20 insertions(+), 6 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/airoha/airoha_ppe.c
|
|
+++ b/drivers/net/ethernet/airoha/airoha_ppe.c
|
|
@@ -508,9 +508,11 @@ static void airoha_ppe_foe_flow_stats_up
|
|
FIELD_PREP(AIROHA_FOE_IB2_NBQ, nbq);
|
|
}
|
|
|
|
-struct airoha_foe_entry *airoha_ppe_foe_get_entry(struct airoha_ppe *ppe,
|
|
- u32 hash)
|
|
+static struct airoha_foe_entry *
|
|
+airoha_ppe_foe_get_entry_locked(struct airoha_ppe *ppe, u32 hash)
|
|
{
|
|
+ lockdep_assert_held(&ppe_lock);
|
|
+
|
|
if (hash < PPE_SRAM_NUM_ENTRIES) {
|
|
u32 *hwe = ppe->foe + hash * sizeof(struct airoha_foe_entry);
|
|
struct airoha_eth *eth = ppe->eth;
|
|
@@ -537,6 +539,18 @@ struct airoha_foe_entry *airoha_ppe_foe_
|
|
return ppe->foe + hash * sizeof(struct airoha_foe_entry);
|
|
}
|
|
|
|
+struct airoha_foe_entry *airoha_ppe_foe_get_entry(struct airoha_ppe *ppe,
|
|
+ u32 hash)
|
|
+{
|
|
+ struct airoha_foe_entry *hwe;
|
|
+
|
|
+ spin_lock_bh(&ppe_lock);
|
|
+ hwe = airoha_ppe_foe_get_entry_locked(ppe, hash);
|
|
+ spin_unlock_bh(&ppe_lock);
|
|
+
|
|
+ return hwe;
|
|
+}
|
|
+
|
|
static bool airoha_ppe_foe_compare_entry(struct airoha_flow_table_entry *e,
|
|
struct airoha_foe_entry *hwe)
|
|
{
|
|
@@ -651,7 +665,7 @@ airoha_ppe_foe_commit_subflow_entry(stru
|
|
struct airoha_flow_table_entry *f;
|
|
int type;
|
|
|
|
- hwe_p = airoha_ppe_foe_get_entry(ppe, hash);
|
|
+ hwe_p = airoha_ppe_foe_get_entry_locked(ppe, hash);
|
|
if (!hwe_p)
|
|
return -EINVAL;
|
|
|
|
@@ -703,7 +717,7 @@ static void airoha_ppe_foe_insert_entry(
|
|
|
|
spin_lock_bh(&ppe_lock);
|
|
|
|
- hwe = airoha_ppe_foe_get_entry(ppe, hash);
|
|
+ hwe = airoha_ppe_foe_get_entry_locked(ppe, hash);
|
|
if (!hwe)
|
|
goto unlock;
|
|
|
|
@@ -818,7 +832,7 @@ airoha_ppe_foe_flow_l2_entry_update(stru
|
|
u32 ib1, state;
|
|
int idle;
|
|
|
|
- hwe = airoha_ppe_foe_get_entry(ppe, iter->hash);
|
|
+ hwe = airoha_ppe_foe_get_entry_locked(ppe, iter->hash);
|
|
if (!hwe)
|
|
continue;
|
|
|
|
@@ -855,7 +869,7 @@ static void airoha_ppe_foe_flow_entry_up
|
|
if (e->hash == 0xffff)
|
|
goto unlock;
|
|
|
|
- hwe_p = airoha_ppe_foe_get_entry(ppe, e->hash);
|
|
+ hwe_p = airoha_ppe_foe_get_entry_locked(ppe, e->hash);
|
|
if (!hwe_p)
|
|
goto unlock;
|
|
|