+ force_mb_all_readers();
+}
+#endif /* #ifdef RCU_SIGNAL */
+
+/*
+ * synchronize_rcu() waiting. Single thread.
+ */
+static void wait_gp(void)
+{
+ /* Read reader_gp before read futex */
+ smp_mb_master(RCU_MB_GROUP);
+ if (uatomic_read(&rcu_gp.futex) == -1)
+ futex_async(&rcu_gp.futex, FUTEX_WAIT, -1,
+ NULL, NULL, 0);
+}
+
+/*
+ * Always called with rcu_registry lock held. Releases this lock between
+ * iterations and grabs it again. Holds the lock when it returns.
+ */
+static void wait_for_readers(struct cds_list_head *input_readers,
+ struct cds_list_head *cur_snap_readers,
+ struct cds_list_head *qsreaders)
+{
+ unsigned int wait_loops = 0;
+ struct rcu_reader *index, *tmp;
+#ifdef HAS_INCOHERENT_CACHES
+ unsigned int wait_gp_loops = 0;
+#endif /* HAS_INCOHERENT_CACHES */