Commit 140e53f2 authored by Paul E. McKenney's avatar Paul E. McKenney

rcutorture: Add cond_resched() to forward-progress free-up loop

The rcu_torture_fwd_prog_cbfree() function frees callbacks used during
rcutorture's call_rcu() forward-progress test, but does so in a tight
loop.  This could cause problems given a very long list of callbacks to be
freed, and actual testing produces lists with as many as 25M callbacks.
This commit therefore adds a cond_resched() to this loop.  While in
the area, this commit also rearranges the lock releases to look a bit
more sane.
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.ibm.com>
parent dd064c35
...@@ -1674,16 +1674,18 @@ static unsigned long rcu_torture_fwd_prog_cbfree(void) ...@@ -1674,16 +1674,18 @@ static unsigned long rcu_torture_fwd_prog_cbfree(void)
for (;;) { for (;;) {
spin_lock_irqsave(&rcu_fwd_lock, flags); spin_lock_irqsave(&rcu_fwd_lock, flags);
rfcp = rcu_fwd_cb_head; rfcp = rcu_fwd_cb_head;
if (!rfcp) if (!rfcp) {
spin_unlock_irqrestore(&rcu_fwd_lock, flags);
break; break;
}
rcu_fwd_cb_head = rfcp->rfc_next; rcu_fwd_cb_head = rfcp->rfc_next;
if (!rcu_fwd_cb_head) if (!rcu_fwd_cb_head)
rcu_fwd_cb_tail = &rcu_fwd_cb_head; rcu_fwd_cb_tail = &rcu_fwd_cb_head;
spin_unlock_irqrestore(&rcu_fwd_lock, flags); spin_unlock_irqrestore(&rcu_fwd_lock, flags);
kfree(rfcp); kfree(rfcp);
freed++; freed++;
cond_resched();
} }
spin_unlock_irqrestore(&rcu_fwd_lock, flags);
return freed; return freed;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment