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 BDBFDA2F6B for ; Tue, 8 Oct 2019 16:49:01 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9DDEF1D41F; Tue, 8 Oct 2019 16:49:00 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id DF67D1D41E for ; Tue, 8 Oct 2019 16:48:59 +0200 (CEST) X-Virus-Scanned: Proofpoint Essentials engine Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us4.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 4BB61280064; Tue, 8 Oct 2019 14:48:57 +0000 (UTC) Received: from [192.168.38.17] (91.220.146.112) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Tue, 8 Oct 2019 15:48:50 +0100 To: , , John McNamara , Marko Kovacevic , Thomas Monjalon , Ferruh Yigit CC: References: <20191002213612.14207-1-pbhagavatula@marvell.com> <20191007065155.1756-1-pbhagavatula@marvell.com> <20191007065155.1756-2-pbhagavatula@marvell.com> From: Andrew Rybchenko Message-ID: Date: Tue, 8 Oct 2019 17:48:46 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 In-Reply-To: <20191007065155.1756-2-pbhagavatula@marvell.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-GB X-Originating-IP: [91.220.146.112] X-ClientProxiedBy: ocex03.SolarFlarecom.com (10.20.40.36) To ukex01.SolarFlarecom.com (10.17.10.4) X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.5.1010-24962.003 X-TM-AS-Result: No-4.160700-8.000000-10 X-TMASE-MatchedRID: 1GZI+iG+MtfmLzc6AOD8DfHkpkyUphL9NV9S7O+u3KYRHgO3hlQeWerO SEJRBEaXSMM+7USIvyxMTh0cRVMQ694V9K8RueK0D3uYMxd01beNkCJU7Ne1c+ZAlRR6AIJ7eCN V1mMi/46MR3kDhegnTHzs73bFScRmEFsmtML8W8o/ApMPW/xhXkyQ5fRSh265/mPRuTZTxSfwb+ wbv5zoMjcIRtUfBaJiYfaEXjQ0qYLUDI+BZ5zYhgw5bFG3LCD6ujqXQnLbwyonggjh3P8Op5im4 buSmgpH8HS8XCHNLzGDHEtwREc5S1g5J3cVtfmul5kyBojDTg6V+/sMLnZk4SS30GKAkBxWr8GK ZiBUhMbnzlXMYw4XMAGLeSok4rrZC24oEZ6SpSmcfuxsiY4QFHQt64N5X98n5XKfI3GSu/bd16/ WnDIh0mFHscsPpLkwiUsRi/2rspNIXFHiX6Z4oQfPL/9Rt54K1GiDURXRVaPnBkFSBoNjUofMZM egLDIeGU0pKnas+RbnCJftFZkZizYJYNFU00e7YDttQUGqHZU= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--4.160700-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24962.003 X-MDID: 1570546139-y7Xycg8wk3YS Subject: Re: [dpdk-dev] [PATCH v9 1/7] ethdev: add set ptype function 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" On 10/7/19 9:51 AM, pbhagavatula@marvell.com wrote: > From: Pavan Nikhilesh > > Add `rte_eth_dev_set_supported_ptypes` function that will allow the > application to inform the PMD the packet types it is interested in. > Based on the ptypes set PMDs can optimize their Rx path. > > -If application doesn’t want any ptype information it can call > `rte_eth_dev_set_supported_ptypes(ethdev_id, RTE_PTYPE_UNKNOWN, NULL, 0)` > and PMD may skip packet type processing and set rte_mbuf::packet_type to > RTE_PTYPE_UNKNOWN. > > -If application doesn’t call `rte_eth_dev_set_supported_ptypes` PMD can > return `rte_mbuf::packet_type` with `rte_eth_dev_get_supported_ptypes`. > > -If application is interested only in L2/L3 layer, it can inform the PMD > to update `rte_mbuf::packet_type` with L2/L3 ptype by calling > `rte_eth_dev_set_supported_ptypes(ethdev_id, > RTE_PTYPE_L2_MASK | RTE_PTYPE_L3_MASK, NULL, 0)`. > > Suggested-by: Konstantin Ananyev > Signed-off-by: Pavan Nikhilesh > Reviewed-by: Andrew Rybchenko Looks good except one thing below. [snip] > diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c > index 17d183e1f..d2561272c 100644 > --- a/lib/librte_ethdev/rte_ethdev.c > +++ b/lib/librte_ethdev/rte_ethdev.c > @@ -2602,6 +2602,79 @@ rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask, > return j; > } > > +int > +rte_eth_dev_set_supported_ptypes(uint16_t port_id, uint32_t ptype_mask, > + uint32_t *set_ptypes, unsigned int num) > +{ > + const uint32_t *all_ptypes; > + uint32_t test_ptype_mask; > + struct rte_eth_dev *dev; > + unsigned int i, j; > + int ret; > + > + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); > + dev = &rte_eth_devices[port_id]; > + > + if (num > 0 && set_ptypes == NULL) > + return -EINVAL; > + > + if (*dev->dev_ops->dev_supported_ptypes_get == NULL || > + *dev->dev_ops->dev_supported_ptypes_set == NULL) { > + ret = 0; > + goto ptype_unknown; > + } > + > + if (ptype_mask == 0) { > + ret = (*dev->dev_ops->dev_supported_ptypes_set)(dev, > + ptype_mask); > + goto ptype_unknown; > + } > + > + test_ptype_mask = ptype_mask; > + while (test_ptype_mask) { > + uint8_t mask = test_ptype_mask & RTE_PTYPE_L2_MASK; > + > + if (mask && (mask != RTE_PTYPE_L2_MASK)) { > + ret = -EINVAL; > + goto ptype_unknown; > + } > + test_ptype_mask >>= __builtin_popcount(RTE_PTYPE_L2_MASK); It heavily relies on current MASK values - 4 bits in each mask one by one. IMO const array of all supported masks is less evil here. Plus it should be checked that no set bits remain when all masks are removed. > + } > + > + all_ptypes = (*dev->dev_ops->dev_supported_ptypes_get)(dev); > + if (all_ptypes == NULL) { > + ret = 0; > + goto ptype_unknown; > + } > + > + /* > + * Accodommodate as many set_ptypes as possible. If the supplied > + * set_ptypes array is insufficient fill it partially. > + */ > + for (i = 0, j = 0; set_ptypes != NULL && > + (all_ptypes[i] != RTE_PTYPE_UNKNOWN); ++i) { > + if (ptype_mask & all_ptypes[i]) { > + if (j < num - 1) { > + set_ptypes[j] = all_ptypes[i]; > + j++; > + continue; > + } > + break; > + } > + } > + > + if (set_ptypes != NULL && j < num) > + set_ptypes[j] = RTE_PTYPE_UNKNOWN; > + > + return (*dev->dev_ops->dev_supported_ptypes_set)(dev, ptype_mask); > + > +ptype_unknown: > + if (num > 0) > + set_ptypes[0] = RTE_PTYPE_UNKNOWN; > + > + return ret; > +} > + > void > rte_eth_macaddr_get(uint16_t port_id, struct rte_ether_addr *mac_addr) > { [snip]