rcupdate.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:10k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Read-Copy Update mechanism for mutual exclusion 
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify
  5.  * it under the terms of the GNU General Public License as published by
  6.  * the Free Software Foundation; either version 2 of the License, or
  7.  * (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17.  *
  18.  * Copyright (C) IBM Corporation, 2001
  19.  *
  20.  * Author: Dipankar Sarma <dipankar@in.ibm.com>
  21.  * 
  22.  * Based on the original work by Paul McKenney <paul.mckenney@us.ibm.com>
  23.  * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen.
  24.  * Papers:
  25.  * http://www.rdrop.com/users/paulmck/paper/rclockpdcsproof.pdf
  26.  * http://lse.sourceforge.net/locking/rclock_OLS.2001.05.01c.sc.pdf (OLS2001)
  27.  *
  28.  * For detailed explanation of Read-Copy Update mechanism see -
  29.  *  http://lse.sourceforge.net/locking/rcupdate.html
  30.  *
  31.  */
  32. #ifndef __LINUX_RCUPDATE_H
  33. #define __LINUX_RCUPDATE_H
  34. #ifdef __KERNEL__
  35. #include <linux/cache.h>
  36. #include <linux/spinlock.h>
  37. #include <linux/threads.h>
  38. #include <linux/percpu.h>
  39. #include <linux/cpumask.h>
  40. #include <linux/seqlock.h>
  41. /**
  42.  * struct rcu_head - callback structure for use with RCU
  43.  * @next: next update requests in a list
  44.  * @func: actual update function to call after the grace period.
  45.  */
  46. struct rcu_head {
  47. struct rcu_head *next;
  48. void (*func)(struct rcu_head *head);
  49. };
  50. #define RCU_HEAD_INIT  { .next = NULL, .func = NULL }
  51. #define RCU_HEAD(head) struct rcu_head head = RCU_HEAD_INIT
  52. #define INIT_RCU_HEAD(ptr) do { 
  53.        (ptr)->next = NULL; (ptr)->func = NULL; 
  54. } while (0)
  55. /* Global control variables for rcupdate callback mechanism. */
  56. struct rcu_ctrlblk {
  57. long cur; /* Current batch number.                      */
  58. long completed; /* Number of the last completed batch         */
  59. int next_pending; /* Is the next batch already waiting?         */
  60. } ____cacheline_maxaligned_in_smp;
  61. /* Is batch a before batch b ? */
  62. static inline int rcu_batch_before(long a, long b)
  63. {
  64.         return (a - b) < 0;
  65. }
  66. /* Is batch a after batch b ? */
  67. static inline int rcu_batch_after(long a, long b)
  68. {
  69.         return (a - b) > 0;
  70. }
  71. /*
  72.  * Per-CPU data for Read-Copy UPdate.
  73.  * nxtlist - new callbacks are added here
  74.  * curlist - current batch for which quiescent cycle started if any
  75.  */
  76. struct rcu_data {
  77. /* 1) quiescent state handling : */
  78. long quiescbatch;     /* Batch # for grace period */
  79. int passed_quiesc;  /* User-mode/idle loop etc. */
  80. int qs_pending;  /* core waits for quiesc state */
  81. /* 2) batch handling */
  82. long           batch;           /* Batch # for current RCU batch */
  83. struct rcu_head *nxtlist;
  84. struct rcu_head **nxttail;
  85. long            count; /* # of queued items */
  86. struct rcu_head *curlist;
  87. struct rcu_head **curtail;
  88. struct rcu_head *donelist;
  89. struct rcu_head **donetail;
  90. int cpu;
  91. };
  92. DECLARE_PER_CPU(struct rcu_data, rcu_data);
  93. DECLARE_PER_CPU(struct rcu_data, rcu_bh_data);
  94. extern struct rcu_ctrlblk rcu_ctrlblk;
  95. extern struct rcu_ctrlblk rcu_bh_ctrlblk;
  96. /*
  97.  * Increment the quiescent state counter.
  98.  * The counter is a bit degenerated: We do not need to know
  99.  * how many quiescent states passed, just if there was at least
  100.  * one since the start of the grace period. Thus just a flag.
  101.  */
  102. static inline void rcu_qsctr_inc(int cpu)
  103. {
  104. struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
  105. rdp->passed_quiesc = 1;
  106. }
  107. static inline void rcu_bh_qsctr_inc(int cpu)
  108. {
  109. struct rcu_data *rdp = &per_cpu(rcu_bh_data, cpu);
  110. rdp->passed_quiesc = 1;
  111. }
  112. static inline int __rcu_pending(struct rcu_ctrlblk *rcp,
  113. struct rcu_data *rdp)
  114. {
  115. /* This cpu has pending rcu entries and the grace period
  116.  * for them has completed.
  117.  */
  118. if (rdp->curlist && !rcu_batch_before(rcp->completed, rdp->batch))
  119. return 1;
  120. /* This cpu has no pending entries, but there are new entries */
  121. if (!rdp->curlist && rdp->nxtlist)
  122. return 1;
  123. /* This cpu has finished callbacks to invoke */
  124. if (rdp->donelist)
  125. return 1;
  126. /* The rcu core waits for a quiescent state from the cpu */
  127. if (rdp->quiescbatch != rcp->cur || rdp->qs_pending)
  128. return 1;
  129. /* nothing to do */
  130. return 0;
  131. }
  132. static inline int rcu_pending(int cpu)
  133. {
  134. return __rcu_pending(&rcu_ctrlblk, &per_cpu(rcu_data, cpu)) ||
  135. __rcu_pending(&rcu_bh_ctrlblk, &per_cpu(rcu_bh_data, cpu));
  136. }
  137. /**
  138.  * rcu_read_lock - mark the beginning of an RCU read-side critical section.
  139.  *
  140.  * When synchronize_rcu() is invoked on one CPU while other CPUs
  141.  * are within RCU read-side critical sections, then the
  142.  * synchronize_rcu() is guaranteed to block until after all the other
  143.  * CPUs exit their critical sections.  Similarly, if call_rcu() is invoked
  144.  * on one CPU while other CPUs are within RCU read-side critical
  145.  * sections, invocation of the corresponding RCU callback is deferred
  146.  * until after the all the other CPUs exit their critical sections.
  147.  *
  148.  * Note, however, that RCU callbacks are permitted to run concurrently
  149.  * with RCU read-side critical sections.  One way that this can happen
  150.  * is via the following sequence of events: (1) CPU 0 enters an RCU
  151.  * read-side critical section, (2) CPU 1 invokes call_rcu() to register
  152.  * an RCU callback, (3) CPU 0 exits the RCU read-side critical section,
  153.  * (4) CPU 2 enters a RCU read-side critical section, (5) the RCU
  154.  * callback is invoked.  This is legal, because the RCU read-side critical
  155.  * section that was running concurrently with the call_rcu() (and which
  156.  * therefore might be referencing something that the corresponding RCU
  157.  * callback would free up) has completed before the corresponding
  158.  * RCU callback is invoked.
  159.  *
  160.  * RCU read-side critical sections may be nested.  Any deferred actions
  161.  * will be deferred until the outermost RCU read-side critical section
  162.  * completes.
  163.  *
  164.  * It is illegal to block while in an RCU read-side critical section.
  165.  */
  166. #define rcu_read_lock() preempt_disable()
  167. /**
  168.  * rcu_read_unlock - marks the end of an RCU read-side critical section.
  169.  *
  170.  * See rcu_read_lock() for more information.
  171.  */
  172. #define rcu_read_unlock() preempt_enable()
  173. /*
  174.  * So where is rcu_write_lock()?  It does not exist, as there is no
  175.  * way for writers to lock out RCU readers.  This is a feature, not
  176.  * a bug -- this property is what provides RCU's performance benefits.
  177.  * Of course, writers must coordinate with each other.  The normal
  178.  * spinlock primitives work well for this, but any other technique may be
  179.  * used as well.  RCU does not care how the writers keep out of each
  180.  * others' way, as long as they do so.
  181.  */
  182. /**
  183.  * rcu_read_lock_bh - mark the beginning of a softirq-only RCU critical section
  184.  *
  185.  * This is equivalent of rcu_read_lock(), but to be used when updates
  186.  * are being done using call_rcu_bh(). Since call_rcu_bh() callbacks
  187.  * consider completion of a softirq handler to be a quiescent state,
  188.  * a process in RCU read-side critical section must be protected by
  189.  * disabling softirqs. Read-side critical sections in interrupt context
  190.  * can use just rcu_read_lock().
  191.  *
  192.  */
  193. #define rcu_read_lock_bh() local_bh_disable()
  194. /*
  195.  * rcu_read_unlock_bh - marks the end of a softirq-only RCU critical section
  196.  *
  197.  * See rcu_read_lock_bh() for more information.
  198.  */
  199. #define rcu_read_unlock_bh() local_bh_enable()
  200. /**
  201.  * rcu_dereference - fetch an RCU-protected pointer in an
  202.  * RCU read-side critical section.  This pointer may later
  203.  * be safely dereferenced.
  204.  *
  205.  * Inserts memory barriers on architectures that require them
  206.  * (currently only the Alpha), and, more importantly, documents
  207.  * exactly which pointers are protected by RCU.
  208.  */
  209. #define rcu_dereference(p)     ({ 
  210. typeof(p) _________p1 = p; 
  211. smp_read_barrier_depends(); 
  212. (_________p1); 
  213. })
  214. /**
  215.  * rcu_assign_pointer - assign (publicize) a pointer to a newly
  216.  * initialized structure that will be dereferenced by RCU read-side
  217.  * critical sections.  Returns the value assigned.
  218.  *
  219.  * Inserts memory barriers on architectures that require them
  220.  * (pretty much all of them other than x86), and also prevents
  221.  * the compiler from reordering the code that initializes the
  222.  * structure after the pointer assignment.  More importantly, this
  223.  * call documents which pointers will be dereferenced by RCU read-side
  224.  * code.
  225.  */
  226. #define rcu_assign_pointer(p, v) ({ 
  227. smp_wmb(); 
  228. (p) = (v); 
  229. })
  230. /**
  231.  * synchronize_sched - block until all CPUs have exited any non-preemptive
  232.  * kernel code sequences.
  233.  *
  234.  * This means that all preempt_disable code sequences, including NMI and
  235.  * hardware-interrupt handlers, in progress on entry will have completed
  236.  * before this primitive returns.  However, this does not guarantee that
  237.  * softirq handlers will have completed, since in some kernels
  238.  *
  239.  * This primitive provides the guarantees made by the (deprecated)
  240.  * synchronize_kernel() API.  In contrast, synchronize_rcu() only
  241.  * guarantees that rcu_read_lock() sections will have completed.
  242.  */
  243. #define synchronize_sched() synchronize_rcu()
  244. extern void rcu_init(void);
  245. extern void rcu_check_callbacks(int cpu, int user);
  246. extern void rcu_restart_cpu(int cpu);
  247. /* Exported interfaces */
  248. extern void FASTCALL(call_rcu(struct rcu_head *head, 
  249. void (*func)(struct rcu_head *head)));
  250. extern void FASTCALL(call_rcu_bh(struct rcu_head *head,
  251. void (*func)(struct rcu_head *head)));
  252. extern __deprecated_for_modules void synchronize_kernel(void);
  253. extern void synchronize_rcu(void);
  254. void synchronize_idle(void);
  255. #endif /* __KERNEL__ */
  256. #endif /* __LINUX_RCUPDATE_H */