Thread (16 messages) 16 messages, 3 authors, 2026-02-04

Re: [net-next,v22,2/7] net: mtip: The L2 switch driver for imx287

From: Łukasz Majewski <hidden>
Date: 2026-02-04 09:25:05
Also in: imx, linux-arm-kernel, linux-devicetree, lkml

Hi Jakub,
On Tue, 3 Feb 2026 21:19:55 +0100 Łukasz Majewski wrote:
quoted
quoted
quoted
+static void mtip_write_atable(struct switch_enet_private *fep,
int index,
+			      u32 write_lo, u32 write_hi)
+{
+	struct addr_table64b_entry __iomem *atable_base =
+		fep->hwentry->mtip_table64b_entry;
+
+	writel(write_lo, &atable_base[index].lo);
+	writel(write_hi, &atable_base[index].hi);
+}      
Can these functions race with concurrent access? Looking at the
callers, mtip_write_atable is called from two different paths:

1. Static entry updates: mtip_config_switch ->
esw_mac_addr_static -> mtip_update_atable_static ->
mtip_write_atable (no lock held)

2. Dynamic entry updates: timer callback -> mtip_mgnt_timer ->
   mtip_atable_dynamicms_learn_migration ->
mtip_update_atable_dynamic1 -> mtip_write_atable (learn_lock held)

The learn_lock only protects the dynamic entry path. The static
entry path runs during link changes (mtip_switch_restart called
from mtip_adjust_link) without lock protection.

Both paths can access the same hash block in the address table
(determined by GET_BLOCK_PTR(hash)). If the timer fires during a
link change callback, both can concurrently access the table,
potentially causing torn reads (reading .lo from one entry
version and .hi from another) or torn writes (the entry is in an
inconsistent state between the two writel calls).

Would extending learn_lock to protect all address table access
work, or is a separate hw_lock needed for hardware register
access? 
This is handled in another way:

1. Partial write is not possible as this IP block handles it in
order (with some kind of 'latch' registers):

"VFxxx Controller Reference Manual, Rev. 0, 10/2016"
11.5.4 MAC address lookup table

"Each entry must be written or read with the low address accessed
first followed by the high address"

2. The code for dynamic IP writing will not "touch" the entries for
"static" MAC addresses - Figure 11-70 - bit 49 is "Record Type":
	1 - static entry
	0 - dynamic entry

IMHO, we are "safe" here.  
My reading of the AI's comment was that there is no lock in SW so two
SW threads can write:

   Thread A   Thread B
   write_lo
              write_lo
              write_hi
   write_hi
Ok. Then I can add "atable_access" spin lock to prevent from this
situation.

-- 
Best regards,

Łukasz Majewski
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help