[net-next PATCH 0/6] net: dsa: mt7530: modernize MIB handling + fix

Christian Marangi posted 6 patches 8 months, 1 week ago
drivers/net/dsa/mt7530.c | 246 +++++++++++++++++++++++++++++++--------
drivers/net/dsa/mt7530.h |  42 +++++++
2 files changed, 239 insertions(+), 49 deletions(-)
[net-next PATCH 0/6] net: dsa: mt7530: modernize MIB handling + fix
Posted by Christian Marangi 8 months, 1 week ago
This small series modernize MIB handling for MT7530 and also
implement .get_stats64.

It was reported that kernel and Switch MIB desync in scenario where
a packet is forwarded from a port to another. In such case, the
forwarding is offloaded and the kernel is not aware of the
transmitted packet. To handle this, read the counter directly
from Switch registers.

Christian Marangi (6):
  net: dsa: mt7530: generalize read port stats logic
  net: dsa: mt7530: move pkt size and rx err MIB counter to rmon stats
    API
  net: dsa: mt7530: move pause MIB counter to eth_ctrl stats API
  net: dsa: mt7530: move pkt stats and err MIB counter to eth_mac stats
    API
  net: dsa: mt7530: move remaining MIB counter to define
  net: dsa: mt7530: implement .get_stats64

 drivers/net/dsa/mt7530.c | 246 +++++++++++++++++++++++++++++++--------
 drivers/net/dsa/mt7530.h |  42 +++++++
 2 files changed, 239 insertions(+), 49 deletions(-)

-- 
2.48.1
Re: [net-next PATCH 0/6] net: dsa: mt7530: modernize MIB handling + fix
Posted by Daniel Golle 5 months, 3 weeks ago
Hi Christian,

On Thu, Apr 10, 2025 at 06:30:08PM +0200, Christian Marangi wrote:
> This small series modernize MIB handling for MT7530 and also
> implement .get_stats64.
> 
> It was reported that kernel and Switch MIB desync in scenario where
> a packet is forwarded from a port to another. In such case, the
> forwarding is offloaded and the kernel is not aware of the
> transmitted packet. To handle this, read the counter directly
> from Switch registers.
> 
> Christian Marangi (6):
>   net: dsa: mt7530: generalize read port stats logic
>   net: dsa: mt7530: move pkt size and rx err MIB counter to rmon stats
>     API
>   net: dsa: mt7530: move pause MIB counter to eth_ctrl stats API
>   net: dsa: mt7530: move pkt stats and err MIB counter to eth_mac stats
>     API
>   net: dsa: mt7530: move remaining MIB counter to define
>   net: dsa: mt7530: implement .get_stats64

After this series being applied I see lockdep warnings every time
the interface counters are being read on MT7531 connected via MDIO:

[  234.374708] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:579
[  234.383200] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 3667, name: ifconfig
[  234.391202] preempt_count: 1, expected: 0
[  234.395226] INFO: lockdep is turned off.
[  234.399150] CPU: 3 UID: 0 PID: 3667 Comm: ifconfig Tainted: G        W  O        6.16.0-rc1+ #0 NONE 
[  234.399158] Tainted: [W]=WARN, [O]=OOT_MODULE
[  234.399160] Hardware name: Bananapi BPI-R3 (DT)
[  234.399162] Call trace:
[  234.399165]  show_stack+0x28/0x78 (C)
[  234.399179]  dump_stack_lvl+0x68/0x8c
[  234.399184]  dump_stack+0x14/0x1c
[  234.399188]  __might_resched+0x138/0x250
[  234.399197]  __might_sleep+0x44/0x80
[  234.399201]  __mutex_lock+0x4c/0x934
[  234.399209]  mutex_lock_nested+0x20/0x28
[  234.399215]  mt7530_get_stats64+0x40/0x2ac
[  234.399222]  dsa_user_get_stats64+0x2c/0x40
[  234.399229]  dev_get_stats+0x44/0x1e0
[  234.399237]  dev_seq_printf_stats+0x24/0xe0
[  234.399244]  dev_seq_show+0x14/0x40
[  234.399248]  seq_read_iter+0x368/0x464
[  234.399257]  seq_read+0xd0/0xfc
[  234.399263]  proc_reg_read+0xa8/0xf0
[  234.399268]  vfs_read+0x98/0x2b0
[  234.399275]  ksys_read+0x54/0xdc
[  234.399280]  __arm64_sys_read+0x18/0x20
[  234.399286]  invoke_syscall.constprop.0+0x4c/0xd0
[  234.399293]  do_el0_svc+0x3c/0xd0
[  234.399298]  el0_svc+0x34/0xa0
[  234.399303]  el0t_64_sync_handler+0x104/0x138
[  234.399308]  el0t_64_sync+0x158/0x15c

