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 0A1D5A046B; Thu, 9 Jan 2020 15:01:47 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D29FA1DDBA; Thu, 9 Jan 2020 15:01:46 +0100 (CET) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id A03861DDAF for ; Thu, 9 Jan 2020 15:01:45 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Jan 2020 06:01:44 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,413,1571727600"; d="scan'208";a="235039951" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga002.jf.intel.com with ESMTP; 09 Jan 2020 06:01:44 -0800 Received: from fmsmsx120.amr.corp.intel.com (10.18.124.208) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 9 Jan 2020 06:01:44 -0800 Received: from FMSEDG001.ED.cps.intel.com (10.1.192.133) by fmsmsx120.amr.corp.intel.com (10.18.124.208) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 9 Jan 2020 06:01:43 -0800 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (104.47.55.173) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (TLS) id 14.3.439.0; Thu, 9 Jan 2020 06:01:43 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fBOelGKqYfrTeQwK+s9rnVmM3uQ9OztNb3mENVIXQVLFUriDCXE792E4jUVLOY1KOAbNFSeZQr/68Gc3X65/eawvzfRoKaPud4YFqwhgpYR1+HcCJ48wmz8f7Y7gcufjHivsHKxpJwqwhKmtyBl57WKFHRVdIQuBv28ptOld0ghhbAziduhq1WeZioFWEdodLvMrCa37kSvzssz2e0SQHKfVjuBpMEUnmayTQqsgRofo0pXwVsX8S4xldHo4bnZy4HXkH0M9E574bRclIWUjfaudQgEQRBjXIuZQ1tIG8RRjSmGPFz1sOq0mwXGmnTP/w2Oh2FPoiP7Q4iR80yQh4w== 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-SenderADCheck; bh=DiuPF0BJx7SdNwIBSGZ0Tu9FFOKNH8smP3QZVdZpWBQ=; b=LzxWTqWNCPTxSg7Uf6CSFSq2L3TeSkLlJvCMO4IQ31U5paTHvAuqdI10PQZEnpOwb3rZYYZcfleeWSUcBUgimvO/V5Cicrlq1ae8iYhhXYKTg5QVRhU6SEtvK+ZWp4SAm6/C2iipUos7rkKXlPfH6m1FS6fUWDFPsegICEvC++ycEhn3bMaBrTACJQvxhPFRW+TPHYGpPXWUWdB/0UqZtz+PZliCt1RiuCB0hdzYzGFr6STA8OHf8I1binPuNmhOVQqqcc4KHSLyhXKHIDym5rSsdTxoy55GBLb0mxQ+kJzO/AdB/gztLbpY06TWyeLruiCwPXUQ+OWGN9aaBpSnZQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DiuPF0BJx7SdNwIBSGZ0Tu9FFOKNH8smP3QZVdZpWBQ=; b=Ec0BvP/j/t8CNQCL8iYxaWFCOohCe6HrH2AkIQQcO1dsCsqAnBWDyjGwHjO8/SPD2jhlvMzrpUBo5ijO1JYCVoJX8UE6rFIaoFfzZMcKVM65c/DMsukXso9gZ8sR+f8AplD2yt1bLsVBfCZ6EbNHVLjvtkXj8aM9OuifO8aDDPo= Received: from SN6PR11MB2558.namprd11.prod.outlook.com (52.135.94.19) by SN6PR11MB3072.namprd11.prod.outlook.com (52.135.127.30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2623.9; Thu, 9 Jan 2020 14:01:41 +0000 Received: from SN6PR11MB2558.namprd11.prod.outlook.com ([fe80::4d86:362a:13c3:8386]) by SN6PR11MB2558.namprd11.prod.outlook.com ([fe80::4d86:362a:13c3:8386%7]) with mapi id 15.20.2623.008; Thu, 9 Jan 2020 14:01:41 +0000 From: "Ananyev, Konstantin" To: "Di, ChenxuX" , "dev@dpdk.org" CC: "Yang, Qiming" , "Di, ChenxuX" Thread-Topic: [dpdk-dev] [PATCH v7 3/4] net/ixgbe: cleanup Tx buffers Thread-Index: AQHVxtkj58tmpxpY7E+zGHL9Yz8SdafiQBkg Date: Thu, 9 Jan 2020 14:01:41 +0000 Message-ID: References: <20191203055134.72874-1-chenxux.di@intel.com> <20200109103822.89011-1-chenxux.di@intel.com> <20200109103822.89011-4-chenxux.di@intel.com> In-Reply-To: <20200109103822.89011-4-chenxux.di@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiOGMyNzQ5NGYtZmE2MS00MzZkLTlmMjMtMjFkZTI3YmE1MTE1IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiREpBSHRaSW9iY0U0OW5hQXBzS0tHUnVmNjFiVkdvTlg2K2U4RGRpYnhTSVNWWTMxc28ySXJNelNyQUNvd1NWUyJ9 dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.2.0.6 x-ctpclassification: CTP_NT authentication-results: spf=none (sender IP is ) smtp.mailfrom=konstantin.ananyev@intel.com; x-originating-ip: [192.198.151.162] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: e7483022-55ce-4238-34c2-08d7950c741d x-ms-traffictypediagnostic: SN6PR11MB3072: x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:8882; x-forefront-prvs: 02778BF158 x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(39860400002)(366004)(346002)(396003)(376002)(136003)(189003)(199004)(5660300002)(110136005)(2906002)(54906003)(7696005)(71200400001)(478600001)(66446008)(66946007)(66476007)(316002)(64756008)(66556008)(52536014)(76116006)(33656002)(4326008)(81156014)(26005)(55016002)(186003)(81166006)(8936002)(8676002)(9686003)(86362001)(6506007)(107886003); DIR:OUT; SFP:1102; SCL:1; SRVR:SN6PR11MB3072; H:SN6PR11MB2558.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: xWqYusNDY5xaox4f7yfSWIN7LmJvmQGV5QTNB5sfgrI60jUqmJaNm4qJET0I63xi754t4FsxhUFbeZ0BCpFi+iJQRgl2KsFhhE5NemwlwMoN7IHegG4tqiLIvWioM+RiORPUv6MQy337gxX2mhP5L+QdL+dGfmV77UOaA+Ettz/LZ+IOh9uZRxYITtC+URWXs3rDdy0c6mk0M9OYJY+pH5QA/PHR87e3XfUa/mAhe0kd9+ofelIg+jcUCjMCZhTT7C1ryJemYvIIy6zh6FTyMRCxY7V5f6nXZgryG67HYvBLhdRHzanrAHYyP6QnCOL7+TZt5uxoZm5NdacHkmFZi5ZaSWTTRFW79Z4gQTUrZQXvmzdtN+RSvVySKdhwLVC11A7PbsTZIuzjFApomKI0SKC24IceFmzy3vC64HHhnBWyOqVVsXBhZrIuceB8b3Hi Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: e7483022-55ce-4238-34c2-08d7950c741d X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Jan 2020 14:01:41.4462 (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: wvKpeGzmCe/0rw1m6Mjkq5Lhu+j59JfxFzub4GKq9QxkHRfYxlRT6zjfXR7JknSOiQy+X2P/zj+2HZYoP3/OcXUVOwlduHMFeFA+V22IA/M= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR11MB3072 X-OriginatorOrg: intel.com Subject: Re: [dpdk-dev] [PATCH v7 3/4] net/ixgbe: cleanup Tx buffers 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" Hi Chenxu, Good progress wih _full_version, but still some issues remains I think. More comments inline. Konstantin >=20 > Signed-off-by: Chenxu Di > --- > drivers/net/ixgbe/ixgbe_ethdev.c | 4 + > drivers/net/ixgbe/ixgbe_rxtx.c | 156 ++++++++++++++++++++++++++++++- > drivers/net/ixgbe/ixgbe_rxtx.h | 10 ++ > 3 files changed, 169 insertions(+), 1 deletion(-) >=20 > diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_e= thdev.c > index 2c6fd0f13..668c36188 100644 > --- a/drivers/net/ixgbe/ixgbe_ethdev.c > +++ b/drivers/net/ixgbe/ixgbe_ethdev.c > @@ -601,6 +601,7 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops =3D= { > .udp_tunnel_port_add =3D ixgbe_dev_udp_tunnel_port_add, > .udp_tunnel_port_del =3D ixgbe_dev_udp_tunnel_port_del, > .tm_ops_get =3D ixgbe_tm_ops_get, > + .tx_done_cleanup =3D ixgbe_tx_done_cleanup, > }; >=20 > /* > @@ -649,6 +650,7 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = =3D { > .reta_query =3D ixgbe_dev_rss_reta_query, > .rss_hash_update =3D ixgbe_dev_rss_hash_update, > .rss_hash_conf_get =3D ixgbe_dev_rss_hash_conf_get, > + .tx_done_cleanup =3D ixgbe_tx_done_cleanup, > }; >=20 > /* store statistics names and its offset in stats structure */ > @@ -1101,6 +1103,7 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, voi= d *init_params __rte_unused) > eth_dev->rx_pkt_burst =3D &ixgbe_recv_pkts; > eth_dev->tx_pkt_burst =3D &ixgbe_xmit_pkts; > eth_dev->tx_pkt_prepare =3D &ixgbe_prep_pkts; > + ixgbe_set_tx_done_cleanup_func(ixgbe_tx_done_cleanup_scalar); >=20 > /* > * For secondary processes, we don't initialise any further as primary > @@ -1580,6 +1583,7 @@ eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev) > eth_dev->dev_ops =3D &ixgbevf_eth_dev_ops; > eth_dev->rx_pkt_burst =3D &ixgbe_recv_pkts; > eth_dev->tx_pkt_burst =3D &ixgbe_xmit_pkts; > + ixgbe_set_tx_done_cleanup_func(ixgbe_tx_done_cleanup_scalar); >=20 > /* for secondary processes, we don't initialise any further as primary > * has already done this work. Only check we don't need a different > diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxt= x.c > index fa572d184..122dae425 100644 > --- a/drivers/net/ixgbe/ixgbe_rxtx.c > +++ b/drivers/net/ixgbe/ixgbe_rxtx.c > @@ -92,6 +92,8 @@ uint16_t ixgbe_xmit_fixed_burst_vec(void *tx_queue, str= uct rte_mbuf **tx_pkts, > uint16_t nb_pkts); > #endif >=20 > +static ixgbe_tx_done_cleanup_t ixgbe_tx_done_cleanup_op; You can't have just one static variable here. There could be several ixgbe devices and they could be configured in a diff= erent way. I.E. txpkt_burst() is per device, so tx_done_cleanup() also has to be per d= evice. Probably the easiest way is to add new entry for tx_done_cleanup into struc= t ixgbe_txq_ops, and set it properly in ixgbe_set_tx_function(). > + > /********************************************************************* > * > * TX functions > @@ -2306,6 +2308,152 @@ ixgbe_tx_queue_release_mbufs(struct ixgbe_tx_queu= e *txq) > } > } >=20 > +int > +ixgbe_tx_done_cleanup_scalar(struct ixgbe_tx_queue *txq, uint32_t free_c= nt) As a nit I would change _scalar to _full or so. > +{ > + uint32_t pkt_cnt; > + uint16_t i; > + uint16_t tx_last; > + uint16_t tx_id; > + uint16_t nb_tx_to_clean; > + uint16_t nb_tx_free_last; > + struct ixgbe_tx_entry *swr_ring =3D txq->sw_ring; > + > + /* Start free mbuf from the next of tx_tail */ > + tx_last =3D txq->tx_tail; > + tx_id =3D swr_ring[tx_last].next_id; > + > + if (txq->nb_tx_free =3D=3D 0) > + if (ixgbe_xmit_cleanup(txq)) As a nit it could be just if (ixgbe_set_tx_function && ixgbe_xmit_cleanup(t= xq)) > + return 0; > + > + nb_tx_to_clean =3D txq->nb_tx_free; > + nb_tx_free_last =3D txq->nb_tx_free; > + if (!free_cnt) > + free_cnt =3D txq->nb_tx_desc; > + > + /* Loop through swr_ring to count the amount of > + * freeable mubfs and packets. > + */ > + for (pkt_cnt =3D 0; pkt_cnt < free_cnt; ) { > + for (i =3D 0; i < nb_tx_to_clean && > + pkt_cnt < free_cnt && > + tx_id !=3D tx_last; i++) { > + if (swr_ring[tx_id].mbuf !=3D NULL) { > + rte_pktmbuf_free_seg(swr_ring[tx_id].mbuf); > + swr_ring[tx_id].mbuf =3D NULL; > + > + /* > + * last segment in the packet, > + * increment packet count > + */ > + pkt_cnt +=3D (swr_ring[tx_id].last_id =3D=3D tx_id); > + } > + > + tx_id =3D swr_ring[tx_id].next_id; > + } > + > + if (tx_id =3D=3D tx_last || txq->tx_rs_thresh > + > txq->nb_tx_desc - txq->nb_tx_free) First condition (tx_id =3D=3D tx_last) is porbably redundant here. > + break; > + > + if (pkt_cnt < free_cnt) { > + if (ixgbe_xmit_cleanup(txq)) > + break; > + > + nb_tx_to_clean =3D txq->nb_tx_free - nb_tx_free_last; > + nb_tx_free_last =3D txq->nb_tx_free; > + } > + } > + > + PMD_TX_FREE_LOG(DEBUG, > + "Free %u Packets successfully " > + "(port=3D%d queue=3D%d)", > + pkt_cnt, txq->port_id, txq->queue_id); > + > + return (int)pkt_cnt; > +} > + > +int > +ixgbe_tx_done_cleanup_vec(struct ixgbe_tx_queue *txq __rte_unused, > + uint32_t free_cnt __rte_unused) > +{ > + return -ENOTSUP; > +} > + > +int > +ixgbe_tx_done_cleanup_simple(struct ixgbe_tx_queue *txq, > + uint32_t free_cnt) > +{ > + uint16_t i; > + uint16_t tx_first; > + uint16_t tx_id; > + uint32_t pkt_cnt; > + struct ixgbe_tx_entry *swr_ring =3D txq->sw_ring; Looks overcomplicated here. TX simple (and vec) doesn't support mulsti-seg packets,=20 So one TXD - one mbuf, and one packet. And ixgbe_tx_free_bufs() always retunrs/frees either 0 or tx_rs_thresh mbuf= s/packets. So it probably can be something like that: ixgbe_tx_done_cleanup_simple(struct ixgbe_tx_queue *txq, uint32_t free_cnt= ) { If (free_cnt =3D=3D 0) free_cnt =3D txq->nb_desc; =20 cnt =3D free_cnt - free_cnt % txq->tx_rs_thesh; for (i =3D 0; i < cnt; i+=3D n) { n =3D ixgbe_tx_free_bufs(txq); if (n =3D=3D 0) break; }=20 return i; } > + > + /* Start free mbuf from tx_first */ > + tx_first =3D txq->tx_next_dd - (txq->tx_rs_thresh - 1); > + tx_id =3D tx_first; > + > + /* while free_cnt is 0, > + * suppose one mbuf per packet, > + * try to free packets as many as possible > + */ > + if (free_cnt =3D=3D 0) > + free_cnt =3D txq->nb_tx_desc; > + > + /* Loop through swr_ring to count freeable packets */ > + for (pkt_cnt =3D 0; pkt_cnt < free_cnt; ) { > + if (txq->nb_tx_desc - txq->nb_tx_free < txq->tx_rs_thresh) > + break; > + > + if (!ixgbe_tx_free_bufs(txq)) > + break; > + > + for (i =3D 0; i !=3D txq->tx_rs_thresh && > + tx_id !=3D tx_first; i++) { > + /* last segment in the packet, > + * increment packet count > + */ > + pkt_cnt +=3D (tx_id =3D=3D swr_ring[tx_id].last_id); > + tx_id =3D swr_ring[tx_id].next_id; > + } > + > + if (tx_id =3D=3D tx_first) > + break; > + } > + > + PMD_TX_FREE_LOG(DEBUG, > + "Free %u packets successfully " > + "(port=3D%d queue=3D%d)", > + pkt_cnt, txq->port_id, txq->queue_id); > + > + return (int)pkt_cnt; > +} > + > +int > +ixgbe_tx_done_cleanup(void *txq, uint32_t free_cnt) > +{ > + ixgbe_tx_done_cleanup_t func =3D ixgbe_get_tx_done_cleanup_func(); > + > + if (!func) > + return -ENOTSUP; > + > + return func(txq, free_cnt); > +} > + > +void > +ixgbe_set_tx_done_cleanup_func(ixgbe_tx_done_cleanup_t fn) > +{ > + ixgbe_tx_done_cleanup_op =3D fn; > +} > + > +ixgbe_tx_done_cleanup_t > +ixgbe_get_tx_done_cleanup_func(void) > +{ > + return ixgbe_tx_done_cleanup_op; > +} > + > static void __attribute__((cold)) > ixgbe_tx_free_swring(struct ixgbe_tx_queue *txq) > { > @@ -2398,9 +2546,14 @@ ixgbe_set_tx_function(struct rte_eth_dev *dev, str= uct ixgbe_tx_queue *txq) > ixgbe_txq_vec_setup(txq) =3D=3D 0)) { > PMD_INIT_LOG(DEBUG, "Vector tx enabled."); > dev->tx_pkt_burst =3D ixgbe_xmit_pkts_vec; > - } else > + ixgbe_set_tx_done_cleanup_func(ixgbe_tx_done_cleanup_vec); > + } else { > #endif > dev->tx_pkt_burst =3D ixgbe_xmit_pkts_simple; > + ixgbe_set_tx_done_cleanup_func(ixgbe_tx_done_cleanup_simple); > +#ifdef RTE_IXGBE_INC_VECTOR > + } > +#endif > } else { > PMD_INIT_LOG(DEBUG, "Using full-featured tx code path"); > PMD_INIT_LOG(DEBUG, > @@ -2412,6 +2565,7 @@ ixgbe_set_tx_function(struct rte_eth_dev *dev, stru= ct ixgbe_tx_queue *txq) > (unsigned long)RTE_PMD_IXGBE_TX_MAX_BURST); > dev->tx_pkt_burst =3D ixgbe_xmit_pkts; > dev->tx_pkt_prepare =3D ixgbe_prep_pkts; > + ixgbe_set_tx_done_cleanup_func(ixgbe_tx_done_cleanup_scalar); > } > } >=20 > diff --git a/drivers/net/ixgbe/ixgbe_rxtx.h b/drivers/net/ixgbe/ixgbe_rxt= x.h > index 505d344b9..a52597aa9 100644 > --- a/drivers/net/ixgbe/ixgbe_rxtx.h > +++ b/drivers/net/ixgbe/ixgbe_rxtx.h > @@ -253,6 +253,8 @@ struct ixgbe_txq_ops { > IXGBE_ADVTXD_DCMD_DEXT |\ > IXGBE_ADVTXD_DCMD_EOP) >=20 > +typedef int (*ixgbe_tx_done_cleanup_t)(struct ixgbe_tx_queue *txq, > + uint32_t free_cnt); >=20 > /* Takes an ethdev and a queue and sets up the tx function to be used ba= sed on > * the queue parameters. Used in tx_queue_setup by primary process and t= hen > @@ -285,6 +287,14 @@ int ixgbe_rx_vec_dev_conf_condition_check(struct rte= _eth_dev *dev); > int ixgbe_rxq_vec_setup(struct ixgbe_rx_queue *rxq); > void ixgbe_rx_queue_release_mbufs_vec(struct ixgbe_rx_queue *rxq); >=20 > +void ixgbe_set_tx_done_cleanup_func(ixgbe_tx_done_cleanup_t fn); > +ixgbe_tx_done_cleanup_t ixgbe_get_tx_done_cleanup_func(void); > + > +int ixgbe_tx_done_cleanup(void *txq, uint32_t free_cnt); > +int ixgbe_tx_done_cleanup_scalar(struct ixgbe_tx_queue *txq, uint32_t fr= ee_cnt); > +int ixgbe_tx_done_cleanup_vec(struct ixgbe_tx_queue *txq, uint32_t free_= cnt); > +int ixgbe_tx_done_cleanup_simple(struct ixgbe_tx_queue *txq, uint32_t fr= ee_cnt); > + > extern const uint32_t ptype_table[IXGBE_PACKET_TYPE_MAX]; > extern const uint32_t ptype_table_tn[IXGBE_PACKET_TYPE_TN_MAX]; >=20 > -- > 2.17.1