Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp7798633imu; Thu, 15 Nov 2018 01:31:55 -0800 (PST) X-Google-Smtp-Source: AJdET5d7vd2l2DlbdIQAkE209Pu2uuQgaGukeGh2d8ORiIeA1i/ZkPlzFWi+bZX4bK3DBppa/uSF X-Received: by 2002:a62:5f05:: with SMTP id t5-v6mr5626769pfb.223.1542274315366; Thu, 15 Nov 2018 01:31:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542274315; cv=none; d=google.com; s=arc-20160816; b=xW4WHZfzTY7H+5t5WhPvSnK3aouTVxXzMm+7+g28EBqch/NBsB3qtTkQHTC3zyaLU3 slGIEvWEOzCpjPAlwFe4Yv9iURxrmhiKXzoRzIfQAwrzehy3P/KGOdbagfSu074RxTl0 xpP8I2bSEbtcEyTbPbRd8vMNTjX0m9pHhaWSYvZTCcd0ar1/S5FWxGFYOoFy9M9C+lN4 ClU9naN1rFM5AljRe1MsaXw96byOv7AlIdnXashsjYChlWHl+X3LE9FogCfGarY93ILB eZGSTbIzffqk1qNwHCHt5KyDRa3dmpnpwNiblgj5MJOxCng2hGSlQb8bGe0XbqXu4syc ZDXA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=BoYAsJfylJLLtobC3FOTNzyB90FMkhxOxdJyIm/l4a4=; b=gvlt1A7Yxt6/x2cmxU/NTCin/IA6yl/yVIambzx/uOkYRWwZLyUcOAIiZOD/2kiF7B jszu8ovlYj+Vg1TXeVcEg9x9f9WuIy3Km7ym5q3xV0bbuSDvyjvyALFJak4sDiC69em4 TmvJ+VLxfRllmIYvy1Dku8uK+HWGbngF3WZQoPjsuuvHxrkaS3dkDiGJh4wz5EsfJ+0+ CIUos/tntMx+IucHatKH/xAZrgP+ficucy9u1+hcIBKxfQQrcIhOJs4fEUe8plk0dWjz iFx6/pZkBVeUojm3zuuKqhKw2y5a28o31LkaL31MfLPUnNEXynKZm55wHcfXKHkBCNhN HnGA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r7-v6si26175389plo.100.2018.11.15.01.31.41; Thu, 15 Nov 2018 01:31:55 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388118AbeKOThv (ORCPT + 99 others); Thu, 15 Nov 2018 14:37:51 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:15100 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727265AbeKOThu (ORCPT ); Thu, 15 Nov 2018 14:37:50 -0500 Received: from DGGEMS402-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 0671212217692; Thu, 15 Nov 2018 17:30:46 +0800 (CST) Received: from S00293818-DELL1.china.huawei.com (10.47.88.106) by DGGEMS402-HUB.china.huawei.com (10.3.19.202) with Microsoft SMTP Server id 14.3.408.0; Thu, 15 Nov 2018 17:30:38 +0800 From: Salil Mehta To: CC: , , , , , , , Subject: [PATCH V2 net-next 4/5] net: hns3: Add skb chain when num of RX buf exceeds MAX_SKB_FRAGS Date: Thu, 15 Nov 2018 09:29:24 +0000 Message-ID: <20181115092925.11812-5-salil.mehta@huawei.com> X-Mailer: git-send-email 2.8.3 In-Reply-To: <20181115092925.11812-1-salil.mehta@huawei.com> References: <20181115092925.11812-1-salil.mehta@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.47.88.106] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Peng Li MAX_SKB_FRAGS in protocol stack is defined as: MAX_SKB_FRAGS is 17 when PAGE_SIZE is 4K. If HW enable GRO, it may merge small packets and the rx buffer may be more than MAX_SKB_FRAGS. So driver will add skb chain when RX buffer num. more than MAX_SKB_FRAGS. Signed-off-by: Peng Li Signed-off-by: Salil Mehta --- .../net/ethernet/hisilicon/hns3/hns3_enet.c | 37 ++++++++++++++++++- .../net/ethernet/hisilicon/hns3/hns3_enet.h | 2 + 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index 860067898471..7776089b6bc2 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c @@ -2361,6 +2361,9 @@ static void hns3_rx_checksum(struct hns3_enet_ring *ring, struct sk_buff *skb, static void hns3_rx_skb(struct hns3_enet_ring *ring, struct sk_buff *skb) { + if (skb_has_frag_list(skb)) + napi_gro_flush(&ring->tqp_vector->napi, false); + napi_gro_receive(&ring->tqp_vector->napi, skb); } @@ -2417,6 +2420,8 @@ static int hns3_alloc_skb(struct hns3_enet_ring *ring, int length, prefetchw(skb->data); ring->pending_buf = 1; + ring->frag_num = 0; + ring->tail_skb = NULL; if (length <= HNS3_RX_HEAD_SIZE) { memcpy(__skb_put(skb, length), va, ALIGN(length, sizeof(long))); @@ -2435,7 +2440,7 @@ static int hns3_alloc_skb(struct hns3_enet_ring *ring, int length, ring->pull_len = eth_get_headlen(va, HNS3_RX_HEAD_SIZE); __skb_put(skb, ring->pull_len); - hns3_nic_reuse_page(skb, 0, ring, ring->pull_len, + hns3_nic_reuse_page(skb, ring->frag_num++, ring, ring->pull_len, desc_cb); ring_ptr_move_fw(ring, next_to_clean); @@ -2446,6 +2451,8 @@ static int hns3_add_frag(struct hns3_enet_ring *ring, struct hns3_desc *desc, struct sk_buff **out_skb, bool pending) { struct sk_buff *skb = *out_skb; + struct sk_buff *head_skb = *out_skb; + struct sk_buff *new_skb; struct hns3_desc_cb *desc_cb; struct hns3_desc *pre_desc; u32 bd_base_info; @@ -2470,7 +2477,33 @@ static int hns3_add_frag(struct hns3_enet_ring *ring, struct hns3_desc *desc, if (!hnae3_get_bit(bd_base_info, HNS3_RXD_VLD_B)) return -ENXIO; - hns3_nic_reuse_page(skb, ring->pending_buf, ring, 0, desc_cb); + if (unlikely(ring->frag_num >= MAX_SKB_FRAGS)) { + new_skb = napi_alloc_skb(&ring->tqp_vector->napi, + HNS3_RX_HEAD_SIZE); + if (unlikely(!new_skb)) { + netdev_err(ring->tqp->handle->kinfo.netdev, + "alloc rx skb frag fail\n"); + return -ENXIO; + } + ring->frag_num = 0; + + if (ring->tail_skb) { + ring->tail_skb->next = new_skb; + ring->tail_skb = new_skb; + } else { + skb_shinfo(skb)->frag_list = new_skb; + ring->tail_skb = new_skb; + } + } + + if (ring->tail_skb) { + head_skb->truesize += hnae3_buf_size(ring); + head_skb->data_len += le16_to_cpu(desc->rx.size); + head_skb->len += le16_to_cpu(desc->rx.size); + skb = ring->tail_skb; + } + + hns3_nic_reuse_page(skb, ring->frag_num++, ring, 0, desc_cb); ring_ptr_move_fw(ring, next_to_clean); ring->pending_buf++; } diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h index d8c0998127be..8e56b7e44978 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h @@ -402,6 +402,7 @@ struct hns3_enet_ring { int next_to_clean; int pull_len; /* head length for current packet */ + u32 frag_num; unsigned char *va; /* first buffer address for current packet */ u32 flag; /* ring attribute */ @@ -412,6 +413,7 @@ struct hns3_enet_ring { int pending_buf; struct sk_buff *skb; + struct sk_buff *tail_skb; }; struct hns_queue; -- 2.17.1