Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Dec 2011 11:50:09 +0100
From:      Stefan Bethke <stb@lassitu.de>
To:        Adrian Chadd <adrian@freebsd.org>
Cc:        "freebsd-embedded@freebsd.org" <freebsd-embedded@freebsd.org>
Subject:   Re: Updated switch/glue patch?
Message-ID:  <9A1E9A46-BE00-4EBA-AC8A-2D61C3CCABE8@lassitu.de>
In-Reply-To: <E4D24E02-4F0E-43FB-84F0-F5F20925F748@lassitu.de>
References:  <CAJ-Vmon8%2BOXQ4g752zZEB-O0BR0sFWO0QUvw--xp2jsBDkx6tQ@mail.gmail.com> <0F6CC18F-6973-42A2-AC03-F01BF59458AE@lassitu.de> <CAJ-Vmo=Y8pp4iFnw%2B1hcPae6QXFboz=a7puwgC1kVSZ3JwMgPQ@mail.gmail.com> <1100F70E-9DA9-4163-AC9A-423ECE5AA9A3@lassitu.de> <CAJ-VmonrnJ7cC6u2LsL9AGusz_%2BkSwY62Rr1__sg5U_NynJ1SQ@mail.gmail.com> <CAJ-Vmo=WSN1oLM=B2HqSHrWyOaOD9BSwwu8=1Wys0CLRJ_N-TA@mail.gmail.com> <C637C171-A1A2-4296-84FA-6DE97137DC42@lassitu.de> <CAJ-Vmon2boy7OCh_4O0MeCi0yCdZu0OYb5dxHCEK=-%2B46zBGtg@mail.gmail.com> <CAJ-Vmoku5eLEYi5_DXVxK=0=4Ewn2aGepv3YUw4ApuVh_7y2%2Bw@mail.gmail.com> <CAJ-VmonvpnaS1rAO%2BsDRh1E5WfsrZTYE297Kc96prhfKjrM89Q@mail.gmail.com> <CAJ-VmokQxQs2DUKL=ONyxnnS7Q28ytmwZJ_thqvc4SvMkmS=cQ@mail.gmail.com> <18CABB46-9B9A-41CB-8742-6723C5FF4D67@lassitu.de> <C0BF20FD-E30F-4E9C-A0FE-500BE4807B99@bsdimp.com> <CAJ-VmokgiQCEG4et3X=3o_MuCMkO9MqkKqa-fjdpEqQNucn=Lw@mail.gmail.com> <2CBD8651-E132-49DC-A082-37A8F5C626EA@bsdimp.com> <AFE755D6-E462-40B4-A97B-9261303B3A4F@lassitu.de> <CAJ-Vm onmMASxJZBAd2doX4eV6s5TF-3kCB0pLSMrWM8r0UsCmg@mail.gmail.com> <FC8A0B08-5292-44CC-AEC0-08BF170FCEA4@lassitu.de> <267FB3D6-830E-4A2F-8C1C-A96873EDCD31@lassitu.de> <EC4D4397-FA60-4CB1-8635-48988215E19A@lassitu.de> <CAJ-VmomZeHEyue4eaNGm%2Bw67uDBsOH_2bqocXjBGxyxHXStZ_A@mail.gmail.com> <12538AED-175C-4B1E-BF05-6FD05D14CE70@lassitu.de> <CAJ-Vmonu_HyhEnS=3aj7X41-LPWcihPA6Wa6jgV3cn7im2N3Kg@mail.gmail.com> <2135AD2B-76D4-4B3D-A009-8F3BEC836051@lassitu.de> <CAJ-VmomkCLARagMXUmmJ2O8AQsiKwOEvWMLmwUnK=c47yDJvyw@mail.gmail.com> <2BB71545-7DE9-493D-92FE-AD4CEDCBF2D1@lassitu.de> <E4D24E02-4F0E-43FB-84F0-F5F20925F748@lassitu.de>

next in thread | previous in thread | raw e-mail | index | archive | help

Am 29.12.2011 um 11:18 schrieb Stefan Bethke:

