tech-net archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: crashes in nd6_llinfo_timer...
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) {
Home |
Main Index |
Thread Index |
Old Index