Note that this only shows with some lock debugging options being set
and may not actually be a problem, but I believe it anyway should be
fixed somehow.

#
# Lock Debugging (spinlocks, mutexes, etc...)
#
CONFIG_LOCK_DEBUGGING_SUPPORT=y
CONFIG_PROVE_LOCKING=y
CONFIG_PROVE_RAW_LOCK_NESTING=y
# CONFIG_LOCK_STAT is not set
CONFIG_DEBUG_RT_MUTEXES=y
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y
CONFIG_DEBUG_RWSEMS=y
CONFIG_DEBUG_LOCK_ALLOC=y
CONFIG_LOCKDEP=y
CONFIG_LOCKDEP_BITS=15
CONFIG_LOCKDEP_CHAINS_BITS=16
CONFIG_LOCKDEP_STACK_TRACE_BITS=19
CONFIG_LOCKDEP_STACK_TRACE_HASH_BITS=14
CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS=12
# CONFIG_DEBUG_LOCKDEP is not set
CONFIG_DEBUG_ATOMIC_SLEEP=y
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_LOCK_TORTURE_TEST is not set
# CONFIG_WW_MUTEX_SELFTEST is not set
# CONFIG_SCF_TORTURE_TEST is not set
# CONFIG_CSD_LOCK_WAIT_DEBUG is not set
# end of Lock Debugging (spinlocks, mutexes, etc...)

CONFIG_TRACE_IRQFLAGS=y
CONFIG_TRACE_IRQFLAGS_NMI=y
# CONFIG_DEBUG_IRQFLAGS is not set
CONFIG_STACKTRACE=y
# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set
# CONFIG_DEBUG_KOBJECT is not set


Cheers


Daniel
Re: [net-next PATCH 0/6] net: dsa: mt7530: modernize MIB handling + fix
Posted by Christian Marangi (Ansuel) 5 months, 3 weeks ago
>
> Hi Christian,
>
> On Thu, Apr 10, 2025 at 06:30:08PM +0200, Christian Marangi wrote:
> > This small series modernize MIB handling for MT7530 and also
> > implement .get_stats64.
> >
> > It was reported that kernel and Switch MIB desync in scenario where
> > a packet is forwarded from a port to another. In such case, the
> > forwarding is offloaded and the kernel is not aware of the
> > transmitted packet. To handle this, read the counter directly
> > from Switch registers.
> >
> > Christian Marangi (6):
> >   net: dsa: mt7530: generalize read port stats logic
> >   net: dsa: mt7530: move pkt size and rx err MIB counter to rmon stats
> >     API
> >   net: dsa: mt7530: move pause MIB counter to eth_ctrl stats API
> >   net: dsa: mt7530: move pkt stats and err MIB counter to eth_mac stats
> >     API
> >   net: dsa: mt7530: move remaining MIB counter to define
> >   net: dsa: mt7530: implement .get_stats64
>
> After this series being applied I see lockdep warnings every time
> the interface counters are being read on MT7531 connected via MDIO:
>

Thanks for the report, I will try to fix this and post a followup
patch for this.
Also I assume this is only present for MDIO and MMIO is not affected.

