From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: Re: [Xen-devel] [PATCH] xen/netfront: raise max number of slots in xennet_get_responses() Date: Mon, 11 Jun 2018 14:59:49 -0400 Message-ID: References: <20180611075742.1691-1-jgross@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Cc: davem@davemloft.net To: Juergen Gross , linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, netdev@vger.kernel.org Return-path: In-Reply-To: <20180611075742.1691-1-jgross@suse.com> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org List-Id: netdev.vger.kernel.org On 06/11/2018 03:57 AM, Juergen Gross wrote: > The max number of slots used in xennet_get_responses() is set to > MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD). > > In old kernel-xen MAX_SKB_FRAGS was 18, while nowadays it is 17. This > difference is resulting in frequent messages "too many slots" and a > reduced network throughput for some workloads (factor 10 below that of > a kernel-xen based guest). > > Replacing MAX_SKB_FRAGS by XEN_NETIF_NR_SLOTS_MIN for calculation of > the max number of slots to use solves that problem (tests showed no > more messages "too many slots" and throughput was as high as with the > kernel-xen based guest system). > > Signed-off-by: Juergen Gross Reviewed-by: Boris Ostrovsky I wonder also whether netfront_tx_slot_available() is meant to be return (queue->tx.req_prod_pvt - queue->tx.rsp_cons) <                 (NET_TX_RING_SIZE - XEN_NETIF_NR_SLOTS_MIN - 1); which is the same numeric value but provides a more accurate description of what is being tested. -boris > --- > drivers/net/xen-netfront.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c > index 679da1abd73c..ba411005d829 100644 > --- a/drivers/net/xen-netfront.c > +++ b/drivers/net/xen-netfront.c > @@ -790,7 +790,7 @@ static int xennet_get_responses(struct netfront_queue *queue, > RING_IDX cons = queue->rx.rsp_cons; > struct sk_buff *skb = xennet_get_rx_skb(queue, cons); > grant_ref_t ref = xennet_get_rx_ref(queue, cons); > - int max = MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD); > + int max = XEN_NETIF_NR_SLOTS_MIN + (rx->status <= RX_COPY_THRESHOLD); > int slots = 1; > int err = 0; > unsigned long ret;