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 98C22A04B5; Thu, 10 Sep 2020 03:17:38 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1CA8E1C0CD; Thu, 10 Sep 2020 03:17:31 +0200 (CEST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id 58AF81BEB3 for ; Thu, 10 Sep 2020 03:17:29 +0200 (CEST) IronPort-SDR: N5NaayOYwt8EyYTK1KzOdhGRV5jjHvzpoQNZVChHaPcck9rDZJEvxV+TxUX8Lgpdq4CVgjHrZj Nq6fNEah56MA== X-IronPort-AV: E=McAfee;i="6000,8403,9739"; a="155848595" X-IronPort-AV: E=Sophos;i="5.76,411,1592895600"; d="scan'208";a="155848595" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Sep 2020 18:17:29 -0700 IronPort-SDR: PKCyw5bkR6cWT5gRcjc4fQjFlUpiFxrN9PZXPhRdGqm4qq7DxkxlTkUkGzfdwepOfGWJL0aRZS BuDg0QBPUwuA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,411,1592895600"; d="scan'208";a="341749949" Received: from unknown (HELO localhost.ch.intel.com) ([143.182.137.102]) by FMSMGA003.fm.intel.com with ESMTP; 09 Sep 2020 18:17:28 -0700 From: Omkar Maslekar To: dev@dpdk.org Cc: bruce.richardson@intel.com, ciara.loftus@intel.com, omkar.maslekar@intel.com Date: Wed, 9 Sep 2020 18:16:54 -0700 Message-Id: <1599700614-22809-2-git-send-email-omkar.maslekar@intel.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1599700614-22809-1-git-send-email-omkar.maslekar@intel.com> References: <1599700614-22809-1-git-send-email-omkar.maslekar@intel.com> Subject: [dpdk-dev] [PATCH] EAL: An addition of cache line demote (CLDEMOTE) in rte_prefetch.h 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" rte_cldemote is similar to a prefetch hint - in reverse. cldemote(addr) enables software to hint to hardware that line is likely to be shared. Useful in core-to-core communications where cache-line is likely to be shared. ARM and PPC implementation is provided with NOP and can be added if any equivalent instructions could be used for implementation on those architectures. Signed-off-by: Omkar Maslekar --- doc/guides/rel_notes/release_20_11.rst | 26 ++++---------------------- lib/librte_eal/arm/include/rte_prefetch_32.h | 5 +++++ lib/librte_eal/arm/include/rte_prefetch_64.h | 5 +++++ lib/librte_eal/include/generic/rte_prefetch.h | 7 +++++++ lib/librte_eal/ppc/include/rte_prefetch.h | 5 +++++ lib/librte_eal/x86/include/rte_prefetch.h | 9 +++++++++ 6 files changed, 35 insertions(+), 22 deletions(-) diff --git a/doc/guides/rel_notes/release_20_11.rst b/doc/guides/rel_notes/release_20_11.rst index df227a1..c4a4362 100644 --- a/doc/guides/rel_notes/release_20_11.rst +++ b/doc/guides/rel_notes/release_20_11.rst @@ -27,29 +27,11 @@ New Features .. This section should contain new features added in this release. Sample format: - * **Add a title in the past tense with a full stop.** +Added new instruction CLDEMOTE in rte_prefetch.h. - Add a short 1-2 sentence description in the past tense. - The description should be enough to allow someone scanning - the release notes to understand the new feature. - - If the feature adds a lot of sub-features you can use a bullet list - like this: - - * Added feature foo to do something. - * Enhanced feature bar to do something else. - - Refer to the previous release notes for examples. - - Suggested order in release notes items: - * Core libs (EAL, mempool, ring, mbuf, buses) - * Device abstraction libs and PMDs - - ethdev (lib, PMDs) - - cryptodev (lib, PMDs) - - eventdev (lib, PMDs) - - etc - * Other libs - * Apps, Examples, Tools (if significant) + Added a hardware hint CLDEMOTE which is similar to prefetch in reverse. + CLDEMOTES moves the cache line to the last shared cache, where it expects + sharing to be efficient. This section is a comment. Do not overwrite or remove it. Also, make sure to start the actual text at the margin. diff --git a/lib/librte_eal/arm/include/rte_prefetch_32.h b/lib/librte_eal/arm/include/rte_prefetch_32.h index e53420a..ad91edd 100644 --- a/lib/librte_eal/arm/include/rte_prefetch_32.h +++ b/lib/librte_eal/arm/include/rte_prefetch_32.h @@ -33,6 +33,11 @@ static inline void rte_prefetch_non_temporal(const volatile void *p) rte_prefetch0(p); } +static inline void rte_cldemote(const volatile void *p) +{ + RTE_SET_USED(p); +} + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/arm/include/rte_prefetch_64.h b/lib/librte_eal/arm/include/rte_prefetch_64.h index fc2b391..35d278a 100644 --- a/lib/librte_eal/arm/include/rte_prefetch_64.h +++ b/lib/librte_eal/arm/include/rte_prefetch_64.h @@ -32,6 +32,11 @@ static inline void rte_prefetch_non_temporal(const volatile void *p) asm volatile ("PRFM PLDL1STRM, [%0]" : : "r" (p)); } +static inline void rte_cldemote(const volatile void *p) +{ + RTE_SET_USED(p); +} + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/include/generic/rte_prefetch.h b/lib/librte_eal/include/generic/rte_prefetch.h index 6e47bdf..89ec69c 100644 --- a/lib/librte_eal/include/generic/rte_prefetch.h +++ b/lib/librte_eal/include/generic/rte_prefetch.h @@ -51,4 +51,11 @@ */ static inline void rte_prefetch_non_temporal(const volatile void *p); +/** + * Demote a cache line into the last shared cache level. + * @param p + * Address to demote + */ +static inline void rte_cldemote(const volatile void *p); + #endif /* _RTE_PREFETCH_H_ */ diff --git a/lib/librte_eal/ppc/include/rte_prefetch.h b/lib/librte_eal/ppc/include/rte_prefetch.h index 9ba07c8..3fe9655 100644 --- a/lib/librte_eal/ppc/include/rte_prefetch.h +++ b/lib/librte_eal/ppc/include/rte_prefetch.h @@ -34,6 +34,11 @@ static inline void rte_prefetch_non_temporal(const volatile void *p) rte_prefetch0(p); } +static inline void rte_cldemote(const volatile void *p) +{ + RTE_SET_USED(p); +} + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/x86/include/rte_prefetch.h b/lib/librte_eal/x86/include/rte_prefetch.h index 384c6b3..029d06e 100644 --- a/lib/librte_eal/x86/include/rte_prefetch.h +++ b/lib/librte_eal/x86/include/rte_prefetch.h @@ -32,6 +32,15 @@ static inline void rte_prefetch_non_temporal(const volatile void *p) asm volatile ("prefetchnta %[p]" : : [p] "m" (*(const volatile char *)p)); } +/* + * we're using raw byte codes for now as only the newest compiler + * versions support this instruction natively. + */ +static inline void rte_cldemote(const volatile void *p) +{ + asm volatile(".byte 0x0f, 0x1c, 0x06" :: "S" (p)); +} + #ifdef __cplusplus } #endif -- 1.8.3.1