From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-eopbgr770072.outbound.protection.outlook.com [40.107.77.72]) by dpdk.org (Postfix) with ESMTP id 1EC0A1B61F for ; Wed, 19 Dec 2018 01:42:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=y4NalseNh83ZUhsftnvej7LHv1jDMeaSgRs0ypCqlaQ=; b=CZC5lgSO0/MrDNFYM0/fWrt32VvnNm5vA7PQWpBoTkUiIxXkebsOrvL4OXLpCqdfBAma56DpPY6NGhKe15rulabXNXnjgxGEMtxN9JGAoMvhKmIB76BJQwcLeXMgiZL445p5DBxq4RPh0SPV4Hho8ixZLEpU7ViFi7MZx+o02Go= Received: from BYAPR07MB5365.namprd07.prod.outlook.com (20.177.125.18) by BYAPR07MB4311.namprd07.prod.outlook.com (52.135.223.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1425.22; Wed, 19 Dec 2018 00:42:41 +0000 Received: from BYAPR07MB5365.namprd07.prod.outlook.com ([fe80::514:ce1d:4236:9b9]) by BYAPR07MB5365.namprd07.prod.outlook.com ([fe80::514:ce1d:4236:9b9%3]) with mapi id 15.20.1425.021; Wed, 19 Dec 2018 00:42:41 +0000 From: "Mody, Rasesh" To: "stable@dpdk.org" CC: "Shaikh, Shahed" , "yskoh@mellanox.com" , Dept-Eng DPDK Dev Thread-Topic: [PATCH 17.11 3/5] net/qede: fix Rx buffer size calculation Thread-Index: AQHUlzO/uV011jKkhUGL9/qIksAVWQ== Date: Wed, 19 Dec 2018 00:42:41 +0000 Message-ID: <1545180127-3202-3-git-send-email-rasesh.mody@cavium.com> References: <1545180127-3202-1-git-send-email-rasesh.mody@cavium.com> In-Reply-To: <1545180127-3202-1-git-send-email-rasesh.mody@cavium.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: BYAPR05CA0098.namprd05.prod.outlook.com (2603:10b6:a03:e0::39) To BYAPR07MB5365.namprd07.prod.outlook.com (2603:10b6:a03:64::18) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Rasesh.Mody@cavium.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [198.186.1.5] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; BYAPR07MB4311; 6:NvIO6jsqM0LLPSpkoRdXOHsycuV3pdo5k2EYF6yO/W+0oWzaeWYtLi05+78zIMjLPETuVN5Y9E5WR/xomCWC62Sk/m/gF2Gxq92Lyh6o6ElULKtXvX+HzukleqAb+v9wWZs4mILA2ONO01BUdYqHNrWg1jbnIil+n5Wuk0B410tV5qho+8+XcChztaiFhXAYu+dJ+aSbH7AgqEJFUprF/QbVSQi6Lwb7rpxJnkrQM8VemAzoBvIk1dIyINbKAzYNF9FwkX9TJg2Vo/EVrUPCTympwxu9bmoLFAXy6UpJnniBi8ZTDOZK+H6OUr19KWup4wyq3iQrcONhXx7x45eT+zH4uAVvRvODsNB4I9fAsMgRtumiO5ft8e2vJ5Y6xmkLNVSPauU7pl/ox9qC33tJobB9gwpOxGtbrsuubfeH/AaTA1FglSXD7UbOXsvuQf47u1eAlqGpcTbdL0v/47geJQ==; 5:V9bOpioWCBlprczvjU/eU/hSf0kGRGgww8Kjq/U6DiJla77cAoGjPbRYtZrI1rTonc63sPZmpCI1yjNpE2uaM6nyhn4JpMTbnp4Xh+PSsLtup+3oo6v/sYhZb+G+dcZXZfchfJi3OVAU4udyRwZsmtu0C6ewQ0TMNFps6KwuzWs=; 7:lSEQWovG3FftQ4gJqHCp8C72k6BQVuhJoJb8SE0GqOtxgnuoUC7Cmj0CnnAYN0YaHRtid3BWZOYiqmv8xZ0pGGzjn6dACGqyuLjbp11BphYgC7KZSeNWZ7ZlpOzbtdkR5J6WP7cujrFygm0/IYl5qg== x-ms-office365-filtering-correlation-id: 1cefbf44-6118-462c-0c2b-08d6654ae1ad x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(2017052603328)(7153060)(7193020); SRVR:BYAPR07MB4311; x-ms-traffictypediagnostic: BYAPR07MB4311: x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(3230021)(999002)(6040522)(2401047)(5005006)(8121501046)(823302103)(3231475)(944501520)(52105112)(93006095)(93001095)(3002001)(10201501046)(148016)(149066)(150057)(6041310)(20161123562045)(20161123564045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(201708071742011)(7699051)(76991095); SRVR:BYAPR07MB4311; BCL:0; PCL:0; RULEID:; SRVR:BYAPR07MB4311; x-forefront-prvs: 0891BC3F3D x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(136003)(346002)(396003)(366004)(376002)(189003)(199004)(68736007)(6486002)(305945005)(6436002)(36756003)(25786009)(66066001)(72206003)(76176011)(99286004)(102836004)(7736002)(26005)(6506007)(386003)(71200400001)(71190400001)(256004)(14444005)(86362001)(478600001)(8936002)(316002)(2616005)(11346002)(8676002)(4326008)(476003)(81156014)(1730700003)(81166006)(107886003)(186003)(53936002)(54906003)(5640700003)(2501003)(97736004)(14454004)(6512007)(2351001)(6916009)(52116002)(2906002)(106356001)(105586002)(3846002)(446003)(5660300001)(6116002)(486006); DIR:OUT; SFP:1101; SCL:1; SRVR:BYAPR07MB4311; H:BYAPR07MB5365.namprd07.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: cHdYKjiLM1CRa6zKUKMTWqDqUYouLNugeESOOKodoTuLkhejtN+/OYjJbrN/ptlU+X9jv2xI87DdBmUbhzObzh5klQKAsRNnQZwxaBtGzi4S27XsCM/SuxUGNDPEv6IhkgzwijDjz4bBWgWZF53HrnVKRa1KyS8c8xUWaaBUMJKr+Ob86y75KVayJq+dxadTR7hlg/yEyEGZ0nsi1ygQl82yWj7UTopTaf8dW3YyUhJE8XOscvCQnp5jhlpQTBS/S4sQIdZ+wXh4AN7gdgYVzWj43Vah7sXQWHFqarT6GsphP2BJBBUd7yry/8EiFwwo spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1cefbf44-6118-462c-0c2b-08d6654ae1ad X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Dec 2018 00:42:41.3797 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR07MB4311 Subject: [dpdk-stable] [PATCH 17.11 3/5] net/qede: fix Rx buffer size calculation X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2018 00:42:43 -0000 From: Shahed Shaikh [ backported from upstream commit 318d7da3122bac04772418c5eda9f50fcd175d18 = ] - HW does not include CRC in received frame when passed to host, so no need to consider CRC length while calculating Rx buffer size. - In scattered Rx mode, driver may allocate Rx buffer larger than the size of mbuf because it tries to adjust the buffer size to cache line size by ceiling it. Fix this by flooring the size instead of ceiling. - Consider the rule imposed by HW regarding the minimum size of Rx buffer in scattered Rx mode - (MTU + Maximum L2 Header Size + 2) / ETH_RX_MAX_BUFF_PER_PKT Fixes: f6033f2497e7 ("net/qede: fix minimum buffer size and scatter Rx chec= k") Signed-off-by: Shahed Shaikh --- drivers/net/qede/qede_ethdev.c | 28 +++++++++---------- drivers/net/qede/qede_rxtx.c | 60 +++++++++++++++++++++++++++++++++++-= ---- drivers/net/qede/qede_rxtx.h | 15 ++++++++-- 3 files changed, 79 insertions(+), 24 deletions(-) diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.= c index 4a5e485..1844eea 100644 --- a/drivers/net/qede/qede_ethdev.c +++ b/drivers/net/qede/qede_ethdev.c @@ -1383,7 +1383,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth= _dev) if (eth_dev->data->dev_conf.rxmode.jumbo_frame) eth_dev->data->mtu =3D eth_dev->data->dev_conf.rxmode.max_rx_pkt_len - - ETHER_HDR_LEN - ETHER_CRC_LEN; + ETHER_HDR_LEN - QEDE_ETH_OVERHEAD; =20 if (qede_start_vport(qdev, eth_dev->data->mtu)) return -1; @@ -2377,19 +2377,18 @@ static int qede_set_mtu(struct rte_eth_dev *dev, ui= nt16_t mtu) struct qede_fastpath *fp; uint32_t max_rx_pkt_len; uint32_t frame_size; - uint16_t rx_buf_size; uint16_t bufsz; bool restart =3D false; - int i; + int i, rc; =20 PMD_INIT_FUNC_TRACE(edev); qede_dev_info_get(dev, &dev_info); - max_rx_pkt_len =3D mtu + ETHER_HDR_LEN + ETHER_CRC_LEN; - frame_size =3D max_rx_pkt_len + QEDE_ETH_OVERHEAD; + max_rx_pkt_len =3D mtu + QEDE_MAX_ETHER_HDR_LEN; + frame_size =3D max_rx_pkt_len; if ((mtu < ETHER_MIN_MTU) || (frame_size > dev_info.max_rx_pktlen)) { DP_ERR(edev, "MTU %u out of range, %u is maximum allowable\n", mtu, dev_info.max_rx_pktlen - ETHER_HDR_LEN - - ETHER_CRC_LEN - QEDE_ETH_OVERHEAD); + QEDE_ETH_OVERHEAD); return -EINVAL; } if (!dev->data->scattered_rx && @@ -2417,14 +2416,15 @@ static int qede_set_mtu(struct rte_eth_dev *dev, ui= nt16_t mtu) if (fp->rxq !=3D NULL) { bufsz =3D (uint16_t)rte_pktmbuf_data_room_size( fp->rxq->mb_pool) - RTE_PKTMBUF_HEADROOM; - if (dev->data->scattered_rx) - rx_buf_size =3D bufsz + ETHER_HDR_LEN + - ETHER_CRC_LEN + QEDE_ETH_OVERHEAD; - else - rx_buf_size =3D frame_size; - rx_buf_size =3D QEDE_CEIL_TO_CACHE_LINE_SIZE(rx_buf_size); - fp->rxq->rx_buf_size =3D rx_buf_size; - DP_INFO(edev, "RX buffer size %u\n", rx_buf_size); + /* cache align the mbuf size to simplfy rx_buf_size + * calculation + */ + bufsz =3D QEDE_FLOOR_TO_CACHE_LINE_SIZE(bufsz); + rc =3D qede_calc_rx_buf_size(dev, bufsz, frame_size); + if (rc < 0) + return rc; + + fp->rxq->rx_buf_size =3D rc; } } if (max_rx_pkt_len > ETHER_MAX_LEN) diff --git a/drivers/net/qede/qede_rxtx.c b/drivers/net/qede/qede_rxtx.c index c88182b..32eae81 100644 --- a/drivers/net/qede/qede_rxtx.c +++ b/drivers/net/qede/qede_rxtx.c @@ -37,6 +37,49 @@ static inline int qede_alloc_rx_buffer(struct qede_rx_qu= eue *rxq) return 0; } =20 +/* Criterias for calculating Rx buffer size - + * 1) rx_buf_size should not exceed the size of mbuf + * 2) In scattered_rx mode - minimum rx_buf_size should be + * (MTU + Maximum L2 Header Size + 2) / ETH_RX_MAX_BUFF_PER_PKT + * 3) In regular mode - minimum rx_buf_size should be + * (MTU + Maximum L2 Header Size + 2) + * In above cases +2 corrosponds to 2 bytes padding in front of L2 + * header. + * 4) rx_buf_size should be cacheline-size aligned. So considering + * criteria 1, we need to adjust the size to floor instead of ceil, + * so that we don't exceed mbuf size while ceiling rx_buf_size. + */ +int +qede_calc_rx_buf_size(struct rte_eth_dev *dev, uint16_t mbufsz, + uint16_t max_frame_size) +{ + struct qede_dev *qdev =3D QEDE_INIT_QDEV(dev); + struct ecore_dev *edev =3D QEDE_INIT_EDEV(qdev); + int rx_buf_size; + + if (dev->data->scattered_rx) { + /* per HW limitation, only ETH_RX_MAX_BUFF_PER_PKT number of + * bufferes can be used for single packet. So need to make sure + * mbuf size is sufficient enough for this. + */ + if ((mbufsz * ETH_RX_MAX_BUFF_PER_PKT) < + (max_frame_size + QEDE_ETH_OVERHEAD)) { + DP_ERR(edev, "mbuf %d size is not enough to hold max fragments (%d) for= max rx packet length (%d)\n", + mbufsz, ETH_RX_MAX_BUFF_PER_PKT, max_frame_size); + return -EINVAL; + } + + rx_buf_size =3D RTE_MAX(mbufsz, + (max_frame_size + QEDE_ETH_OVERHEAD) / + ETH_RX_MAX_BUFF_PER_PKT); + } else { + rx_buf_size =3D max_frame_size + QEDE_ETH_OVERHEAD; + } + + /* Align to cache-line size if needed */ + return QEDE_FLOOR_TO_CACHE_LINE_SIZE(rx_buf_size); +} + int qede_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, uint16_t nb_desc, unsigned int socket_id, @@ -87,6 +130,9 @@ static inline int qede_alloc_rx_buffer(struct qede_rx_qu= eue *rxq) =20 /* Fix up RX buffer size */ bufsz =3D (uint16_t)rte_pktmbuf_data_room_size(mp) - RTE_PKTMBUF_HEADROOM= ; + /* cache align the mbuf size to simplfy rx_buf_size calculation */ + bufsz =3D QEDE_FLOOR_TO_CACHE_LINE_SIZE(bufsz); + if ((rxmode->enable_scatter) || (max_rx_pkt_len + QEDE_ETH_OVERHEAD) > bufsz) { if (!dev->data->scattered_rx) { @@ -95,13 +141,13 @@ static inline int qede_alloc_rx_buffer(struct qede_rx_= queue *rxq) } } =20 - if (dev->data->scattered_rx) - rxq->rx_buf_size =3D bufsz + ETHER_HDR_LEN + - ETHER_CRC_LEN + QEDE_ETH_OVERHEAD; - else - rxq->rx_buf_size =3D max_rx_pkt_len + QEDE_ETH_OVERHEAD; - /* Align to cache-line size if needed */ - rxq->rx_buf_size =3D QEDE_CEIL_TO_CACHE_LINE_SIZE(rxq->rx_buf_size); + rc =3D qede_calc_rx_buf_size(dev, bufsz, max_rx_pkt_len); + if (rc < 0) { + rte_free(rxq); + return rc; + } + + rxq->rx_buf_size =3D rc; =20 DP_INFO(edev, "mtu %u mbufsz %u bd_max_bytes %u scatter_mode %d\n", qdev->mtu, bufsz, rxq->rx_buf_size, dev->data->scattered_rx); diff --git a/drivers/net/qede/qede_rxtx.h b/drivers/net/qede/qede_rxtx.h index 9db9fed..3ab1894 100644 --- a/drivers/net/qede/qede_rxtx.h +++ b/drivers/net/qede/qede_rxtx.h @@ -63,9 +63,16 @@ #define QEDE_FW_RX_ALIGN_END (1UL << QEDE_RX_ALIGN_SHIFT) #define QEDE_CEIL_TO_CACHE_LINE_SIZE(n) (((n) + (QEDE_FW_RX_ALIGN_END - 1)= ) & \ ~(QEDE_FW_RX_ALIGN_END - 1)) -/* Note: QEDE_LLC_SNAP_HDR_LEN is optional */ -#define QEDE_ETH_OVERHEAD (((2 * QEDE_VLAN_TAG_SIZE)) - (ETHER_CRC_LEN) \ - + (QEDE_LLC_SNAP_HDR_LEN)) +#define QEDE_FLOOR_TO_CACHE_LINE_SIZE(n) RTE_ALIGN_FLOOR(n, \ + QEDE_FW_RX_ALIGN_END) + +/* Note: QEDE_LLC_SNAP_HDR_LEN is optional, + * +2 is for padding in front of L2 header + */ +#define QEDE_ETH_OVERHEAD (((2 * QEDE_VLAN_TAG_SIZE)) \ + + (QEDE_LLC_SNAP_HDR_LEN) + 2) + +#define QEDE_MAX_ETHER_HDR_LEN (ETHER_HDR_LEN + QEDE_ETH_OVERHEAD) =20 #define QEDE_RSS_OFFLOAD_ALL (ETH_RSS_IPV4 |\ ETH_RSS_NONFRAG_IPV4_TCP |\ @@ -271,6 +278,8 @@ uint16_t qede_rxtx_pkts_dummy(void *p_rxq, int qede_start_queues(struct rte_eth_dev *eth_dev); =20 void qede_stop_queues(struct rte_eth_dev *eth_dev); +int qede_calc_rx_buf_size(struct rte_eth_dev *dev, uint16_t mbufsz, + uint16_t max_frame_size); =20 /* Fastpath resource alloc/dealloc helpers */ int qede_alloc_fp_resc(struct qede_dev *qdev); --=20 1.7.10.3