Blob Blame History Raw
From: Mike Galbraith <mgalbraith@suse.de>
Date: Wed Aug  2 10:55:41 CEST 2017
Subject: srcu: make tree_scru RT aware
Patch-mainline: Never, RT specific
References: SLE Realtime Extension

Signed-off-by: Mike Galbraith <mgalbraith@suse.de>
---
 kernel/rcu/srcutree.c |   10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

--- a/kernel/rcu/srcutree.c
+++ b/kernel/rcu/srcutree.c
@@ -444,12 +444,12 @@ static bool srcu_queue_delayed_work_on(i
 {
 	bool ret;
 
-	preempt_disable();
+	migrate_disable();
 	if (READ_ONCE(per_cpu(srcu_online, cpu)))
 		ret = queue_delayed_work_on(cpu, wq, dwork, delay);
 	else
 		ret = queue_delayed_work(wq, dwork, delay);
-	preempt_enable();
+	migrate_enable();
 	return ret;
 }
 
@@ -798,9 +798,8 @@ void __call_srcu(struct srcu_struct *sp,
 
 	check_init_srcu_struct(sp);
 	rhp->func = func;
-	local_irq_save(flags);
-	sdp = this_cpu_ptr(sp->sda);
-	spin_lock(&sdp->lock);
+	sdp = get_local_ptr(sp->sda);
+	spin_lock_irqsave(&sdp->lock, flags);
 	rcu_segcblist_enqueue(&sdp->srcu_cblist, rhp, false);
 	rcu_segcblist_advance(&sdp->srcu_cblist,
 			      rcu_seq_current(&sp->srcu_gp_seq));
@@ -815,6 +814,7 @@ void __call_srcu(struct srcu_struct *sp,
 		needexp = true;
 	}
 	spin_unlock_irqrestore(&sdp->lock, flags);
+	put_local_ptr(sp->sda);
 	if (needgp)
 		srcu_funnel_gp_start(sp, sdp, s, do_norm);
 	else if (needexp)