From patchwork Wed Nov 11 13:59:41 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Mike A. Polehn" X-Patchwork-Id: 8867 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 191538DAF; Wed, 11 Nov 2015 15:00:22 +0100 (CET) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 620EB8D96 for ; Wed, 11 Nov 2015 15:00:20 +0100 (CET) Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga102.fm.intel.com with ESMTP; 11 Nov 2015 05:59:44 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,276,1444719600"; d="scan'208";a="682959849" Received: from orsmsx102.amr.corp.intel.com ([10.22.225.129]) by orsmga003.jf.intel.com with ESMTP; 11 Nov 2015 05:59:42 -0800 Received: from orsmsx113.amr.corp.intel.com (10.22.240.9) by ORSMSX102.amr.corp.intel.com (10.22.225.129) with Microsoft SMTP Server (TLS) id 14.3.248.2; Wed, 11 Nov 2015 05:59:41 -0800 Received: from orsmsx102.amr.corp.intel.com ([169.254.1.190]) by ORSMSX113.amr.corp.intel.com ([10.22.240.9]) with mapi id 14.03.0248.002; Wed, 11 Nov 2015 05:59:41 -0800 From: "Polehn, Mike A" To: "dev@dpdk.org" Thread-Topic: [PATCH v2] ethdev: Prefetch driver variable structure Thread-Index: AdEciQ+p7KpBo2bwQlmTFMK0W0Grog== Date: Wed, 11 Nov 2015 13:59:41 +0000 Message-ID: <745DB4B8861F8E4B9849C970520ABBF14975C429@ORSMSX102.amr.corp.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsIiwiaWQiOiJmN2M1MDdmNC1iMDVmLTQzNjQtODdhNS01ZDYzZTUzOTA5N2QiLCJwcm9wcyI6W3sibiI6IkludGVsRGF0YUNsYXNzaWZpY2F0aW9uIiwidmFscyI6W3sidmFsdWUiOiJDVFBfSUMifV19XX0sIlN1YmplY3RMYWJlbHMiOltdLCJUTUNWZXJzaW9uIjoiMTUuNC4xMC4xOSIsIlRydXN0ZWRMYWJlbEhhc2giOiI0allQNUFtSWpvXC90cjJUaGVJNUNnMzBWWHNuNlVMdjFsZkdUc2Z2UU9WUT0ifQ== x-inteldataclassification: CTP_IC x-originating-ip: [10.22.254.140] MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2] ethdev: Prefetch driver variable structure X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Adds ethdev driver prefetch of variable structure to CPU cache 0 while calling into tx or rx device driver operation. RFC 2544 test of NIC task test measurement points show improvement of lower latency and/or better packet throughput indicating clock cycles saved. Signed-off-by: Mike A. Polehn --- lib/librte_ether/rte_ethdev.h | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 48a540d..f1c35de 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -2458,12 +2458,17 @@ rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id, struct rte_mbuf **rx_pkts, const uint16_t nb_pkts) { struct rte_eth_dev *dev; + int16_t nb_rx; dev = &rte_eth_devices[port_id]; - int16_t nb_rx = (*dev->rx_pkt_burst)(dev->data->rx_queues[queue_id], - rx_pkts, nb_pkts); + { /* limit scope of rxq variable */ + /* rxq is going to be immediately used, prefetch it */ + void *rxq = dev->data->rx_queues[queue_id]; + rte_prefetch0(rxq); + nb_rx = (*dev->rx_pkt_burst)(rxq, rx_pkts, nb_pkts); + } #ifdef RTE_ETHDEV_RXTX_CALLBACKS struct rte_eth_rxtx_callback *cb = dev->post_rx_burst_cbs[queue_id]; @@ -2600,6 +2605,7 @@ rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) { struct rte_eth_dev *dev; + void *txq; dev = &rte_eth_devices[port_id]; @@ -2615,7 +2621,11 @@ rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id, } #endif - return (*dev->tx_pkt_burst)(dev->data->tx_queues[queue_id], tx_pkts, nb_pkts); + /* txq is going to be immediately used, prefetch it */ + txq = dev->data->tx_queues[queue_id]; + rte_prefetch0(txq); + + return (*dev->tx_pkt_burst)(txq, tx_pkts, nb_pkts); } #endif