NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/55395: panic: locking against myself (interface, bridges, vlans)



>Number:         55395
>Category:       kern
>Synopsis:       panic: locking against myself (interface, bridges, vlans)
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Jun 17 15:35:00 +0000 2020
>Originator:     Frank Kardel
>Release:        NetBSD 9.99.65
>Organization:
	
>Environment:
	
	
System: NetBSD dolomiti.hw.abs.acrys.com 9.99.65 NetBSD 9.99.65 (GENERIC) #2: Tue Jun 9 01:44:28 CEST 2020 kardel@Andromeda:/src/NetBSD/cur/src/obj.amd64/sys/arch/amd64/compile/GENERIC amd64
Architecture: x86_64
Machine: amd64
>Description:
	Given following network configuration

	wm0(ip-addr-1)-+-bridge0-xvif1i0(ip-addr-2)
                       |
		       +-vlan10(no ip addr)-bridge1-?
                       |
		       +-vlan20(no ip addr)-bridge2-?
                       |
		       \-vlan30(no ip addr)-bridge3-?

	leads to a panic:
	      System panicked: lock error: Mutex: mutex_vector_enter,543: locking against myself: lock 0xffffc5066b824080 cpu 1 lwp 0xffffc499ddef6600
	      Backtrace from time of crash is available.
	      crash> bt
	      _KERNEL_OPT_NARCNET() at 0
	      ostype() at ffffffff8143717b
	      sys_reboot() at sys_reboot
	      vpanic() at vpanic+0x15b
	      snprintf() at snprintf
	      lockdebug_abort() at lockdebug_abort+0xd3
	      mutex_vector_enter() at mutex_vector_enter+0x402
	      bridge_input() at bridge_input+0xb11
	      vlan_input() at vlan_input+0x102
	      ether_input() at ether_input+0x4ce
	      bridge_input() at bridge_input+0xb33
	      if_percpuq_softint() at if_percpuq_softint+0x90
	      softint_dispatch() at softint_dispatch+0x2d1
	      DDB lost frame for Xsoftintr+0x4f, trying 0xffff9323fbea40f0
	      Xsoftintr() at Xsoftintr+0x4f
	      --- interrupt ---
	
	A panic can be avoided with using a second interface given following configuration:
	
	wm0(ip-addr-1)-bridge0-xvif1i0(ip-addr-2)
                        
	wm1(no-ip-addr)-+-vlan10(no ip addr)-bridge1-?
                        |
		        +-vlan20(no ip addr)-bridge2-?
                        |
		        \-vlan30(no ip addr)-bridge3-?

	Reading the code (if_bridge.c) I see that we hold the softnet_lock for calling ether_input
	and when ether_input encounters another bridge the bridge code attempts a acquire the
	softnet_lock again and panics.

>How-To-Repeat:
	configure the the interfaces as above in the first example and wait for the panic.
>Fix:
	re-work locking / decouple packet processing?

>Unformatted:
 	
 	


Home | Main Index | Thread Index | Old Index