mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-26 14:17:26 -04:00
srcu: Merge ->srcu_state into ->srcu_gp_seq
Updating ->srcu_state and ->srcu_gp_seq will lead to extremely complex race conditions given multiple callback queues, so this commit takes advantage of the two-bit state now available in rcu_seq counters to store the state in the bottom two bits of ->srcu_gp_seq. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This commit is contained in:
parent
f1ec57a462
commit
80a7956fe3
3 changed files with 46 additions and 24 deletions
|
@ -43,8 +43,7 @@ struct srcu_struct {
|
|||
unsigned long completed;
|
||||
unsigned long srcu_gp_seq;
|
||||
struct srcu_array __percpu *per_cpu_ref;
|
||||
spinlock_t queue_lock; /* protect ->srcu_cblist, ->srcu_state */
|
||||
int srcu_state;
|
||||
spinlock_t queue_lock; /* protect ->srcu_cblist */
|
||||
struct rcu_segcblist srcu_cblist;
|
||||
struct delayed_work work;
|
||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
||||
|
@ -56,7 +55,6 @@ struct srcu_struct {
|
|||
#define SRCU_STATE_IDLE 0
|
||||
#define SRCU_STATE_SCAN1 1
|
||||
#define SRCU_STATE_SCAN2 2
|
||||
#define SRCU_STATE_DONE 3
|
||||
|
||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
||||
|
||||
|
@ -85,7 +83,6 @@ void process_srcu(struct work_struct *work);
|
|||
.completed = -300, \
|
||||
.per_cpu_ref = &name##_srcu_array, \
|
||||
.queue_lock = __SPIN_LOCK_UNLOCKED(name.queue_lock), \
|
||||
.srcu_state = SRCU_STATE_IDLE, \
|
||||
.srcu_cblist = RCU_SEGCBLIST_INITIALIZER(name.srcu_cblist),\
|
||||
.work = __DELAYED_WORK_INITIALIZER(name.work, process_srcu, 0),\
|
||||
__SRCU_DEP_MAP_INIT(name) \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue