Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Jun 2007 13:59:25 -0700 (PDT)
From:      Jeff Roberson <jroberson@chesapeake.net>
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-arch@freebsd.org
Subject:   Re: Add wakeup_with() before 7.0?
Message-ID:  <20070628135758.U552@10.0.0.1>
In-Reply-To: <200706281653.37930.jhb@freebsd.org>
References:  <20070628123314.W552@10.0.0.1> <200706281653.37930.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 28 Jun 2007, John Baldwin wrote:

> 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().

In my implementation the WAKEUP_TAIL call just changes the sleepq as well. 
It doesn't go down to the scheduler.  I agree that well behaving drivers 
should not use setrunnable() or sched_wakeup().  Maybe that is ok to 
break later.  Any other opinions?

Jeff

>
> -- 
> John Baldwin
>



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