Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933206Ab3FFMuu (ORCPT ); Thu, 6 Jun 2013 08:50:50 -0400 Received: from mga02.intel.com ([134.134.136.20]:15667 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932902Ab3FFMus (ORCPT ); Thu, 6 Jun 2013 08:50:48 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.87,814,1363158000"; d="scan'208";a="345771591" Message-ID: <51B085A2.5090306@linux.intel.com> Date: Thu, 06 Jun 2013 15:50:42 +0300 From: Eliezer Tamir User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130509 Thunderbird/17.0.6 MIME-Version: 1.0 To: Eric Dumazet CC: David Miller , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Jesse Brandeburg , Don Skidmore , e1000-devel@lists.sourceforge.net, Willem de Bruijn , Ben Hutchings , Andi Kleen , HPA , Eilon Greenstien , Or Gerlitz , Amir Vadai , Eliezer Tamir Subject: Re: [PATCH v9 net-next 2/7] net: add low latency socket poll References: <20130605103400.11172.49099.stgit@ladj378.jer.intel.com> <20130605103421.11172.82925.stgit@ladj378.jer.intel.com> <1370445714.24311.268.camel@edumazet-glaptop> <51AF59B0.6080101@linux.intel.com> <1370446760.24311.275.camel@edumazet-glaptop> <51AF5D5A.8030907@linux.intel.com> <1370447966.24311.284.camel@edumazet-glaptop> In-Reply-To: <1370447966.24311.284.camel@edumazet-glaptop> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2453 Lines: 68 On 05/06/2013 18:59, Eric Dumazet wrote: > On Wed, 2013-06-05 at 18:46 +0300, Eliezer Tamir wrote: >> On 05/06/2013 18:39, Eric Dumazet wrote: >>> On Wed, 2013-06-05 at 18:30 +0300, Eliezer Tamir wrote: >>>> On 05/06/2013 18:21, Eric Dumazet wrote: >> >>>>> It would also make sense to give end_time as a parameter, so that the >>>>> polling() code could really give a end_time for the whole duration of >>>>> poll(). >>>>> >>>>> (You then should test can_poll_ll(end_time) _before_ call to >>>>> ndo_ll_poll()) >>>> >>>> how would you handle a nonblocking operation in that case? >>>> I guess if we have a socket option, then we don't need to handle none >>>> blocking any diffrent, since the user specified exactly how much time to >>>> waste polling. right? >>> >>> If the thread already spent 50us in the poll() system call, it for sure >>> should not call any ndo_ll_poll(). This makes no more sense at this >>> point. >> >> what about a non-blocking read from a socket? >> Right now we assume this means poll only once since the application will >> repeat as needed. >> >> maybe add a "once" parameter that will cause sk_poll_ll() to ignore end >> time and only try once? > > extern bool __sk_poll_ll(struct sock *sk, cycles_t end); > > static inline bool sk_poll_ll(struct sock *sk, bool nonblock) > { > return __sk_poll_ll(sk, nonblock, ll_end_time()); > } > > In the poll() code, we should call ll_end_time() once, even if we poll > 1000 fds. Right now we have three uses for sk_poll_ll 1. blocking read - In this case we loop until: a !skb_queue_empty(&sk->sk_receive_queue) or b !can_poll_ll(end_time) 2. non-blocking read - only try once, ignoring end time. 3. poll/select - for each socket we only try once (nonblock==1), we loop in poll/select until we are lucky or run out of time. For 1 we want to loop inside sk_poll_ll() but for 3 we loop in poll/select. So it seems all we need is for sk_poll_ll() to not call ll_end_time() if nonblock is set. ( something like cycles_t end_time = nonblock ? 0 : ll_end_time(); ) Or we could move out looping in all cases to the calling function. Does this mean we should push out rcu_read_lock_bh() into the caller as well? -Eliezer -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/