Add wakeup_with() before 7.0?
John Baldwin
jhb at freebsd.org
Thu Jun 28 20:53:57 UTC 2007
On Thursday 28 June 2007 03:41:15 pm Jeff Roberson wrote:
> I propose to add a new api for wakeup before 7.0. This new api would
> accept a wait channel and a flags argument. here's the relevant part of
> the diff:
>
> +void wakeup_with(void *chan, int flags) __nonnull(1);
> +#define WAKEUP_ONE 0x00001 /* Only wakeup on thread.
> */
> +#define WAKEUP_ALL 0x00002 /* Wake-up all waiters. */
> +#define WAKEUP_LOCAL 0x00004 /* Wake-up on the local
> cpu. */
> +#define WAKEUP_TAIL 0x00008 /* Wake-up the newest
> waiter. */
>
> This allows wakeup callers to hint the scheduler about various
> information. WAKEUP_LOCAL would allow us to prefer affinity for the
> waking cpu. I have patches to use this in pipe code and socket buffer
> code that improve performance in some workloads. WAKEUP_TAIL could be
> used for accept() which I have heard can significantly improve webserver
> performance.
>
> To implement this change sched_wakeup() and setrunnable() need the flags
> plummed all the way through. I would like feedback on whether people
> think the api breakage should go in now to enable these optimizations for
> 7.0, potentially without committing users of these flags right away.
> Alternatively we could break the api later or just skip it until 8.0.
We have something like WAKEUP_TAIL (but different, it also prefers non-swapped
out processes in addition to taking the most recently suspended thread) at
work for accept() and it just modifies the sleepq code's choice in
sleepq_signal() of which thread to pick, it doesn't touch any of the
scheduler stuff at all. OTOH, I think the scheduler ABIs are ok to change
during 7.x as they aren't exposed to any KLD's (no well-behaving ones anyway)
as drivers, etc. should all be using higher-level APIs like cv_*() or
*sleep().
--
John Baldwin
More information about the freebsd-arch
mailing list