-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch implements a new version of RCU which allows its read-side critical sections to be preempted. It uses a set of counter pairs to keep track of the read-side critical sections and flips them when all tasks exit read-side critical section. The details of this implementation can be found in this paper - http://www.rdrop.com/users/paulmck/RCU/OLSrtRCU.2006.08.11a.pdf and the article- http://lwn.net/Articles/253651/ This patch was developed as a part of the -rt kernel development and meant to provide better latencies when read-side critical sections of RCU don't disable preemption. As a consequence of keeping track of RCU readers, the readers have a slight overhead (optimizations in the paper). This implementation co-exists with the "classic" RCU implementations and can be switched to at compiler. Also includes RCU tracing summarized in debugfs. [ akpm@linux-foundation.org: build fixes on non-preempt architectures ] Signed-off-by: Gautham R Shenoy <ego@in.ibm.com> Signed-off-by: Dipankar Sarma <dipankar@in.ibm.com> Signed-off-by: Paul E. McKenney <paulmck@us.ibm.com> Reviewed-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
- Loading branch information
Paul E. McKenney
authored and
Ingo Molnar
committed
Jan 25, 2008
1 parent
e0ecfa7
commit e260be6
Showing
13 changed files
with
1,394 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2130,4 +2130,3 @@ source "fs/nls/Kconfig" | |
source "fs/dlm/Kconfig" | ||
|
||
endmenu | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/* | ||
* Read-Copy Update mechanism for mutual exclusion (RT implementation) | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
* | ||
* Copyright (C) IBM Corporation, 2006 | ||
* | ||
* Author: Paul McKenney <paulmck@us.ibm.com> | ||
* | ||
* Based on the original work by Paul McKenney <paul.mckenney@us.ibm.com> | ||
* and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen. | ||
* Papers: | ||
* http://www.rdrop.com/users/paulmck/paper/rclockpdcsproof.pdf | ||
* http://lse.sourceforge.net/locking/rclock_OLS.2001.05.01c.sc.pdf (OLS2001) | ||
* | ||
* For detailed explanation of Read-Copy Update mechanism see - | ||
* Documentation/RCU | ||
* | ||
*/ | ||
|
||
#ifndef __LINUX_RCUPREEMPT_H | ||
#define __LINUX_RCUPREEMPT_H | ||
|
||
#ifdef __KERNEL__ | ||
|
||
#include <linux/cache.h> | ||
#include <linux/spinlock.h> | ||
#include <linux/threads.h> | ||
#include <linux/percpu.h> | ||
#include <linux/cpumask.h> | ||
#include <linux/seqlock.h> | ||
|
||
#define rcu_qsctr_inc(cpu) | ||
#define rcu_bh_qsctr_inc(cpu) | ||
#define call_rcu_bh(head, rcu) call_rcu(head, rcu) | ||
|
||
extern void __rcu_read_lock(void); | ||
extern void __rcu_read_unlock(void); | ||
extern int rcu_pending(int cpu); | ||
extern int rcu_needs_cpu(int cpu); | ||
|
||
#define __rcu_read_lock_bh() { rcu_read_lock(); local_bh_disable(); } | ||
#define __rcu_read_unlock_bh() { local_bh_enable(); rcu_read_unlock(); } | ||
|
||
extern void __synchronize_sched(void); | ||
|
||
extern void __rcu_init(void); | ||
extern void rcu_check_callbacks(int cpu, int user); | ||
extern void rcu_restart_cpu(int cpu); | ||
extern long rcu_batches_completed(void); | ||
|
||
/* | ||
* Return the number of RCU batches processed thus far. Useful for debug | ||
* and statistic. The _bh variant is identifcal to straight RCU | ||
*/ | ||
static inline long rcu_batches_completed_bh(void) | ||
{ | ||
return rcu_batches_completed(); | ||
} | ||
|
||
#ifdef CONFIG_RCU_TRACE | ||
struct rcupreempt_trace; | ||
extern long *rcupreempt_flipctr(int cpu); | ||
extern long rcupreempt_data_completed(void); | ||
extern int rcupreempt_flip_flag(int cpu); | ||
extern int rcupreempt_mb_flag(int cpu); | ||
extern char *rcupreempt_try_flip_state_name(void); | ||
extern struct rcupreempt_trace *rcupreempt_trace_cpu(int cpu); | ||
#endif | ||
|
||
struct softirq_action; | ||
|
||
#endif /* __KERNEL__ */ | ||
#endif /* __LINUX_RCUPREEMPT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
/* | ||
* Read-Copy Update mechanism for mutual exclusion (RT implementation) | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
* | ||
* Copyright (C) IBM Corporation, 2006 | ||
* | ||
* Author: Paul McKenney <paulmck@us.ibm.com> | ||
* | ||
* Based on the original work by Paul McKenney <paul.mckenney@us.ibm.com> | ||
* and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen. | ||
* Papers: | ||
* http://www.rdrop.com/users/paulmck/paper/rclockpdcsproof.pdf | ||
* http://lse.sourceforge.net/locking/rclock_OLS.2001.05.01c.sc.pdf (OLS2001) | ||
* | ||
* For detailed explanation of the Preemptible Read-Copy Update mechanism see - | ||
* http://lwn.net/Articles/253651/ | ||
*/ | ||
|
||
#ifndef __LINUX_RCUPREEMPT_TRACE_H | ||
#define __LINUX_RCUPREEMPT_TRACE_H | ||
|
||
#ifdef __KERNEL__ | ||
#include <linux/types.h> | ||
#include <linux/kernel.h> | ||
|
||
#include <asm/atomic.h> | ||
|
||
/* | ||
* PREEMPT_RCU data structures. | ||
*/ | ||
|
||
struct rcupreempt_trace { | ||
long next_length; | ||
long next_add; | ||
long wait_length; | ||
long wait_add; | ||
long done_length; | ||
long done_add; | ||
long done_remove; | ||
atomic_t done_invoked; | ||
long rcu_check_callbacks; | ||
atomic_t rcu_try_flip_1; | ||
atomic_t rcu_try_flip_e1; | ||
long rcu_try_flip_i1; | ||
long rcu_try_flip_ie1; | ||
long rcu_try_flip_g1; | ||
long rcu_try_flip_a1; | ||
long rcu_try_flip_ae1; | ||
long rcu_try_flip_a2; | ||
long rcu_try_flip_z1; | ||
long rcu_try_flip_ze1; | ||
long rcu_try_flip_z2; | ||
long rcu_try_flip_m1; | ||
long rcu_try_flip_me1; | ||
long rcu_try_flip_m2; | ||
}; | ||
|
||
#ifdef CONFIG_RCU_TRACE | ||
#define RCU_TRACE(fn, arg) fn(arg); | ||
#else | ||
#define RCU_TRACE(fn, arg) | ||
#endif | ||
|
||
extern void rcupreempt_trace_move2done(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_move2wait(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_e1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_i1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_ie1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_g1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_a1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_ae1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_a2(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_z1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_ze1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_z2(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_m1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_me1(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_try_flip_m2(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_check_callbacks(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_done_remove(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_invoke(struct rcupreempt_trace *trace); | ||
extern void rcupreempt_trace_next_add(struct rcupreempt_trace *trace); | ||
|
||
#endif /* __KERNEL__ */ | ||
#endif /* __LINUX_RCUPREEMPT_TRACE_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.