From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 35F9AA0352; Tue, 25 Jan 2022 18:34:54 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B534541165; Tue, 25 Jan 2022 18:34:53 +0100 (CET) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id B452141161 for ; Tue, 25 Jan 2022 18:34:51 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643132091; x=1674668091; h=message-id:date:to:cc:references:from:subject: in-reply-to:content-transfer-encoding:mime-version; bh=w47goSflhwMlq6GCAGQSMBnw6F9yU/GViAgdPXqLvlc=; b=caKhhVea4NeWr5VC5glCSFKNJEoD+muW9pgLyv16sw2bOinHdI1ifEtE uJYXX+aJSRmldlYGq7MX2ADveDPqHjXmGzBJ5EAMqvsvl36PM45GyH1mD pDMyC/54xVN/+X2hvQmCUl0lMB9KQkkWxarwMIRrxiKGUt6Fj6r+wKmP5 xVcVtSbdcgUFcQO8DtIPeH8qg56TOtHXaBrE6sn21IB1xV2E9t9twx9Fw Oo2nqG4AaY0Xlb5ZhucT68a2EW1wqUs+pha4vfErDPEDspg73PTaTPnvP GaWgIznVwPQjSPVu8qbsJ8Vg86pCbNBX6e+fLIzhNgl1ntjl7Ktgdhb13 Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10237"; a="270807182" X-IronPort-AV: E=Sophos;i="5.88,315,1635231600"; d="scan'208";a="270807182" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 09:34:50 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,315,1635231600"; d="scan'208";a="520467444" Received: from fmsmsx606.amr.corp.intel.com ([10.18.126.86]) by orsmga007.jf.intel.com with ESMTP; 25 Jan 2022 09:34:48 -0800 Received: from fmsmsx611.amr.corp.intel.com (10.18.126.91) by fmsmsx606.amr.corp.intel.com (10.18.126.86) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.20; Tue, 25 Jan 2022 09:34:47 -0800 Received: from fmsedg602.ED.cps.intel.com (10.1.192.136) by fmsmsx611.amr.corp.intel.com (10.18.126.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.20 via Frontend Transport; Tue, 25 Jan 2022 09:34:47 -0800 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (104.47.55.109) by edgegateway.intel.com (192.55.55.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2308.20; Tue, 25 Jan 2022 09:34:46 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OxVhqUlDcbkVDzBpwJhbOUehSG82++Bcblt78IerxpfCDKLWYN51W4ULLdX5QNnjd41sm+1WWEmL8xcCm9CVoZ9ZvGuT4x5XSnssbgiPMcxpb6FWx0TunNFG4BYjj7G/PJay+5aO4NwDqwR3GAFDdU1/NWdY0pK/XH70DrN2imig0MV+EmKFFqintKUmj8Doog0iw3Cp2foIbOptZ268wRc2I7/WuHkT57ThT7Ec0Jh1mu+xg+rrtoySTj+cF2/a+F5GYdXrQkpISH/RxNzkn+Rqy3Q/dN8YbIzNmZL4HEsafvTs14yFclEDdQbSk5f2SgyC84FVXfpecZ2O8IvkNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dVAKhE4+dYit7Rcli8AHX5guLG99COWYUSq0LfSHSHI=; b=laj40EZ9XRYB6KOWOu6u01PZfhsyyCWy1dpNj1AzRRBdXa5LrnngLpenBy41Wf7uRXhX9DDq87dIvEjfT7sYvFp2Q4D1E/CnBNAhb8/w4l5w7pBNS2UuD4yk8cXpxvDPmpGfcb6CNePT/TgOLkJUJrfHPyhIO9yh9B96ma4eBTO5gMs2CESfUzMBXH9NBmSmSUqqmAAKiVBTfcibOinbOuylDDO1VRAKNFyMpjDQqBGDDrk5J37DJroce+3eEKLH9m69H7IkW2Ijk5nCR1gyW121A8somODAMT4dyJ6Zx7iJKqTDPLEC6wUStNKlrc1srpqYYyazmJH+LzdlSTfalA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from SJ0PR11MB5005.namprd11.prod.outlook.com (2603:10b6:a03:2d3::21) by DM5PR11MB1835.namprd11.prod.outlook.com (2603:10b6:3:114::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4909.8; Tue, 25 Jan 2022 17:34:41 +0000 Received: from SJ0PR11MB5005.namprd11.prod.outlook.com ([fe80::5097:78f8:816f:f243]) by SJ0PR11MB5005.namprd11.prod.outlook.com ([fe80::5097:78f8:816f:f243%6]) with mapi id 15.20.4930.015; Tue, 25 Jan 2022 17:34:41 +0000 Message-ID: <000cbfe1-9d91-3011-4cf9-56dbeebcebb6@intel.com> Date: Tue, 25 Jan 2022 17:34:25 +0000 Content-Language: en-US To: , , Ray Kinsella , "Thomas Monjalon" , Andrew Rybchenko CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , References: <20220109105851.734687-1-skori@marvell.com> <20220113102718.3167282-1-jerinj@marvell.com> From: Ferruh Yigit Subject: Re: [dpdk-dev] [PATCH v2 1/2] ethdev: support queue-based priority flow control X-User: ferruhy In-Reply-To: <20220113102718.3167282-1-jerinj@marvell.com> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: LO2P265CA0496.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:13a::21) To SJ0PR11MB5005.namprd11.prod.outlook.com (2603:10b6:a03:2d3::21) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 8ca4ab1f-9ae6-42dd-723e-08d9e028f7a3 X-MS-TrafficTypeDiagnostic: DM5PR11MB1835:EE_ X-LD-Processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6430; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: lSAdZISz852cWJyHEAWkfJtMOeSBg/hoZYcCN0zKXZrW3ikiKv6YE1Xtt8xDRooumLttcwj0pex+cFBUB1v+6wE3ZN2xxC9mG8RgJWqsyBEjRz8p/G1ID6oh5EsqA1ejYam8kSeoqjyzuXYciOa5CPXNp0cCdy3jbJKyNEG8Xk3NiA2BY4kHDkv5OIf5J9n6M/21MaqafK6oeBzYu9eLUQHDYjiZK9mmj4oX3ygPA2E+LMRJMVMiRc+mphCG7K87DpMm/Z95VHNcj3h2DNgYoHJ7Io7QYcDJMXRQ8iFXHFZJRlX8asQScBOFxJA/gaHZhqmalDGRAg/NUe6kiJJhnlQpMBmffdi1wyN55VoVohvjmVDNYW0YFsXB16w+v55L40C6DBcmmegfeL+PiAvM5po/aLwQPaTmbT9H31RKGG0fhIKIsizKafo4mM5YhzZ/3rlZrEMNDb/ihpwVeY5q8yLpd9QUs1j52/wm7hH1W+ui/+rAW6KwamK/01ChbbxCiIYKkUxQ0EE/L5bPxWe8kj86Vk9gQDTVzX4PZWZTiTF6iPcxNrll4PjNlb7R/D2l105IDu0eWM8KGMb6BntAsGNsYqFOfdqYSxcIlkQd6sQMfPPzl4aQyBa/6lfYBYwD8p2DqlE/lrgrrcbWVs5/8vOOH4jFRB056o1dH/6I64bBkI453PrmpyZ53KpwbmkN79RlK70126EOMvDUchh20xELZzUmtnHFoL3f1DzHGxgllAGW2gCzGWBhGwG1VchH1oSGNvGWM+mocUdJxB1w03M9oZqoTQPczcR2gNETNr4= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR11MB5005.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(366004)(83380400001)(66476007)(966005)(66556008)(66946007)(4326008)(186003)(36756003)(6512007)(38100700002)(8676002)(6666004)(2906002)(82960400001)(26005)(6486002)(8936002)(5660300002)(44832011)(86362001)(508600001)(31686004)(6506007)(31696002)(110136005)(316002)(30864003)(53546011)(7416002)(2616005)(7366002)(7406005)(45980500001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Sm1udmJKQnpBQjFqOFNZZ1VYK2FTNzUwSGNKUmg0aFprZWVKd0xJK2JaYUpo?= =?utf-8?B?NnZOTXJubitaMGdZMEtCT0NjQWdPV293cDVKNHMwVHhobDhDM2lyWnF2Sjcr?= =?utf-8?B?cXVYTlp2VWs3TTJybVMzS09iQVpKRnRXSjdWL1NpUUNvZWViR1N2V2lPVHBW?= =?utf-8?B?SUtLMVRWYXRWb1BkZ3B3L3ZRSFpMdkxZT21ZWTFKZ21jMVBlSUViajBsbFhs?= =?utf-8?B?VFc1dldob0JLMVNyNGp4bjBuc1FXOElyelZMK08vRDgzRXJIRmhwSlAvdUZs?= =?utf-8?B?ckdsRmVRRGNrbzJzdmdwSmQ1ZFB3MURWVHFUWUZ6YnB4WG5GMm5BcVMzeVA4?= =?utf-8?B?bjhHSVA5Q1VCZmY1SnlYRlNFZmpCQnFvQzBEUDVyYjl1MGhsNENidk5tclBF?= =?utf-8?B?bGhBL1dLVmZYT0twMTVPQzdXTXNsSTVZSENsTzF1bkhkWGtTVjRaYjhsKzBH?= =?utf-8?B?MXJZZE1LOElTeEc0cGpKN3hSbVp6R0VSQktqMW5JeVRvemxmdFY5a0tLa0Q2?= =?utf-8?B?TnVMSDk5bDZ1dzJIM0grRW5QSXdTNVVJVURoem5PWG1OMWYvR0pvYllWdkhu?= =?utf-8?B?UnhpTXAzL3RsVEIxL3BldVpqU25xcEovTnF6UW1ZemlGdWJsK0J2a3kwb2NC?= =?utf-8?B?ZUtEbGhDazZMUTZJQkZ1bWd4TVkrME12dXFLVU9JRDF4N0pFYjBYQ29iQ2tZ?= =?utf-8?B?Mm1wdWdoSUpDdTdCamU1c3ZMU2tJTGl3Q0hpRTFRSzZUamRBNWw5K1l2bFZv?= =?utf-8?B?dU9tUE5xc0pYSlM3R2ZveXd2UFhkdW9LNit6MVAvbmRrc0xKU3ZaSVpZYzlJ?= =?utf-8?B?bHNpbWxDV2NBV1NONzZkaWdMb1QzZkdjZ2N1REt6K2lUMDBSNzUvODEzWEsz?= =?utf-8?B?Rzd5TEd2WHMwVk0vRjNwMitFQThVTDNIT25sYlFhSVh5TDNxWm9PWkx0Z0p6?= =?utf-8?B?a1pXNTB5Q0dnUEx1UjVjSWF1d1duM3R0MG02R1crNko0S1ZpcTRzaFRoWTlU?= =?utf-8?B?MnhmK2hVcWo3Y2dSRHZKV2p2T0lrZkkveDlvZjE1UWpNQm5FUkkzckk2cVdV?= =?utf-8?B?NllSZFJ2MXg0bHdDQ1h0SXoxOHl4c0xXT3lLVDMrMi9xZkp2TjIxbStsbytp?= =?utf-8?B?OWkva2ZVMTg2LzVaS2hURVhBcU9NUElsK1BpN2xudlI4YU80ckVFRHZ2ZUhL?= =?utf-8?B?VHVwUkFQWVhyVWZJeFZpOGV1T1FBSUYxOGFhaTl4T1l1Y0hIU3pKSTlUQm5i?= =?utf-8?B?RTZER1JGcWVHWEdJdkhCdWZweEF3TXlWYTRzek4ydksvK0xvb0VIbFNNc3cy?= =?utf-8?B?alJpODExcU02WFcyYWNCWUlCdytobEk1L3dzTUgxczBZVHd0OVVlTDNlbnNR?= =?utf-8?B?S0NhV2wxM1hvSmJGUGpNZkg4ZHFtVk1JZ0lTQzZZNG9VRUNkMktsVWlqYTJM?= =?utf-8?B?SHUxb0Z0ZktKc0RQbE9hL2hjTTZpNFpyTUw1NXl6QjJwa2taL3lycGxqVFo0?= =?utf-8?B?ZExqQmY5VW50K3puMzRmTHBqcWhkek9aZVBIY2g1d3RweWtMaFluanZNb0tJ?= =?utf-8?B?YnBCQkZCNFVxQmtuWGZPRnhING42b09wODRSUUlndEVYYnhaUG9XTitBM1hn?= =?utf-8?B?cjB5dzBBK2kyaU1KeFNJZFFyM0lyVGptbC9OZ0VpSHhvcWJWaDVpRTBqVkNO?= =?utf-8?B?VTFEcjNQRStITWZXckRkZXoxQTM3RUdOUFVFNFErZUh5MFQ3WWRtRllaZ3NI?= =?utf-8?B?VDRzc3kxZ2xEaWlJeno3NXhudXM4WnRqR0Y0Z0lzQnFoYkhBV2s0dGtwMlhm?= =?utf-8?B?SEE4YnhvR3lsek4xbEtCdURMdjRkcGpjbTNTS1psbzRyaWxQTXdweXdTSjRz?= =?utf-8?B?UTNYc0NSU3BhKzhNSTJyRFB6dEdCOUJ4Q2NPRlFPMkNJczZRamo1c0hweity?= =?utf-8?B?M3QzQzJqSTQvYXBYcjNhTnVBelZBOU5zR0NOQlV4VU8raEx1ektUQmJFaHZm?= =?utf-8?B?K0ZZdnVQR251Q1RkTUdJemFIajJaN1AycHZMZERUbWMwdFkwb2ZETTJJT3Zx?= =?utf-8?B?NmpPSGlURjZIeWZScHkzaFUxOWVMenpybDg3blYvZmt2MWZIcnRSaFVvcmk0?= =?utf-8?B?endUemR5dmozRFlzRzJBaHdZTmxyNHFjTjFwNVUwYmJCc0djQU03d0pCSnE0?= =?utf-8?Q?fZaho1i/FFUjG3okEfurXnA=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: 8ca4ab1f-9ae6-42dd-723e-08d9e028f7a3 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR11MB5005.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Jan 2022 17:34:41.0628 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 3oz4QzubBvC98Lr4J5v0orEn2k2+yBT6mXQeOU/uazvfneSKfIdmVsPk6yXIdwl1XJuVIJObMGa1X3cdi43KAQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR11MB1835 X-OriginatorOrg: intel.com X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On 1/13/2022 10:27 AM, jerinj@marvell.com wrote: > From: Jerin Jacob > > Based on device support and use-case need, there are two different ways > to enable PFC. The first case is the port level PFC configuration, in > this case, rte_eth_dev_priority_flow_ctrl_set() API shall be used to > configure the PFC, and PFC frames will be generated using based on VLAN > TC value. > > The second case is the queue level PFC configuration, in this > case, Any packet field content can be used to steer the packet to the > specific queue using rte_flow or RSS and then use > rte_eth_dev_priority_flow_ctrl_queue_set() to set the TC mapping on each > queue. Based on congestion selected on the specific queue, configured TC > shall be used to generate PFC frames. > > Operation of these modes are mutually exclusive, when driver sets > non zero value for rte_eth_dev_info::pfc_queue_tc_max, > application must use queue level PFC configuration via > rte_eth_dev_priority_flow_ctrl_queue_set() API instead of port level > PFC configuration via rte_eth_dev_priority_flow_ctrl_set() API to > realize PFC configuration. > > This patch enables the configuration for second case a.k.a queue > based PFC also updates rte_eth_dev_priority_flow_ctrl_set() > implmentaion to adheher to rte_eth_dev_info::pfc_queue_tc_max > handling. > > Also updated libabigail.abignore to ignore the update > to reserved fields in rte_eth_dev_info. > > Signed-off-by: Jerin Jacob > Signed-off-by: Sunil Kumar Kori > --- > > A driver implemtion based on this API is at > https://patches.dpdk.org/project/dpdk/patch/20220111081831.881374-1-skori@marvell.com/ > > RFC..v1 > - Added queue based PFC config API instead port based > > v1..v2 > - Updated libabigail.ignore as > has_data_member_inserted_between = {offset_of(reserved_64s), end} > - Updated doxygen comments of rte_eth_pfc_queue_conf > > > devtools/libabigail.abignore | 5 ++ > doc/guides/nics/features.rst | 5 +- > doc/guides/rel_notes/release_22_03.rst | 3 + > lib/ethdev/ethdev_driver.h | 6 +- > lib/ethdev/rte_ethdev.c | 109 +++++++++++++++++++++++++ > lib/ethdev/rte_ethdev.h | 83 ++++++++++++++++++- > lib/ethdev/version.map | 3 + > 7 files changed, 208 insertions(+), 6 deletions(-) > > diff --git a/devtools/libabigail.abignore b/devtools/libabigail.abignore > index 4b676f317d..3bdecaaef0 100644 > --- a/devtools/libabigail.abignore > +++ b/devtools/libabigail.abignore > @@ -11,3 +11,8 @@ > ; Ignore generated PMD information strings > [suppress_variable] > name_regexp = _pmd_info$ > + > +;Ignore fields inserted in place of reserved fields of rte_eth_dev_info > +[suppress_type] > + name = rte_eth_dev_info > + has_data_member_inserted_between = {offset_of(reserved_64s), end} > diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst > index 27be2d2576..277a784f4e 100644 > --- a/doc/guides/nics/features.rst > +++ b/doc/guides/nics/features.rst > @@ -379,9 +379,10 @@ Flow control > Supports configuring link flow control. > > * **[implements] eth_dev_ops**: ``flow_ctrl_get``, ``flow_ctrl_set``, > - ``priority_flow_ctrl_set``. > + ``priority_flow_ctrl_set``, ``priority_flow_ctrl_queue_set``. > * **[related] API**: ``rte_eth_dev_flow_ctrl_get()``, ``rte_eth_dev_flow_ctrl_set()``, > - ``rte_eth_dev_priority_flow_ctrl_set()``. > + ``rte_eth_dev_priority_flow_ctrl_set()``, ``rte_eth_dev_priority_flow_ctrl_queue_set()``. > +* **[provides] rte_eth_dev_info**: ``pfc_queue_tc_max``. > > > .. _nic_features_rate_limitation: > diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst > index 6d99d1eaa9..b75c0356e6 100644 > --- a/doc/guides/rel_notes/release_22_03.rst > +++ b/doc/guides/rel_notes/release_22_03.rst > @@ -55,6 +55,9 @@ New Features > Also, make sure to start the actual text at the margin. > ======================================================= > > +* **Added an API to enable queue based priority flow ctrl(PFC).** > + > + A new API, ``rte_eth_dev_priority_flow_ctrl_queue_set()``, was added. > > Removed Items > ------------- > diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h > index d95605a355..e0bbfe89d7 100644 > --- a/lib/ethdev/ethdev_driver.h > +++ b/lib/ethdev/ethdev_driver.h > @@ -532,6 +532,9 @@ typedef int (*flow_ctrl_set_t)(struct rte_eth_dev *dev, > /** @internal Setup priority flow control parameter on an Ethernet device. */ > typedef int (*priority_flow_ctrl_set_t)(struct rte_eth_dev *dev, > struct rte_eth_pfc_conf *pfc_conf); > +/** @internal Queue setup for priority flow control parameter on an Ethernet device. */ > +typedef int (*priority_flow_ctrl_queue_set_t)(struct rte_eth_dev *dev, > + struct rte_eth_pfc_queue_conf *pfc_queue_conf); > > /** @internal Update RSS redirection table on an Ethernet device. */ > typedef int (*reta_update_t)(struct rte_eth_dev *dev, > @@ -1080,7 +1083,8 @@ struct eth_dev_ops { > flow_ctrl_set_t flow_ctrl_set; /**< Setup flow control */ > /** Setup priority flow control */ > priority_flow_ctrl_set_t priority_flow_ctrl_set; > - > + /** Priority flow control queue setup */ > + priority_flow_ctrl_queue_set_t priority_flow_ctrl_queue_set; > /** Set Unicast Table Array */ > eth_uc_hash_table_set_t uc_hash_table_set; > /** Set Unicast hash bitmap */ > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > index a1d475a292..6def057720 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -3998,7 +3998,9 @@ int > rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id, > struct rte_eth_pfc_conf *pfc_conf) > { > + struct rte_eth_dev_info dev_info; > struct rte_eth_dev *dev; > + int ret; > > RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); > dev = &rte_eth_devices[port_id]; > @@ -4010,6 +4012,17 @@ rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id, > return -EINVAL; > } > > + ret = rte_eth_dev_info_get(port_id, &dev_info); > + if (ret != 0) > + return ret; > + > + if (dev_info.pfc_queue_tc_max != 0) { > + RTE_ETHDEV_LOG(ERR, > + "Ethdev port %u driver does not support port level PFC config\n", > + port_id); > + return -ENOTSUP; > + } > + > if (pfc_conf->priority > (RTE_ETH_DCB_NUM_USER_PRIORITIES - 1)) { > RTE_ETHDEV_LOG(ERR, "Invalid priority, only 0-7 allowed\n"); > return -EINVAL; > @@ -4022,6 +4035,102 @@ rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id, > return -ENOTSUP; > } > > +static inline int > +validate_rx_pause_config(struct rte_eth_dev_info *dev_info, > + struct rte_eth_pfc_queue_conf *pfc_queue_conf) > +{ > + if ((pfc_queue_conf->mode == RTE_ETH_FC_RX_PAUSE) || > + (pfc_queue_conf->mode == RTE_ETH_FC_FULL)) { > + if (pfc_queue_conf->rx_pause.tx_qid >= dev_info->nb_tx_queues) { > + RTE_ETHDEV_LOG(ERR, "Tx queue not in range for Rx pause" > + " (requested: %d configured: %d)\n", > + pfc_queue_conf->rx_pause.tx_qid, > + dev_info->nb_tx_queues); > + return -EINVAL; > + } > + > + if (pfc_queue_conf->rx_pause.tc >= dev_info->pfc_queue_tc_max) { > + RTE_ETHDEV_LOG(ERR, "TC not in range for Rx pause" > + " (requested: %d max: %d)\n", > + pfc_queue_conf->rx_pause.tc, > + dev_info->pfc_queue_tc_max); > + return -EINVAL; > + } > + } > + > + return 0; > +} > + > +static inline int > +validate_tx_pause_config(struct rte_eth_dev_info *dev_info, > + struct rte_eth_pfc_queue_conf *pfc_queue_conf) > +{ > + if ((pfc_queue_conf->mode == RTE_ETH_FC_TX_PAUSE) || > + (pfc_queue_conf->mode == RTE_ETH_FC_FULL)) { > + if (pfc_queue_conf->tx_pause.rx_qid >= dev_info->nb_rx_queues) { > + RTE_ETHDEV_LOG(ERR, "Rx queue not in range for Tx pause" > + "(requested: %d configured: %d)\n", > + pfc_queue_conf->tx_pause.rx_qid, > + dev_info->nb_rx_queues); > + return -EINVAL; > + } > + > + if (pfc_queue_conf->tx_pause.tc >= dev_info->pfc_queue_tc_max) { > + RTE_ETHDEV_LOG(ERR, "TC not in range for Tx pause" > + "(requested: %d max: %d)\n", > + pfc_queue_conf->tx_pause.tc, > + dev_info->pfc_queue_tc_max); > + return -EINVAL; > + } > + } > + > + return 0; > +} > + > +int > +rte_eth_dev_priority_flow_ctrl_queue_set( > + uint16_t port_id, struct rte_eth_pfc_queue_conf *pfc_queue_conf) > +{ > + struct rte_eth_dev_info dev_info; > + struct rte_eth_dev *dev; > + int ret; > + > + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); > + dev = &rte_eth_devices[port_id]; > + > + if (pfc_queue_conf == NULL) { > + RTE_ETHDEV_LOG(ERR, "PFC parameters are NULL for port (%u)\n", > + port_id); > + return -EINVAL; > + } > + > + ret = rte_eth_dev_info_get(port_id, &dev_info); > + if (ret != 0) > + return ret; > + > + if (dev_info.pfc_queue_tc_max == 0) { > + RTE_ETHDEV_LOG(ERR, > + "Ethdev port %u does not support PFC TC values\n", > + port_id); > + return -ENOTSUP; > + } > + > + ret = validate_rx_pause_config(&dev_info, pfc_queue_conf); > + if (ret != 0) > + return ret; > + > + ret = validate_tx_pause_config(&dev_info, pfc_queue_conf); > + if (ret != 0) > + return ret; > + > + > + if (*dev->dev_ops->priority_flow_ctrl_queue_set) > + return eth_err(port_id, > + (*dev->dev_ops->priority_flow_ctrl_queue_set)( > + dev, pfc_queue_conf)); > + return -ENOTSUP; > +} > + > static int > eth_check_reta_mask(struct rte_eth_rss_reta_entry64 *reta_conf, > uint16_t reta_size) > diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h > index fa299c8ad7..33e43f6e1d 100644 > --- a/lib/ethdev/rte_ethdev.h > +++ b/lib/ethdev/rte_ethdev.h > @@ -1395,6 +1395,28 @@ struct rte_eth_pfc_conf { > uint8_t priority; /**< VLAN User Priority. */ > }; > > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice > + * > + * A structure used to configure Ethernet priority flow control parameter for > + * ethdev queues. > + */ > +struct rte_eth_pfc_queue_conf { > + enum rte_eth_fc_mode mode; /**< Link flow control mode */ > + > + struct { > + uint16_t tx_qid; /**< Tx queue ID */ > + uint8_t tc; /**< Traffic class as per PFC (802.1Qbb) spec */ > + } rx_pause; /* Valid when (mode == FC_RX_PAUSE || mode == FC_FULL) */ > + > + struct { > + uint16_t pause_time; /**< Pause quota in the Pause frame */ > + uint16_t rx_qid; /**< Rx queue ID */ > + uint8_t tc; /**< Traffic class as per PFC (802.1Qbb) spec */ > + } tx_pause; /* Valid when (mode == FC_TX_PAUSE || mode == FC_FULL) */ > +}; > + > /** > * Tunnel type for device-specific classifier configuration. > * @see rte_eth_udp_tunnel > @@ -1841,8 +1863,30 @@ struct rte_eth_dev_info { > * embedded managed interconnect/switch. > */ > struct rte_eth_switch_info switch_info; > - > - uint64_t reserved_64s[2]; /**< Reserved for future fields */ > + /** > + * Maximum supported traffic class as per PFC (802.1Qbb) specification. > + * > + * Based on device support and use-case need, there are two different > + * ways to enable PFC. The first case is the port level PFC > + * configuration, in this case, rte_eth_dev_priority_flow_ctrl_set() > + * API shall be used to configure the PFC, and PFC frames will be > + * generated using based on VLAN TC value. > + * The second case is the queue level PFC configuration, in this case, > + * Any packet field content can be used to steer the packet to the > + * specific queue using rte_flow or RSS and then use > + * rte_eth_dev_priority_flow_ctrl_queue_set() to set the TC mapping > + * on each queue. Based on congestion selected on the specific queue, > + * configured TC shall be used to generate PFC frames. > + * > + * When set to non zero value, application must use queue level > + * PFC configuration via rte_eth_dev_priority_flow_ctrl_queue_set() API > + * instead of port level PFC configuration via > + * rte_eth_dev_priority_flow_ctrl_set() API to realize > + * PFC configuration. > + */ > + uint8_t pfc_queue_tc_max; 'rte_eth_dev_info_get()' is one of the APIs that anyone using ethdev needs to use. Instead of expanding it with less used features, what do you think to have a specific API to get the 'pfc_queue_tc_max'? It also can be used by application to detect queue based PFC is supported by driver or not. Assume API is 'rte_eth_dev_priority_flow_ctrl_get()', if it returns '-ENOTSUP' application can know that PMD doesn't support queue based PFC. > + uint8_t reserved_8s[7]; > + uint64_t reserved_64s[1]; /**< Reserved for future fields */ > void *reserved_ptrs[2]; /**< Reserved for future fields */ > }; > > @@ -4109,6 +4153,9 @@ int rte_eth_dev_flow_ctrl_set(uint16_t port_id, > * Configure the Ethernet priority flow control under DCB environment > * for Ethernet device. > * > + * @see struct rte_eth_dev_info::pfc_queue_tc_max priority > + * flow control usage models. > + * > * @param port_id > * The port identifier of the Ethernet device. > * @param pfc_conf > @@ -4119,10 +4166,40 @@ int rte_eth_dev_flow_ctrl_set(uint16_t port_id, > * - (-ENODEV) if *port_id* invalid. > * - (-EINVAL) if bad parameter > * - (-EIO) if flow control setup failure or device is removed. > + * > */ > int rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id, > - struct rte_eth_pfc_conf *pfc_conf); > + struct rte_eth_pfc_conf *pfc_conf); Above syntax changes are not needed. DPDK coding convention is using tabs (mostly two) for multi line function decleration/definition, please be consistant with usage, this patch has multiple variations. > > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Configure the Ethernet priority flow control for a given queue > + * for Ethernet device. > + * > + * @see struct rte_eth_dev_info::pfc_queue_tc_max priority flow control > + * usage models. > + * > + * @note When an ethdev port switches to PFC mode, the unconfigured Doesit mean queue based PFC mode? > + * queues shall be configured by the driver with default values such as > + * lower priority value for TC etc. > + * I assume there is no way for application to know what the defaults values are, also not sure if application interested in this. > + * @param port_id > + * The port identifier of the Ethernet device. > + * @param pfc_queue_conf > + * The pointer to the structure of the priority flow control parameters > + * for the queue. > + * @return > + * - (0) if successful. > + * - (-ENOTSUP) if hardware doesn't support priority flow control mode. > + * - (-ENODEV) if *port_id* invalid. > + * - (-EINVAL) if bad parameter > + * - (-EIO) if flow control setup queue failure > + */ > +__rte_experimental > +int rte_eth_dev_priority_flow_ctrl_queue_set(uint16_t port_id, > + struct rte_eth_pfc_queue_conf *pfc_queue_conf); I wonder if Rx/Tx queue id should be API arguments, to be consistent with some other APIs, and will it help application that configures queues in a loop. But I can see 'rx_pause' or 'tx_pause' (in config) can be valid or not based on the 'mode', so I understand to have queue ids in the struct. No strong opinion.