+static
+void free_node_cb(struct rcu_head *head)
+{
+ struct test *node =
+ caa_container_of(head, struct test, rcu);
+ free(node);
+}
+
+static
+void do_test_pop(enum test_sync sync)
+{
+ struct cds_lfs_node *snode;
+
+ if (sync == TEST_SYNC_RCU)
+ rcu_read_lock();
+ snode = __cds_lfs_pop(&s);
+ if (sync == TEST_SYNC_RCU)
+ rcu_read_unlock();
+ if (snode) {
+ struct test *node;
+
+ node = caa_container_of(snode,
+ struct test, list);
+ if (sync == TEST_SYNC_RCU)
+ call_rcu(&node->rcu, free_node_cb);
+ else
+ free(node);
+ URCU_TLS(nr_successful_dequeues)++;
+ }
+ URCU_TLS(nr_dequeues)++;
+}
+
+static
+void do_test_pop_all(enum test_sync sync)
+{
+ struct cds_lfs_node *snode;
+ struct cds_lfs_head *head;
+ struct cds_lfs_node *n;
+
+ head = __cds_lfs_pop_all(&s);
+ cds_lfs_for_each_safe(head, snode, n) {
+ struct test *node;
+
+ node = caa_container_of(snode, struct test, list);
+ if (sync == TEST_SYNC_RCU)
+ call_rcu(&node->rcu, free_node_cb);
+ else
+ free(node);
+ URCU_TLS(nr_successful_dequeues)++;
+ URCU_TLS(nr_dequeues)++;
+ }
+
+}
+
+static void *thr_dequeuer(void *_count)