Add flags to asymmetric mem barrier
authorDave Watson <davejwatson@fb.com>
Wed, 21 Jun 2017 17:54:54 +0000 (10:54 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Wed, 21 Jun 2017 17:57:01 +0000 (10:57 -0700)
Summary:
Original sys_membarrier call supported an EXPEDITED flag, that was much faster than the current version, at some extra CPU cost.

The basic idea was a normal one would be used in a background thread, while EXPEDITED would be useful inline in foreground threads.

Add the flag here, and use the mprotect hack until sys_membarrier supports both.

Reviewed By: magedm

Differential Revision: D5292680

fbshipit-source-id: 30edf27514976991bbaa8e776a7138eb815ade36

folly/experimental/AsymmetricMemoryBarrier.cpp
folly/experimental/AsymmetricMemoryBarrier.h

index 55bec5f141bdc17d35d6347c1477b8d8dc9b4ac4..fc5b660141c3ebaa9b8bbd2b5a425ef98db8e343 100644 (file)
@@ -32,8 +32,7 @@ struct DummyPageCreator {
   }
 
   static void* get() {
-    static auto ptr =
-        kIsLinux && !detail::sysMembarrierAvailable() ? create() : nullptr;
+    static auto ptr = kIsLinux ? create() : nullptr;
     return ptr;
   }
 
@@ -81,10 +80,11 @@ void mprotectMembarrier() {
 }
 }
 
-void asymmetricHeavyBarrier() {
+void asymmetricHeavyBarrier(AMBFlags flags) {
   if (kIsLinux) {
     static const bool useSysMembarrier = detail::sysMembarrierAvailable();
-    if (useSysMembarrier) {
+    // sys_membarrier currently does not support EXPEDITED
+    if (useSysMembarrier && flags != AMBFlags::EXPEDITED) {
       auto r = detail::sysMembarrier();
       checkUnixError(r, "membarrier");
     } else {
index b8cf4a7e240ca5da85ba738b7fadffcd838d3cd0..faffa0b3712fc89d18b94cf2ef6ffb85bc346fea 100644 (file)
 
 namespace folly {
 
+enum class AMBFlags {
+  NORMAL,
+  EXPEDITED,
+};
+
 FOLLY_ALWAYS_INLINE void asymmetricLightBarrier() {
   if (kIsLinux) {
     asm_volatile_memory();
@@ -30,5 +35,5 @@ FOLLY_ALWAYS_INLINE void asymmetricLightBarrier() {
   }
 }
 
-void asymmetricHeavyBarrier();
+void asymmetricHeavyBarrier(AMBFlags flags = AMBFlags::NORMAL);
 }