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 8D2ECA3160 for ; Thu, 10 Oct 2019 10:46:56 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0E8951E975; Thu, 10 Oct 2019 10:46:56 +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 4C9901E917 for ; Thu, 10 Oct 2019 10:46:55 +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-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 355E9140061; Thu, 10 Oct 2019 08:46:50 +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; Thu, 10 Oct 2019 09:46:44 +0100 To: , , John McNamara , Marko Kovacevic , Thomas Monjalon , Ferruh Yigit CC: References: <20191007065155.1756-1-pbhagavatula@marvell.com> <20191009153357.926-1-pbhagavatula@marvell.com> <20191009153357.926-2-pbhagavatula@marvell.com> From: Andrew Rybchenko Message-ID: <971d4132-d3c0-e139-d65a-5dfe1527325d@solarflare.com> Date: Thu, 10 Oct 2019 11:46:41 +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: <20191009153357.926-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-24966.003 X-TM-AS-Result: No-4.367000-8.000000-10 X-TMASE-MatchedRID: X4bcv0S75KnmLzc6AOD8DfHkpkyUphL9NV9S7O+u3KYRHgO3hlQeWerO SEJRBEaXSMM+7USIvyxMTh0cRVMQ694V9K8RueK0D3uYMxd01beNkCJU7Ne1c+ZAlRR6AIJ7eCN V1mMi/46MR3kDhegnTHzs73bFScRmeM8+fnna4pSCYB3gC22mf0tc8DbogbSE31GU/N5W5BAGXY vX9dFbnOI0hDwKbiCcf3m9ZmRc/ZHs7aQkqkpFyuE9BBUXDccU/qWl+m17jWHieGQLRIaTJIi6y FTH7VfQm+cP2QHSFAe8MOaGTOJX/dhG27sGev854h8r8l3l4eakWzNosmLtqVc/CedjlcvkLKiG E4quj61bPNi2+8Z5yAVTSIiQ7BOmy7mv6nWHz+yeAiCmPx4NwFkMvWAuahr8+gD2vYtOFhgqtq5 d3cxkNQgLHAeOmjfVf1OrPxx48Op31JK6M9mWIGFtmRQRMxeOl7pWNMgUTixpc45ijTldW4Resu DjlYOngW6w37rcsKObxliCewb58Eq+D/qldGfLBsRAh8WmTAcG2WAWHb2qekrMHC7kmmSWWgpFd CbsUfc= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--4.367000-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24966.003 X-MDID: 1570697214-6377ZsX7lqNm Subject: Re: [dpdk-dev] [PATCH v10 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/9/19 6:33 PM, 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 Sorry, but few nits below. [snip] > diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c > index 17d183e1f..349483707 100644 > --- a/lib/librte_ethdev/rte_ethdev.c > +++ b/lib/librte_ethdev/rte_ethdev.c > @@ -2602,6 +2602,90 @@ 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 valid_ptype_masks[] = { > + RTE_PTYPE_L2_MASK, > + RTE_PTYPE_L3_MASK, > + RTE_PTYPE_L4_MASK, > + RTE_PTYPE_TUNNEL_MASK, > + RTE_PTYPE_INNER_L2_MASK, > + RTE_PTYPE_INNER_L3_MASK, > + RTE_PTYPE_INNER_L4_MASK, > + }; > + const uint32_t *all_ptypes; > + 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; > + } > + > + for (i = 0; i < sizeof(valid_ptype_masks)/sizeof(valid_ptype_masks[0]); RTE_DIM should be used instead of sizeof/sizeof > + i++) { > + uint32_t mask = ptype_mask & valid_ptype_masks[i]; > + if (mask && mask != valid_ptype_masks[i]) { > + ret = -EINVAL; > + goto ptype_unknown; > + } > + } > + > + if (ptype_mask & ~RTE_PTYPE_ALL_MASK) { > + ret = -EINVAL; > + goto ptype_unknown; > + } It does not protect against more masks added in the future and lost in your list above but still used in request. It is better just add extra variable and remove bits from there while masks are checked in the loop. Then it should be checked here that the mask is 0 (no bits are left and everything is checked). > + > + 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]