> [  234.374708] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:579
> [  234.383200] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 3667, name: ifconfig
> [  234.391202] preempt_count: 1, expected: 0
> [  234.395226] INFO: lockdep is turned off.
> [  234.399150] CPU: 3 UID: 0 PID: 3667 Comm: ifconfig Tainted: G        W  O        6.16.0-rc1+ #0 NONE
> [  234.399158] Tainted: [W]=WARN, [O]=OOT_MODULE
> [  234.399160] Hardware name: Bananapi BPI-R3 (DT)
> [  234.399162] Call trace:
> [  234.399165]  show_stack+0x28/0x78 (C)
> [  234.399179]  dump_stack_lvl+0x68/0x8c
> [  234.399184]  dump_stack+0x14/0x1c
> [  234.399188]  __might_resched+0x138/0x250
> [  234.399197]  __might_sleep+0x44/0x80
> [  234.399201]  __mutex_lock+0x4c/0x934
> [  234.399209]  mutex_lock_nested+0x20/0x28
> [  234.399215]  mt7530_get_stats64+0x40/0x2ac
> [  234.399222]  dsa_user_get_stats64+0x2c/0x40
> [  234.399229]  dev_get_stats+0x44/0x1e0
> [  234.399237]  dev_seq_printf_stats+0x24/0xe0
> [  234.399244]  dev_seq_show+0x14/0x40
> [  234.399248]  seq_read_iter+0x368/0x464
> [  234.399257]  seq_read+0xd0/0xfc
> [  234.399263]  proc_reg_read+0xa8/0xf0
> [  234.399268]  vfs_read+0x98/0x2b0
> [  234.399275]  ksys_read+0x54/0xdc
> [  234.399280]  __arm64_sys_read+0x18/0x20
> [  234.399286]  invoke_syscall.constprop.0+0x4c/0xd0
> [  234.399293]  do_el0_svc+0x3c/0xd0
> [  234.399298]  el0_svc+0x34/0xa0
> [  234.399303]  el0t_64_sync_handler+0x104/0x138
> [  234.399308]  el0t_64_sync+0x158/0x15c
>
> Note that this only shows with some lock debugging options being set
> and may not actually be a problem, but I believe it anyway should be
> fixed somehow.
>
> #
> # Lock Debugging (spinlocks, mutexes, etc...)
> #
> CONFIG_LOCK_DEBUGGING_SUPPORT=y
> CONFIG_PROVE_LOCKING=y
> CONFIG_PROVE_RAW_LOCK_NESTING=y
> # CONFIG_LOCK_STAT is not set
> CONFIG_DEBUG_RT_MUTEXES=y
> CONFIG_DEBUG_SPINLOCK=y
> CONFIG_DEBUG_MUTEXES=y
> CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y
> CONFIG_DEBUG_RWSEMS=y
> CONFIG_DEBUG_LOCK_ALLOC=y
> CONFIG_LOCKDEP=y
> CONFIG_LOCKDEP_BITS=15
> CONFIG_LOCKDEP_CHAINS_BITS=16
> CONFIG_LOCKDEP_STACK_TRACE_BITS=19
> CONFIG_LOCKDEP_STACK_TRACE_HASH_BITS=14
> CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS=12
> # CONFIG_DEBUG_LOCKDEP is not set
> CONFIG_DEBUG_ATOMIC_SLEEP=y
> # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
> # CONFIG_LOCK_TORTURE_TEST is not set
> # CONFIG_WW_MUTEX_SELFTEST is not set
> # CONFIG_SCF_TORTURE_TEST is not set
> # CONFIG_CSD_LOCK_WAIT_DEBUG is not set
> # end of Lock Debugging (spinlocks, mutexes, etc...)
>
> CONFIG_TRACE_IRQFLAGS=y
> CONFIG_TRACE_IRQFLAGS_NMI=y
> # CONFIG_DEBUG_IRQFLAGS is not set
> CONFIG_STACKTRACE=y
> # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set
> # CONFIG_DEBUG_KOBJECT is not set
>
>
> Cheers
>
>
> Daniel