From owner-freebsd-arch@FreeBSD.ORG Thu Jun 28 20:59:39 2007 Return-Path: X-Original-To: freebsd-arch@freebsd.org Delivered-To: freebsd-arch@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id BBAFE16A46C; Thu, 28 Jun 2007 20:59:39 +0000 (UTC) (envelope-from jroberson@chesapeake.net) Received: from webaccess-cl.virtdom.com (webaccess-cl.virtdom.com [216.240.101.25]) by mx1.freebsd.org (Postfix) with ESMTP id 8512113C457; Thu, 28 Jun 2007 20:59:39 +0000 (UTC) (envelope-from jroberson@chesapeake.net) Received: from [192.168.1.101] (c-71-231-138-78.hsd1.or.comcast.net [71.231.138.78]) (authenticated bits=0) by webaccess-cl.virtdom.com (8.13.6/8.13.6) with ESMTP id l5SKxb4L054125 (version=TLSv1/SSLv3 cipher=DHE-DSS-AES256-SHA bits=256 verify=NO); Thu, 28 Jun 2007 16:59:38 -0400 (EDT) (envelope-from jroberson@chesapeake.net) Date: Thu, 28 Jun 2007 13:59:25 -0700 (PDT) From: Jeff Roberson X-X-Sender: jroberson@10.0.0.1 To: John Baldwin In-Reply-To: <200706281653.37930.jhb@freebsd.org> Message-ID: <20070628135758.U552@10.0.0.1> References: <20070628123314.W552@10.0.0.1> <200706281653.37930.jhb@freebsd.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: freebsd-arch@freebsd.org Subject: Re: Add wakeup_with() before 7.0? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Jun 2007 20:59:39 -0000 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 >