From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id CE136A0565; Tue, 17 Mar 2020 15:46:02 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E58D225D9; Tue, 17 Mar 2020 15:46:01 +0100 (CET) Received: from huawei.com (szxga04-in.huawei.com [45.249.212.190]) by dpdk.org (Postfix) with ESMTP id 0F6411AFF for ; Tue, 17 Mar 2020 15:45:58 +0100 (CET) Received: from DGGEMS407-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 0D37DF9A8FC043F1AE7D; Tue, 17 Mar 2020 22:45:54 +0800 (CST) Received: from tester.localdomain (10.175.119.39) by DGGEMS407-HUB.china.huawei.com (10.3.19.207) with Microsoft SMTP Server id 14.3.487.0; Tue, 17 Mar 2020 22:45:46 +0800 From: Xiaoyun wang To: CC: , , , , , , , , Xiaoyun wang Date: Tue, 17 Mar 2020 23:01:11 +0800 Message-ID: <0c9d80a7cad0e6206b62665c12b589fde1588b72.1584456756.git.cloud.wangxiaoyun@huawei.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.119.39] X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH v2 1/7] net/hinic: fix LRO problems X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Pmd driver should change the max_lro_pkt_size parameter into lro_wqe_num that used for hardware, and when packets are coalesced by hardware, PKT_RX_LRO flag should be set in the RX mbuf. Fixes: 9d4878ef0897 ("net/hinic: support LRO offload") Signed-off-by: Xiaoyun wang --- drivers/net/hinic/hinic_pmd_ethdev.c | 17 ++------------- drivers/net/hinic/hinic_pmd_rx.c | 42 +++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c index 8493f6e..b81ecd0 100644 --- a/drivers/net/hinic/hinic_pmd_ethdev.c +++ b/drivers/net/hinic/hinic_pmd_ethdev.c @@ -736,6 +736,7 @@ static void hinic_get_speed_capa(struct rte_eth_dev *dev, uint32_t *speed_capa) info->max_mac_addrs = HINIC_MAX_UC_MAC_ADDRS; info->min_mtu = HINIC_MIN_MTU_SIZE; info->max_mtu = HINIC_MAX_MTU_SIZE; + info->max_lro_pkt_size = HINIC_MAX_LRO_SIZE; hinic_get_speed_capa(dev, &info->speed_capa); info->rx_queue_offload_capa = 0; @@ -811,12 +812,10 @@ static int hinic_config_rx_mode(struct hinic_nic_dev *nic_dev, u32 rx_mode_ctrl) return 0; } - static int hinic_rxtx_configure(struct rte_eth_dev *dev) { - int err; struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); - bool lro_en; + int err; /* rx configure, if rss enable, need to init default configuration */ err = hinic_rx_configure(dev); @@ -833,18 +832,6 @@ static int hinic_rxtx_configure(struct rte_eth_dev *dev) goto set_rx_mode_fail; } - /* config lro */ - lro_en = dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO ? - true : false; - - err = hinic_set_rx_lro(nic_dev->hwdev, lro_en, lro_en, - HINIC_LRO_WQE_NUM_DEFAULT); - if (err) { - PMD_DRV_LOG(ERR, "%s lro failed, err: %d", - lro_en ? "Enable" : "Disable", err); - goto set_rx_mode_fail; - } - return HINIC_OK; set_rx_mode_fail: diff --git a/drivers/net/hinic/hinic_pmd_rx.c b/drivers/net/hinic/hinic_pmd_rx.c index f1b873a..224337d 100644 --- a/drivers/net/hinic/hinic_pmd_rx.c +++ b/drivers/net/hinic/hinic_pmd_rx.c @@ -656,6 +656,10 @@ int hinic_rx_configure(struct rte_eth_dev *dev) struct rte_eth_rss_conf rss_conf = dev->data->dev_conf.rx_adv_conf.rss_conf; int err; + bool lro_en; + int max_lro_size; + int lro_wqe_num; + int buf_size; if (nic_dev->flags & ETH_MQ_RX_RSS_FLAG) { if (rss_conf.rss_hf == 0) { @@ -681,15 +685,42 @@ int hinic_rx_configure(struct rte_eth_dev *dev) if (err) goto rx_csum_ofl_err; + /* config lro */ + lro_en = dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO ? + true : false; + max_lro_size = dev->data->dev_conf.rxmode.max_lro_pkt_size; + buf_size = nic_dev->hwdev->nic_io->rq_buf_size; + lro_wqe_num = max_lro_size / buf_size ? (max_lro_size / buf_size) : 1; + + err = hinic_set_rx_lro(nic_dev->hwdev, lro_en, lro_en, lro_wqe_num); + if (err) { + PMD_DRV_LOG(ERR, "%s %s lro failed, err: %d, max_lro_size: %d", + dev->data->name, lro_en ? "Enable" : "Disable", + err, max_lro_size); + goto set_rx_lro_err; + } + return 0; +set_rx_lro_err: rx_csum_ofl_err: rss_config_err: + hinic_destroy_num_qps(nic_dev); return HINIC_ERROR; } +static void hinic_rx_remove_lro(struct hinic_nic_dev *nic_dev) +{ + int err; + + err = hinic_set_rx_lro(nic_dev->hwdev, false, false, 0); + if (err) + PMD_DRV_LOG(ERR, "%s disable LRO failed", + nic_dev->proc_dev_name); +} + void hinic_rx_remove_configure(struct rte_eth_dev *dev) { struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); @@ -698,6 +729,8 @@ void hinic_rx_remove_configure(struct rte_eth_dev *dev) hinic_rss_deinit(nic_dev); hinic_destroy_num_qps(nic_dev); } + + hinic_rx_remove_lro(nic_dev); } void hinic_free_all_rx_mbufs(struct hinic_rxq *rxq) @@ -956,7 +989,7 @@ u16 hinic_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, u16 nb_pkts) volatile struct hinic_rq_cqe *rx_cqe; u16 rx_buf_len, pkts = 0; u16 sw_ci, ci_mask, wqebb_cnt = 0; - u32 pkt_len, status, vlan_len; + u32 pkt_len, status, vlan_len, lro_num; u64 rx_bytes = 0; struct hinic_rq_cqe cqe; u32 offload_type, rss_hash; @@ -1024,6 +1057,13 @@ u16 hinic_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, u16 nb_pkts) rxm->ol_flags |= hinic_rx_rss_hash(offload_type, rss_hash, &rxm->hash.rss); + /* lro offload */ + lro_num = HINIC_GET_RX_NUM_LRO(cqe.status); + if (unlikely(lro_num != 0)) { + rxm->ol_flags |= PKT_RX_LRO; + rxm->tso_segsz = pkt_len / lro_num; + } + /* 6. clear done bit */ rx_cqe->status = 0; -- 1.8.3.1