tech-net archive

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

Re: crashes in nd6_llinfo_timer...



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



Home | Main Index | Thread Index | Old Index