diff mbox series

[ovs-dev,v2] include/openvswitch/compiler.h: add check for __builtin_prefetch using __has_builtin

Message ID 20210817011731.9822-1-sergey.madaminov@gmail.com
State Deferred
Headers show
Series [ovs-dev,v2] include/openvswitch/compiler.h: add check for __builtin_prefetch using __has_builtin | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed

Commit Message

Sergey Madaminov Aug. 17, 2021, 1:17 a.m. UTC
Currently, '__builtin_prefetch' is defined for OVS_PREFETCH macro only
if '__GNUC__' is defined. However, it would make sense to use a
'__has_builtin' preprocessor operator to check if '__builtin_prefetch'
is available and then define the OVS_PREFETCH macro.

Doing so will allow to use prefetching on Windows too. This operator is
supported by Clang and is supported in GCC starting GCC 10. To preserve
backwards compatibility, the old way to enable prefetching is preserverd
if '__has_builtin' is not defined.

Also, I've checked the coding style if it has anything related to the
indentations in preprocessor directives but have not found anything.
Checking several files showed that there is no consistent rule to do so.
Thus, I simply followed Google coding style and added indentations
after pound sign for readability.

Suggested-by: Ben Pfaff <blp@ovn.org>
Signed-off-by: Sergey Madaminov <sergey.madaminov@gmail.com>

---
v1->v2: addressed Ben's suggestions
 * added #ifndef for __has_builtin
 * previously used format for __has_builtin recommended by GCC [1] but
 that introduced code duplication so addressed that
 * removed redundant code from patch not related to the matter at hand

[1] https://gcc.gnu.org/onlinedocs/gcc-10.1.0/cpp/_005f_005fhas_005fbuiltin.html

---
 include/openvswitch/compiler.h | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

Comments

Simon Horman Oct. 10, 2023, 12:46 p.m. UTC | #1
On Mon, Aug 16, 2021 at 08:17:31PM -0500, Sergey Madaminov wrote:
> Currently, '__builtin_prefetch' is defined for OVS_PREFETCH macro only
> if '__GNUC__' is defined. However, it would make sense to use a
> '__has_builtin' preprocessor operator to check if '__builtin_prefetch'
> is available and then define the OVS_PREFETCH macro.
> 
> Doing so will allow to use prefetching on Windows too. This operator is
> supported by Clang and is supported in GCC starting GCC 10. To preserve
> backwards compatibility, the old way to enable prefetching is preserverd
> if '__has_builtin' is not defined.
> 
> Also, I've checked the coding style if it has anything related to the
> indentations in preprocessor directives but have not found anything.
> Checking several files showed that there is no consistent rule to do so.
> Thus, I simply followed Google coding style and added indentations
> after pound sign for readability.
> 
> Suggested-by: Ben Pfaff <blp@ovn.org>
> Signed-off-by: Sergey Madaminov <sergey.madaminov@gmail.com>

Hi Sergey,

This patch appears to have gone stale in patchwork, for one reason or
another. If it is still relevant then I think it needs to be revisited,
by being reposted after appropriate preparation.

As such I'm marking this patch as "Deferred" in patchwork.

No action is required unless there is a desire to revisit this patch.
diff mbox series

Patch

diff --git a/include/openvswitch/compiler.h b/include/openvswitch/compiler.h
index cf009f826..3fbf68e9e 100644
--- a/include/openvswitch/compiler.h
+++ b/include/openvswitch/compiler.h
@@ -26,6 +26,9 @@ 
 #ifndef __has_extension
   #define __has_extension(x) 0
 #endif
+#ifndef __has_builtin
+#  define __has_builtin(x) 0
+#endif
 
 /* To make OVS_NO_RETURN portable across gcc/clang and MSVC, it should be
  * added at the beginning of the function declaration. */
@@ -229,13 +232,17 @@ 
  * OVS_PREFETCH_WRITE() should be used when the memory is going to be
  * written to.  Depending on the target CPU, this can generate the same
  * instruction as OVS_PREFETCH(), or bring the data into the cache in an
- * exclusive state. */
-#if __GNUC__
-#define OVS_PREFETCH(addr) __builtin_prefetch((addr))
-#define OVS_PREFETCH_WRITE(addr) __builtin_prefetch((addr), 1)
+ * exclusive state.
+ *
+ * GCC 10 introduced support for __has_builtin preprocessor operator,
+ * however, the old way to define OVS_PREFETCH remains to allow for backwards
+ * compatibility. */
+#if __has_builtin (__builtin_prefetch) || __GNUC__
+#  define OVS_PREFETCH(addr) __builtin_prefetch((addr))
+#  define OVS_PREFETCH_WRITE(addr) __builtin_prefetch((addr), 1)
 #else
-#define OVS_PREFETCH(addr)
-#define OVS_PREFETCH_WRITE(addr)
+#  define OVS_PREFETCH(addr)
+#  define OVS_PREFETCH_WRITE(addr)
 #endif
 
 /* Since Visual Studio 2015 there has been an effort to make offsetof a