forked from torvalds/linux
-
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.
In response to automated complaints about modifications to SRCU increasing its size, this commit creates a tiny SRCU that is used in SMP=n && PREEMPT=n builds. Signed-off-by: Paul E. McKenney <[email protected]>
- Loading branch information
Showing
7 changed files
with
411 additions
and
62 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
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,81 @@ | ||
/* | ||
* Sleepable Read-Copy Update mechanism for mutual exclusion, | ||
* tiny variant. | ||
* | ||
* 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, you can access it online at | ||
* http://www.gnu.org/licenses/gpl-2.0.html. | ||
* | ||
* Copyright (C) IBM Corporation, 2017 | ||
* | ||
* Author: Paul McKenney <[email protected]> | ||
*/ | ||
|
||
#ifndef _LINUX_SRCU_TINY_H | ||
#define _LINUX_SRCU_TINY_H | ||
|
||
#include <linux/swait.h> | ||
|
||
struct srcu_struct { | ||
int srcu_lock_nesting[2]; /* srcu_read_lock() nesting depth. */ | ||
struct swait_queue_head srcu_wq; | ||
/* Last srcu_read_unlock() wakes GP. */ | ||
unsigned long srcu_gp_seq; /* GP seq # for callback tagging. */ | ||
struct rcu_segcblist srcu_cblist; | ||
/* Pending SRCU callbacks. */ | ||
int srcu_idx; /* Current reader array element. */ | ||
bool srcu_gp_running; /* GP workqueue running? */ | ||
bool srcu_gp_waiting; /* GP waiting for readers? */ | ||
struct work_struct srcu_work; /* For driving grace periods. */ | ||
#ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
struct lockdep_map dep_map; | ||
#endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | ||
}; | ||
|
||
void srcu_drive_gp(struct work_struct *wp); | ||
|
||
#define __SRCU_STRUCT_INIT(name) \ | ||
{ \ | ||
.srcu_wq = __SWAIT_QUEUE_HEAD_INITIALIZER(name.srcu_wq), \ | ||
.srcu_cblist = RCU_SEGCBLIST_INITIALIZER(name.srcu_cblist), \ | ||
.srcu_work = __WORK_INITIALIZER(name.srcu_work, srcu_drive_gp), \ | ||
__SRCU_DEP_MAP_INIT(name) \ | ||
} | ||
|
||
/* | ||
* This odd _STATIC_ arrangement is needed for API compatibility with | ||
* Tree SRCU, which needs some per-CPU data. | ||
*/ | ||
#define DEFINE_SRCU(name) \ | ||
struct srcu_struct name = __SRCU_STRUCT_INIT(name) | ||
#define DEFINE_STATIC_SRCU(name) \ | ||
static struct srcu_struct name = __SRCU_STRUCT_INIT(name) | ||
|
||
void synchronize_srcu(struct srcu_struct *sp); | ||
|
||
static inline void synchronize_srcu_expedited(struct srcu_struct *sp) | ||
{ | ||
synchronize_srcu(sp); | ||
} | ||
|
||
static inline void srcu_barrier(struct srcu_struct *sp) | ||
{ | ||
synchronize_srcu(sp); | ||
} | ||
|
||
static inline unsigned long srcu_batches_completed(struct srcu_struct *sp) | ||
{ | ||
return 0; | ||
} | ||
|
||
#endif |
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,91 @@ | ||
/* | ||
* Sleepable Read-Copy Update mechanism for mutual exclusion, | ||
* tree variant. | ||
* | ||
* 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, you can access it online at | ||
* http://www.gnu.org/licenses/gpl-2.0.html. | ||
* | ||
* Copyright (C) IBM Corporation, 2017 | ||
* | ||
* Author: Paul McKenney <[email protected]> | ||
*/ | ||
|
||
#ifndef _LINUX_SRCU_TREE_H | ||
#define _LINUX_SRCU_TREE_H | ||
|
||
struct srcu_array { | ||
unsigned long lock_count[2]; | ||
unsigned long unlock_count[2]; | ||
}; | ||
|
||
struct srcu_struct { | ||
unsigned long completed; | ||
unsigned long srcu_gp_seq; | ||
atomic_t srcu_exp_cnt; | ||
struct srcu_array __percpu *per_cpu_ref; | ||
spinlock_t queue_lock; /* protect ->srcu_cblist */ | ||
struct rcu_segcblist srcu_cblist; | ||
struct delayed_work work; | ||
#ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
struct lockdep_map dep_map; | ||
#endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | ||
}; | ||
|
||
/* Values for -> state variable. */ | ||
#define SRCU_STATE_IDLE 0 | ||
#define SRCU_STATE_SCAN1 1 | ||
#define SRCU_STATE_SCAN2 2 | ||
|
||
void process_srcu(struct work_struct *work); | ||
|
||
#define __SRCU_STRUCT_INIT(name) \ | ||
{ \ | ||
.completed = -300, \ | ||
.per_cpu_ref = &name##_srcu_array, \ | ||
.queue_lock = __SPIN_LOCK_UNLOCKED(name.queue_lock), \ | ||
.srcu_cblist = RCU_SEGCBLIST_INITIALIZER(name.srcu_cblist),\ | ||
.work = __DELAYED_WORK_INITIALIZER(name.work, process_srcu, 0),\ | ||
__SRCU_DEP_MAP_INIT(name) \ | ||
} | ||
|
||
/* | ||
* Define and initialize a srcu struct at build time. | ||
* Do -not- call init_srcu_struct() nor cleanup_srcu_struct() on it. | ||
* | ||
* Note that although DEFINE_STATIC_SRCU() hides the name from other | ||
* files, the per-CPU variable rules nevertheless require that the | ||
* chosen name be globally unique. These rules also prohibit use of | ||
* DEFINE_STATIC_SRCU() within a function. If these rules are too | ||
* restrictive, declare the srcu_struct manually. For example, in | ||
* each file: | ||
* | ||
* static struct srcu_struct my_srcu; | ||
* | ||
* Then, before the first use of each my_srcu, manually initialize it: | ||
* | ||
* init_srcu_struct(&my_srcu); | ||
* | ||
* See include/linux/percpu-defs.h for the rules on per-CPU variables. | ||
*/ | ||
#define __DEFINE_SRCU(name, is_static) \ | ||
static DEFINE_PER_CPU(struct srcu_array, name##_srcu_array);\ | ||
is_static struct srcu_struct name = __SRCU_STRUCT_INIT(name) | ||
#define DEFINE_SRCU(name) __DEFINE_SRCU(name, /* not static */) | ||
#define DEFINE_STATIC_SRCU(name) __DEFINE_SRCU(name, static) | ||
|
||
void synchronize_srcu_expedited(struct srcu_struct *sp); | ||
void srcu_barrier(struct srcu_struct *sp); | ||
unsigned long srcu_batches_completed(struct srcu_struct *sp); | ||
|
||
#endif |
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.