From owner-cvs-src@FreeBSD.ORG Thu Sep 23 23:23:16 2004 Return-Path: Delivered-To: cvs-src@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6645816A4CF for ; Thu, 23 Sep 2004 23:23:16 +0000 (GMT) Received: from mail5.speakeasy.net (mail5.speakeasy.net [216.254.0.205]) by mx1.FreeBSD.org (Postfix) with ESMTP id 0C3D443D1F for ; Thu, 23 Sep 2004 23:23:16 +0000 (GMT) (envelope-from jhb@FreeBSD.org) Received: (qmail 9391 invoked from network); 23 Sep 2004 23:23:15 -0000 Received: from dsl027-160-063.atl1.dsl.speakeasy.net (HELO server.baldwin.cx) ([216.27.160.63]) (envelope-sender ) encrypted SMTP for ; 23 Sep 2004 23:23:15 -0000 Received: from [10.50.40.210] (gw1.twc.weather.com [216.133.140.1]) (authenticated bits=0) by server.baldwin.cx (8.12.11/8.12.11) with ESMTP id i8NNNB27012861; Thu, 23 Sep 2004 19:23:12 -0400 (EDT) (envelope-from jhb@FreeBSD.org) From: John Baldwin To: Nate Lawson Date: Thu, 23 Sep 2004 19:23:40 -0400 User-Agent: KMail/1.6.2 References: <200409232112.i8NLCLgQ065917@repoman.freebsd.org> <20040923224739.GE959@green.homeunix.org> <41535A06.7090809@root.org> In-Reply-To: <41535A06.7090809@root.org> MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <200409231923.40285.jhb@FreeBSD.org> X-Spam-Checker-Version: SpamAssassin 2.63 (2004-01-11) on server.baldwin.cx cc: Brian Fundakowski Feldman cc: src-committers@FreeBSD.org cc: cvs-src@FreeBSD.org cc: cvs-all@FreeBSD.org cc: Joerg Wunsch Subject: Re: cvs commit: src/sys/dev/fdc fdc.c fdcvar.h X-BeenThere: cvs-src@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: CVS commit messages for the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Sep 2004 23:23:16 -0000 On Thursday 23 September 2004 07:19 pm, Nate Lawson wrote: > Brian Fundakowski Feldman wrote: > > On Thu, Sep 23, 2004 at 05:48:19PM -0400, John Baldwin wrote: > >>On Thursday 23 September 2004 05:12 pm, Joerg Wunsch wrote: > >>>joerg 2004-09-23 21:12:21 UTC > >>> > >>> FreeBSD src repository > >>> > >>> Modified files: > >>> sys/dev/fdc fdc.c fdcvar.h > >>> Log: > >>> Implement terminating the worker thread when the driver is about to > >>> be deregistered. > >>> > >>> Not yet tested, since by now, GEOM doesn't want us to deregister. PHK > >>> wants to fix that RSN. > >> > >>Note that relying on a wakeup from your own code is not safe if you > >> expect fdc to be a module since you could wakeup the thread doing the > >> kldunload (and thus detach) and then be interrupted for an interrupt and > >> it could unmap the memory backing that function before you get a chance > >> to run again resulting in a panic. There is a special wakeup on the > >> proc pointer in exit1() for kthreads to handle this case. I should > >> likely move that into kthread_exit() however (which wouldn't be a > >> functional change as far as you are concerned). > > > > For example, in pff(4), ignoring the unrelated lines of code: > > > > static void > > pff_per_device_kthread(void *argp) > > { > > mtx_lock(&sc->sc_lock); > > while (!sck->sck_exit) { > > if (!sck->sck_update && !sck->sck_reset && > > STAILQ_EMPTY(&sck->sck_traps)) > > cv_wait(&sck->sck_needed, &sc->sc_lock); > > } > > mtx_unlock(&sc->sc_lock); > > kthread_exit(0); > > } > > > > static void > > pff_kill_kthread(struct pff_softc *sc) > > { > > if (sc->sc_flags & SC_KTHREAD) { > > mtx_lock(&sc->sc_lock); > > sc->sc_kthread.sck_exit = 1; > > cv_signal(&sc->sc_kthread.sck_needed); > > msleep(sc->sc_kthread.sck_proc, &sc->sc_lock, PPAUSE | PDROP, > > "pffktc", 0); > > } > > } > > Or simpler: > > foo_kill(): > error = kthread_suspend(p, kproc_shutdown_wait * hz); > if (error == EWOULDBLOCK) > printf("timed out\n"); > > foo_thread(): > for (;;) { > mtx_unlock(&bdlock); > kthread_suspend_check(bufdaemonproc); > ... > mtx_lock(&bdlock); > if (numdirtybuffers <= lodirtybuffers) > msleep(&bd_request, &bdlock, PVM, "psleep", hz); That doesn't actually cause the thread to exit, it just goes to sleep. If fdc wants to support detaching and kldunload it needs the thread to actually go away, not just go to sleep. -- John Baldwin <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve" = http://www.FreeBSD.org