>> http://gitorious.org/~stb/freebsd/stb-adrianchadd-freebsd-work =
(branch work/ath)
>> http://www.lassitu.de/freebsd/etherswitch-adrian.patch (patch against =
Adrians gitorious repo as of now)
>> http://www.lassitu.de/freebsd/etherswitch.tbz (all files)
>=20
> I've now gotten the panic again with the callout:
> Sleeping on "rtl8366rbstart" with the following non-sleepable locks =
held:
> exclusive sleep mutex rtl8366rbcallout (rtl8366rbcallout) r =3D 0 =
(0x80769114) locked @ =
/home/stb/working/fe/stb-adrianchadd-freebsd-work/sys/kern/kern_mutex.c:14=
8
>=20
> callout_init_mtx() says
>> The usable lock classes are currently limited to mutexes and rwlocks, =
because callout handlers run in softclock swi, so they cannot sleep nor =
acquire sleepable locks like sx or lockmgr.
>=20
> The way I read that, any callout will be run in a way that does not =
allow sleeping.  I'm not sure how to handle this.

Here's one way, replacing the callout with a thread:
diff --git a/sys/dev/etherswitch/rtl8366rb.c =
b/sys/dev/etherswitch/rtl8366rb.c
index 599f5f0..2acb206 100644
--- a/sys/dev/etherswitch/rtl8366rb.c
+++ b/sys/dev/etherswitch/rtl8366rb.c
@@ -30,6 +30,7 @@
 #include <sys/bus.h>
 #include <sys/errno.h>
 #include <sys/kernel.h>
+#include <sys/kthread.h>
 #include <sys/module.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
@@ -60,13 +61,13 @@
=20
 struct rtl8366rb_softc {
        struct mtx      smi_mtx;        /* serialize access to SMI/I2C =
bus */
-       struct mtx      callout_mtx;    /* serialize callout */
        device_t        dev;
        char            *ifname[RTL8366RB_NUM_PHYS];
        device_t        miibus[RTL8366RB_NUM_PHYS];
        struct ifnet    *ifp[RTL8366RB_NUM_PHYS];
        device_t        etherswitch;
-       struct callout  callout_tick;
+       struct thread   *tickthread;
+       int             ticking;
 };
=20
 static etherswitch_info_t etherswitch_info =3D {
@@ -171,7 +172,6 @@ rtl8366rb_attach(device_t dev)
        sc =3D device_get_softc(dev);
        sc->dev =3D dev;
        mtx_init(&sc->smi_mtx, "rtl8366rbsmi", NULL, MTX_DEF);
-       mtx_init(&sc->callout_mtx, "rtl8366rbcallout", NULL, MTX_DEF);
=20
        rtl8366rb_init(dev);
        smi_read(dev, RTL8366RB_CVCR, &rev);
@@ -202,8 +202,9 @@ rtl8366rb_attach(device_t dev)
        if (err !=3D 0)
                return (err);
       =20
-       callout_init_mtx(&sc->callout_tick, &sc->callout_mtx, 0);
-       rtl8366rb_tick(sc);
+       sc->ticking =3D 1;
+       kthread_add(rtl8366rb_tick, sc, NULL, &sc->tickthread, 0, 0, \
+               "%s tick", device_get_nameunit(dev));
       =20
        return (err);
 }
@@ -217,6 +218,11 @@ rtl8366rb_detach(device_t dev)
        sc =3D device_get_softc(dev);
        if (sc->etherswitch)
                device_delete_child(dev, sc->etherswitch);
+       if (sc->ticking) {
+               sc->ticking =3D 0;
+               wakeup_one(sc->tickthread);
+               tsleep(sc, 0, "tickexit", 0);
+       }
        for (i=3D0; i < RTL8366RB_NUM_PHYS; i++) {
                if (sc->miibus[i])
                        device_delete_child(dev, sc->miibus[i]);
@@ -225,8 +231,6 @@ rtl8366rb_detach(device_t dev)
                free(sc->ifname[i], M_DEVBUF);
        }
        bus_generic_detach(dev);
-       callout_drain(&sc->callout_tick);
-       mtx_destroy(&sc->callout_mtx);
        mtx_destroy(&sc->smi_mtx);
=20
        return (0);
@@ -295,8 +299,12 @@ rtl8366rb_tick(void *arg)
 {
        struct rtl8366rb_softc *sc =3D arg;
=20
-       rtl833rb_miipollstat(sc);
-       callout_reset(&sc->callout_tick, hz, rtl8366rb_tick, sc);
+       while (sc->ticking) {
+               rtl833rb_miipollstat(sc);
+               tsleep(sc->tickthread, 0, "tick", hz);
+       };
+       wakeup_one(sc);
+       kthread_exit();
 }
=20
 static int


--=20
Stefan Bethke <stb@lassitu.de>   Fon +49 151 14070811






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9A1E9A46-BE00-4EBA-AC8A-2D61C3CCABE8>