linux/include/linux/rcu_sync.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * RCU-based infrastructure for lightweight reader-writer locking
   4 *
   5 * Copyright (c) 2015, Red Hat, Inc.
   6 *
   7 * Author: Oleg Nesterov <oleg@redhat.com>
   8 */
   9
  10#ifndef _LINUX_RCU_SYNC_H_
  11#define _LINUX_RCU_SYNC_H_
  12
  13#include <linux/wait.h>
  14#include <linux/rcupdate.h>
  15
  16/* Structure to mediate between updaters and fastpath-using readers.  */
  17struct rcu_sync {
  18        int                     gp_state;
  19        int                     gp_count;
  20        wait_queue_head_t       gp_wait;
  21
  22        struct rcu_head         cb_head;
  23};
  24
  25/**
  26 * rcu_sync_is_idle() - Are readers permitted to use their fastpaths?
  27 * @rsp: Pointer to rcu_sync structure to use for synchronization
  28 *
  29 * Returns true if readers are permitted to use their fastpaths.  Must be
  30 * invoked within some flavor of RCU read-side critical section.
  31 */
  32static inline bool rcu_sync_is_idle(struct rcu_sync *rsp)
  33{
  34        RCU_LOCKDEP_WARN(!rcu_read_lock_any_held(),
  35                         "suspicious rcu_sync_is_idle() usage");
  36        return !READ_ONCE(rsp->gp_state); /* GP_IDLE */
  37}
  38
  39extern void rcu_sync_init(struct rcu_sync *);
  40extern void rcu_sync_enter_start(struct rcu_sync *);
  41extern void rcu_sync_enter(struct rcu_sync *);
  42extern void rcu_sync_exit(struct rcu_sync *);
  43extern void rcu_sync_dtor(struct rcu_sync *);
  44
  45#define __RCU_SYNC_INITIALIZER(name) {                                  \
  46                .gp_state = 0,                                          \
  47                .gp_count = 0,                                          \
  48                .gp_wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.gp_wait), \
  49        }
  50
  51#define DEFINE_RCU_SYNC(name)   \
  52        struct rcu_sync name = __RCU_SYNC_INITIALIZER(name)
  53
  54#endif /* _LINUX_RCU_SYNC_H_ */
  55