Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1240726
| From | "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH tip/core/rcu 08/13] rcu_sync: Introduce rcu_sync_dtor() |
| Date | 2015-10-06 18:50 +0200 |
| Message-ID | <qgDBa-3mf-53@gated-at.bofh.it> (permalink) |
| References | <qgDB7-3mf-3@gated-at.bofh.it> <qgDB8-3mf-21@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
From: Oleg Nesterov <oleg@redhat.com>
This commit allows rcu_sync structures to be safely deallocated,
The trick is to add a new ->wait field to the gp_ops array.
This field is a pointer to the rcu_barrier() function corresponding
to the flavor of RCU in question. This allows a new rcu_sync_dtor()
to wait for any outstanding callbacks before freeing the rcu_sync
structure.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
---
include/linux/rcu_sync.h | 1 +
kernel/rcu/sync.c | 26 ++++++++++++++++++++++++++
2 files changed, 27 insertions(+)
diff --git a/include/linux/rcu_sync.h b/include/linux/rcu_sync.h
index 1f2d4fc30b04..8069d6468bc4 100644
--- a/include/linux/rcu_sync.h
+++ b/include/linux/rcu_sync.h
@@ -62,6 +62,7 @@ static inline bool rcu_sync_is_idle(struct rcu_sync *rsp)
extern void rcu_sync_init(struct rcu_sync *, enum rcu_sync_type);
extern void rcu_sync_enter(struct rcu_sync *);
extern void rcu_sync_exit(struct rcu_sync *);
+extern void rcu_sync_dtor(struct rcu_sync *);
#define __RCU_SYNC_INITIALIZER(name, type) { \
.gp_state = 0, \
diff --git a/kernel/rcu/sync.c b/kernel/rcu/sync.c
index 01c9807a7f73..1e353f0a2b66 100644
--- a/kernel/rcu/sync.c
+++ b/kernel/rcu/sync.c
@@ -32,6 +32,7 @@
static const struct {
void (*sync)(void);
void (*call)(struct rcu_head *, void (*)(struct rcu_head *));
+ void (*wait)(void);
#ifdef CONFIG_PROVE_RCU
int (*held)(void);
#endif
@@ -39,16 +40,19 @@ static const struct {
[RCU_SYNC] = {
.sync = synchronize_rcu,
.call = call_rcu,
+ .wait = rcu_barrier,
__INIT_HELD(rcu_read_lock_held)
},
[RCU_SCHED_SYNC] = {
.sync = synchronize_sched,
.call = call_rcu_sched,
+ .wait = rcu_barrier_sched,
__INIT_HELD(rcu_read_lock_sched_held)
},
[RCU_BH_SYNC] = {
.sync = synchronize_rcu_bh,
.call = call_rcu_bh,
+ .wait = rcu_barrier_bh,
__INIT_HELD(rcu_read_lock_bh_held)
},
};
@@ -195,3 +199,25 @@ void rcu_sync_exit(struct rcu_sync *rsp)
}
spin_unlock_irq(&rsp->rss_lock);
}
+
+/**
+ * rcu_sync_dtor() - Clean up an rcu_sync structure
+ * @rsp: Pointer to rcu_sync structure to be cleaned up
+ */
+void rcu_sync_dtor(struct rcu_sync *rsp)
+{
+ int cb_state;
+
+ BUG_ON(rsp->gp_count);
+
+ spin_lock_irq(&rsp->rss_lock);
+ if (rsp->cb_state == CB_REPLAY)
+ rsp->cb_state = CB_PENDING;
+ cb_state = rsp->cb_state;
+ spin_unlock_irq(&rsp->rss_lock);
+
+ if (cb_state != CB_IDLE) {
+ gp_ops[rsp->gp_type].wait();
+ BUG_ON(rsp->cb_state != CB_IDLE);
+ }
+}
--
2.5.2
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH tip/core/rcu 0/13] percpu-rwsem patches for 4.4 "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 02/13] locking/percpu-rwsem: Export symbols for locktorture "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 07/13] rcu_sync: Add CONFIG_PROVE_RCU checks "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 05/13] rcu: Create rcu_sync infrastructure "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 01/13] locktorture: Support rtmutex torturing "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 09/13] locking/percpu-rwsem: Make percpu_free_rwsem() after kzalloc() safe "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 04/13] torture: Consolidate cond_resched_rcu_qs() into stutter_wait() "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 12/13] locking/percpu-rwsem: Clean up the lockdep annotations in percpu_down_read() "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 08/13] rcu_sync: Introduce rcu_sync_dtor() "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 06/13] rcu_sync: Simplify rcu_sync using new rcu_sync_ops structure "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 11/13] locking/percpu-rwsem: Fix the comments outdated by rcu_sync "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 18:50 +0200
[PATCH tip/core/rcu 13/13] rcu_sync: Cleanup the CONFIG_PROVE_RCU checks "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 19:00 +0200
[PATCH tip/core/rcu 03/13] locktorture: Add torture tests for percpu_rwsem "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 19:00 +0200
[PATCH tip/core/rcu 10/13] locking/percpu-rwsem: Make use of the rcu_sync infrastructure "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 19:00 +0200
Re: [PATCH tip/core/rcu 0/13] percpu-rwsem patches for 4.4 Josh Triplett <josh@joshtriplett.org> - 2015-10-06 19:50 +0200
Re: [PATCH tip/core/rcu 0/13] percpu-rwsem patches for 4.4 Oleg Nesterov <oleg@redhat.com> - 2015-10-06 21:00 +0200
Re: [PATCH tip/core/rcu 0/13] percpu-rwsem patches for 4.4 "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-10-06 21:40 +0200
Re: [PATCH tip/core/rcu 0/13] percpu-rwsem patches for 4.4 Josh Triplett <josh@joshtriplett.org> - 2015-10-06 22:40 +0200
csiph-web