From patchwork Sat Dec 29 18:58:36 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 208681 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id DCDA62C00BA for ; Sun, 30 Dec 2012 05:58:47 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753156Ab2L2S6k (ORCPT ); Sat, 29 Dec 2012 13:58:40 -0500 Received: from mail-da0-f54.google.com ([209.85.210.54]:53275 "EHLO mail-da0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753091Ab2L2S6j (ORCPT ); Sat, 29 Dec 2012 13:58:39 -0500 Received: by mail-da0-f54.google.com with SMTP id n2so5269396dad.41 for ; Sat, 29 Dec 2012 10:58:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:subject:from:to:cc:date:in-reply-to :references:content-type:x-mailer:mime-version :content-transfer-encoding; bh=71+DIZ4VJi22Td+uIEgs2LJy+i5MTm62jR8lHQAiVio=; b=xUjtgSbCb09q9BbNz74yobdWt8p4yeQm8MjQpEzok2BgNBC6hdWXnuvgb9UxlrmzXl a3slWO4Q6xCkfFyq7OOcATA0xTl8pWY0HGEHDQuMAK2ukN9U/iS6dY3nQf8NAdVVLdaS dpwf317BnUB+VN57U5nQ9tmLcYnxkSTdXFflWy2SwPF2FuRgtpQ4F4zEzYqB+vEWVCaE LC119uZ8+BmK74TAD9Dthq37X16iSL0MILWXlcNcbp7a8jnESaLKQcECqHJKHzV7RkoC H8OQUivOKEFLkJI145OvEui1aofrynAt3W9f1ZIiD00E6N/r1230RyZZFU78NrmCIlgW mqSA== X-Received: by 10.66.90.1 with SMTP id bs1mr109143312pab.19.1356807518673; Sat, 29 Dec 2012 10:58:38 -0800 (PST) Received: from [192.168.1.123] (c-67-170-232-166.hsd1.ca.comcast.net. [67.170.232.166]) by mx.google.com with ESMTPS id rq7sm21826957pbc.69.2012.12.29.10.58.36 (version=SSLv3 cipher=OTHER); Sat, 29 Dec 2012 10:58:37 -0800 (PST) Message-ID: <1356807516.4102.4.camel@edumazet-laptop> Subject: Re: Slow speed of tcp connections in a network namespace From: Eric Dumazet To: Andrew Vagin Cc: netdev@vger.kernel.org, vvs@parallels.com, =?UTF-8?Q?Micha=C5=82_Miros=C5=82aw?= Date: Sat, 29 Dec 2012 19:58:36 +0100 In-Reply-To: <1356802828.21409.4623.camel@edumazet-glaptop> References: <20121229092417.GA4038@paralelels.com> <1356789203.21409.3923.camel@edumazet-glaptop> <20121229145030.GA7959@paralelels.com> <1356802828.21409.4623.camel@edumazet-glaptop> X-Mailer: Evolution 3.6.0-0ubuntu3 Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Le samedi 29 décembre 2012 à 09:40 -0800, Eric Dumazet a écrit : > > Please post your new tcpdump then ;) > > also post "netstat -s" from root and test ns after your wgets Also try following bnx2 patch. It should help GRO / TCP coalesce bnx2 should be the last driver not using skb head_frag --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c index a1adfaf..08a2d40 100644 --- a/drivers/net/ethernet/broadcom/bnx2.c +++ b/drivers/net/ethernet/broadcom/bnx2.c @@ -2726,6 +2726,14 @@ bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index) rx_pg->page = NULL; } +static void bnx2_frag_free(const struct bnx2 *bp, void *data) +{ + if (bp->rx_frag_size) + put_page(virt_to_head_page(data)); + else + kfree(data); +} + static inline int bnx2_alloc_rx_data(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gfp_t gfp) { @@ -2735,7 +2743,10 @@ bnx2_alloc_rx_data(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gf struct bnx2_rx_bd *rxbd = &rxr->rx_desc_ring[BNX2_RX_RING(index)][BNX2_RX_IDX(index)]; - data = kmalloc(bp->rx_buf_size, gfp); + if (bp->rx_frag_size) + data = netdev_alloc_frag(bp->rx_frag_size); + else + data = kmalloc(bp->rx_buf_size, gfp); if (!data) return -ENOMEM; @@ -2744,7 +2755,7 @@ bnx2_alloc_rx_data(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index, gf bp->rx_buf_use_size, PCI_DMA_FROMDEVICE); if (dma_mapping_error(&bp->pdev->dev, mapping)) { - kfree(data); + bnx2_frag_free(bp, data); return -EIO; } @@ -3014,9 +3025,9 @@ error: dma_unmap_single(&bp->pdev->dev, dma_addr, bp->rx_buf_use_size, PCI_DMA_FROMDEVICE); - skb = build_skb(data, 0); + skb = build_skb(data, bp->rx_frag_size); if (!skb) { - kfree(data); + bnx2_frag_free(bp, data); goto error; } skb_reserve(skb, ((u8 *)get_l2_fhdr(data) - data) + BNX2_RX_OFFSET); @@ -5358,6 +5369,10 @@ bnx2_set_rx_ring_size(struct bnx2 *bp, u32 size) /* hw alignment + build_skb() overhead*/ bp->rx_buf_size = SKB_DATA_ALIGN(bp->rx_buf_use_size + BNX2_RX_ALIGN) + NET_SKB_PAD + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + if (bp->rx_buf_size <= PAGE_SIZE) + bp->rx_frag_size = bp->rx_buf_size; + else + bp->rx_frag_size = 0; bp->rx_jumbo_thresh = rx_size - BNX2_RX_OFFSET; bp->rx_ring_size = size; bp->rx_max_ring = bnx2_find_max_ring(size, BNX2_MAX_RX_RINGS); @@ -5436,7 +5451,7 @@ bnx2_free_rx_skbs(struct bnx2 *bp) rx_buf->data = NULL; - kfree(data); + bnx2_frag_free(bp, data); } for (j = 0; j < bp->rx_max_pg_ring_idx; j++) bnx2_free_rx_page(bp, rxr, j); diff --git a/drivers/net/ethernet/broadcom/bnx2.h b/drivers/net/ethernet/broadcom/bnx2.h index 172efbe..11f5dee 100644 --- a/drivers/net/ethernet/broadcom/bnx2.h +++ b/drivers/net/ethernet/broadcom/bnx2.h @@ -6804,6 +6804,7 @@ struct bnx2 { u32 rx_buf_use_size; /* useable size */ u32 rx_buf_size; /* with alignment */ + u32 rx_frag_size; /* 0 if kmalloced(), or rx_buf_size */ u32 rx_copy_thresh; u32 rx_jumbo_thresh; u32 rx_max_ring_idx;