On Thu, Aug 31 2023, Alexander Bluhm <alexander.bl...@gmx.net> wrote:
> On Thu, Aug 31, 2023 at 01:05:11PM +0300, Vitaliy Makkoveev wrote:
>> On Thu, Aug 31, 2023 at 11:26:42AM +0200, Jeremie Courreges-Anglas wrote:
>> > 
>> > Looks umb(4) triggers the NET_ASSERT_LOCKED() check in
>> > rtable_getsource() when the umb(4) interface comes up (here with
>> > kern.splassert=2 to get context).  Reproduced with GENERIC.MP from Aug
>> > 28 as well with cvs HEAD/if_umb.c rev 1.54.
>> > 
>> > Something to worry about?
>> > 
>> > 
>> > OpenBSD 7.3-current (GENERIC.MP) #1357: Mon Aug 28 20:14:09 MDT 2023
>> >     dera...@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP
>> > [...]
>> > umb0 at uhub0 port 3 configuration 1 interface 0 "FIBOCOM L831-EAU-00" rev 
>> > 2.00/17.29 addr 2
>> > [...]
>> > splassert: rtable_getsource: want 2 have 0
>> > Starting stack trace...
>> > rtable_getsource(0,2) at rtable_getsource+0x58
>> > rtm_send(fffffd83b1a817e0,1,0,0) at rtm_send+0xbc
>> > umb_add_inet_config(ffff8000017c7000,edf0e72e,18,1f0e72e) at 
>> > umb_add_inet_config+0x2a8
>> > umb_decode_ip_configuration(ffff8000017c7000,ffff800001ccf230,50) at 
>> > umb_decode_ip_configuration+0x147
>> > umb_get_response_task(ffff8000017c7000) at umb_get_response_task+0xda
>> > usb_task_thread(ffff800022fe0010) at usb_task_thread+0xe5
>> > end trace frame: 0x0, count: 251
>> > End of stack trace.
>> > 
>> 
>> rtable_getsource() requires at least shared netlock to be held. It can't
>> be taken within rtm_send() because we have paths where caller already
>> holds it.
>
> I am not sure if rtm_miss() a few lines above should run without
> netlock.  Could we just move the NET_UNLOCK() currenly above the
> if block after the else block?
>
> NET_UNLOCK() and NET_LOCK_SHARED() just after each other does not
> make much sense.  Just keep exclusive netlock for the few lines.

This diff fixes the splassert messages but I share blumh's concern about
granularity.  Also, a NET_UNLOCK()/NET_LOCK_SHARED() dance may introduce
a new sleeping point and a race.

If such granularity was useful I guess you folks would have come up with
a safe exclusive->shared netlock mechanism by now?

> bluhm
>
>> Index: sys/dev/usb/if_umb.c
>> ===================================================================
>> RCS file: /cvs/src/sys/dev/usb/if_umb.c,v
>> retrieving revision 1.54
>> diff -u -p -r1.54 if_umb.c
>> --- sys/dev/usb/if_umb.c     29 Aug 2023 23:28:38 -0000      1.54
>> +++ sys/dev/usb/if_umb.c     31 Aug 2023 10:03:13 -0000
>> @@ -1859,7 +1859,9 @@ umb_add_inet_config(struct umb_softc *sc
>>                  ifp->if_rdomain);
>>      } else {
>>              /* Inform listeners of the new route */
>> +            NET_LOCK_SHARED();
>>              rtm_send(rt, RTM_ADD, rv, ifp->if_rdomain);
>> +            NET_UNLOCK_SHARED();
>>              rtfree(rt);
>>      }
>>  
>> @@ -1940,7 +1942,9 @@ umb_add_inet6_config(struct umb_softc *s
>>                  ifp->if_rdomain);
>>      } else {
>>              /* Inform listeners of the new route */
>> +            NET_LOCK_SHARED();
>>              rtm_send(rt, RTM_ADD, rv, ifp->if_rdomain);
>> +            NET_UNLOCK_SHARED();
>>              rtfree(rt);
>>      }
>>  
>

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to