Thanks, I moved to to the end of the function.
christos
> On Mar 30, 2020, at 4:21 AM, Ryota Ozaki <ozaki-r%netbsd.org@localhost> wrote:
>
> Hi christos,
>
> I'm sorry for late replying.
>
> It seems that the panic occurs because icmp6_error2 is called with holding
> LLE_WLOCK. So I think that a fix should avoid such a situation by say
> moving icmp6_error2 to somewhere out of the lock.
>
> Thanks,
> ozaki-r
>
>
> On Sat, Mar 28, 2020 at 11:09 AM Christos Zoulas <christos%zoulas.com@localhost> wrote:
>>
>>
>> I filed http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=55030
>> and I've been trying to fix it myself since my machine crashes every
>> couple of days... This is working for me so far, and unless someone
>> comes up with something better, I will commit it soon (with out the
>> messages).
>>
>> Yes, it does work:
>>
>> [10:08pm] 30>dmesg -T | grep oof
>> [Thu Mar 26 16:43:51 EDT 2020] in6_lltable_lookup: oof did not crash
>> [10:08pm] 31>uptime
>> 10:09PM up 3 days, 2:23, 1 user, load averages: 0.00, 0.00, 0.00
>>
>> christos
>>
>>
>> Index: in6.c
>> ===================================================================
>> RCS file: /cvsroot/src/sys/netinet6/in6.c,v
>> retrieving revision 1.277
>> diff -u -u -r1.277 in6.c
>> --- in6.c 20 Jan 2020 18:38:22 -0000 1.277
>> +++ in6.c 28 Mar 2020 02:08:01 -0000
>> @@ -2652,10 +2652,14 @@
>> if (lle == NULL)
>> return NULL;
>>
>> - if (flags & LLE_EXCLUSIVE)
>> - LLE_WLOCK(lle);
>> - else
>> - LLE_RLOCK(lle);
>> + LLE_RLOCK(lle);
>> + if (flags & LLE_EXCLUSIVE) {
>> + if (!LLE_TRY_UPGRADE(lle)) {
>> + LLE_RUNLOCK(lle);
>> + printf("%s: oof did not crash\n", __func__);
>> + return NULL;
>> + }
>> + }
>> return lle;
>> }
>>
>> Index: nd6.c
>> ===================================================================
>> RCS file: /cvsroot/src/sys/netinet6/nd6.c,v
>> retrieving revision 1.267
>> diff -u -u -r1.267 nd6.c
>> --- nd6.c 9 Mar 2020 21:20:56 -0000 1.267
>> +++ nd6.c 28 Mar 2020 02:08:02 -0000
>> @@ -466,7 +466,12 @@
>>
>> SOFTNET_KERNEL_LOCK_UNLESS_NET_MPSAFE();
>>
>> - LLE_WLOCK(ln);
>> + LLE_RLOCK(ln);
>> + if (!LLE_TRY_UPGRADE(ln)) {
>> + LLE_RUNLOCK(ln);
>> + printf("%s: oof did not crash\n", __func__);
>> + goto out;
>> + }
>> if ((ln->la_flags & LLE_LINKED) == 0)
>> goto out;
>> if (ln->ln_ntick > 0) {
Attachment:
signature.asc
Description: Message signed with OpenPGP