#ifdef RCU_MEMBARRIER
static int init_done;
-int rcu_has_sys_membarrier;
+#ifndef CONFIG_RCU_FORCE_SYS_MEMBARRIER
+int rcu_has_sys_membarrier_memb;
+#endif
void __attribute__((constructor)) rcu_init(void);
#endif
#ifdef RCU_MEMBARRIER
static void smp_mb_master(void)
{
- if (caa_likely(rcu_has_sys_membarrier))
+ if (caa_likely(rcu_has_sys_membarrier_memb))
(void) membarrier(MEMBARRIER_CMD_SHARED, 0);
else
cmm_smp_mb();
}
#ifdef RCU_MEMBARRIER
+
+#ifdef CONFIG_RCU_FORCE_SYS_MEMBARRIER
+static
+void rcu_sys_membarrier_status(int available)
+{
+ if (!available)
+ abort();
+}
+#else
+static
+void rcu_sys_membarrier_status(int available)
+{
+ if (available)
+ rcu_has_sys_membarrier_memb = 1;
+}
+#endif
+
void rcu_init(void)
{
int ret;
return;
init_done = 1;
ret = membarrier(MEMBARRIER_CMD_QUERY, 0);
- if (ret >= 0 && (ret & MEMBARRIER_CMD_SHARED)) {
- rcu_has_sys_membarrier = 1;
- }
+ rcu_sys_membarrier_status(ret >= 0 && (ret & MEMBARRIER_CMD_SHARED));
}
#endif