Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Dec 2007 18:17:28 -0500
From:      John Baldwin <jhb@FreeBSD.org>
To:        freebsd-arch@FreeBSD.org
Cc:        Poul-Henning Kamp <phk@phk.freebsd.dk>
Subject:   Re: New "timeout" api, to replace callout
Message-ID:  <200712271817.28789.jhb@freebsd.org>
In-Reply-To: <15391.1196547545@critter.freebsd.dk>
References:  <15391.1196547545@critter.freebsd.dk>

next in thread | previous in thread | raw e-mail | index | archive | help
On Saturday 01 December 2007 05:19:05 pm Poul-Henning Kamp wrote:
> 
> Here is my proposed new timeout API for 8.x.
> 
> The primary objective is to make it possible to have multiple timeout
> "providers" of possibly different kind, so that we can have per-cpu
> or per-net-stack timeout handing.
> 
> A secondary goal, is to shove the anti-race handling in destruction of
> timeouts back into the implemenation, rather than force users to spend
> 20+ lines doing that.

I don't see this anymore.  Perhaps you haven't looked at updated drivers 
recently?  Right now it looks like this:

foo_attach/create()
{
	mtx_init(&foo->lock, ...);
	callout_init_mtx(&foo->callout, &foo->lock);
}

foo_something()
{
	callout_reset(&foo->callout, foo_timer, ...)
}

/* Called with lock held */
foo_timer()
{
	/*
	 * Doesn't have to check 'is detaching' or any other such crap
	 * anymore.
	 */
}

foo_stop()
{
	FOO_LOCK();
	callout_stop(&foo->callout);

	/* foo_timer() will no longer run after this point. */
	FOO_UNLOCK();
}

foo_detach/destroy()
{
	foo_stop();

	/*
	 * This drain ensures softclock() is done frobbing with our mutex
	 * so we can safely destroy it.  Also makes sure it has no references
	 * to our callout structure either.
	 */
	callout_drain(&foo->callout);
	mtx_destroy(&foo->lock);
}

That's not 20 lines.  You have to do the reset/stop anyway and those now work 
intuitively.  The only "extra" code is an init routine (which you will need 
anyway) and a teardown routine (callout_drain()).  From what I can tell, 
you've basically mandated a lock and when you use callout_init_mtx() (or now 
callout_init_rw()), callout_stop() == timeout_safe() and callout_drain() == 
timeout_cleanup().

Thus, as far as the MPSAFEty stuff, I think the timeout changes are just 
reshuffling deck chairs.  The other goals (axeing hz) I agree with, but I 
don't think you've changed anything as far as MPSAFEty is concerned.  Also, 
I'd probably find timeout_stop() more intuitive than timeout_safe() to be 
honest.  Maybe timeout_disarm()?

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200712271817.28789.jhb>