From: Dave Watson Date: Wed, 21 Jun 2017 17:54:54 +0000 (-0700) Subject: Add flags to asymmetric mem barrier X-Git-Tag: v2017.06.26.00~26 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=614cc8c369e104da1daeffe7f9d29d513ebac7e5;hp=08f64cbb466e2db910312d26beb4a2bf486367b6 Add flags to asymmetric mem barrier 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 --- diff --git a/folly/experimental/AsymmetricMemoryBarrier.cpp b/folly/experimental/AsymmetricMemoryBarrier.cpp index 55bec5f1..fc5b6601 100644 --- a/folly/experimental/AsymmetricMemoryBarrier.cpp +++ b/folly/experimental/AsymmetricMemoryBarrier.cpp @@ -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 { diff --git a/folly/experimental/AsymmetricMemoryBarrier.h b/folly/experimental/AsymmetricMemoryBarrier.h index b8cf4a7e..faffa0b3 100644 --- a/folly/experimental/AsymmetricMemoryBarrier.h +++ b/folly/experimental/AsymmetricMemoryBarrier.h @@ -22,6 +22,11 @@ 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); }