[PATCH] rcu: keep rcu callback event counter
This makes call_rcu() keep track of how many events there are on the RCU list, and cause a reschedule event when the list gets too long. This helps keep RCU event lists down. Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
cc675230a9
commit
5ee832dbc6
2 changed files with 12 additions and 0 deletions
|
@ -94,6 +94,7 @@ struct rcu_data {
|
||||||
long batch; /* Batch # for current RCU batch */
|
long batch; /* Batch # for current RCU batch */
|
||||||
struct rcu_head *nxtlist;
|
struct rcu_head *nxtlist;
|
||||||
struct rcu_head **nxttail;
|
struct rcu_head **nxttail;
|
||||||
|
long count; /* # of queued items */
|
||||||
struct rcu_head *curlist;
|
struct rcu_head *curlist;
|
||||||
struct rcu_head **curtail;
|
struct rcu_head **curtail;
|
||||||
struct rcu_head *donelist;
|
struct rcu_head *donelist;
|
||||||
|
|
|
@ -109,6 +109,10 @@ void fastcall call_rcu(struct rcu_head *head,
|
||||||
rdp = &__get_cpu_var(rcu_data);
|
rdp = &__get_cpu_var(rcu_data);
|
||||||
*rdp->nxttail = head;
|
*rdp->nxttail = head;
|
||||||
rdp->nxttail = &head->next;
|
rdp->nxttail = &head->next;
|
||||||
|
|
||||||
|
if (unlikely(++rdp->count > 10000))
|
||||||
|
set_need_resched();
|
||||||
|
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,6 +144,12 @@ void fastcall call_rcu_bh(struct rcu_head *head,
|
||||||
rdp = &__get_cpu_var(rcu_bh_data);
|
rdp = &__get_cpu_var(rcu_bh_data);
|
||||||
*rdp->nxttail = head;
|
*rdp->nxttail = head;
|
||||||
rdp->nxttail = &head->next;
|
rdp->nxttail = &head->next;
|
||||||
|
rdp->count++;
|
||||||
|
/*
|
||||||
|
* Should we directly call rcu_do_batch() here ?
|
||||||
|
* if (unlikely(rdp->count > 10000))
|
||||||
|
* rcu_do_batch(rdp);
|
||||||
|
*/
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,6 +167,7 @@ static void rcu_do_batch(struct rcu_data *rdp)
|
||||||
next = rdp->donelist = list->next;
|
next = rdp->donelist = list->next;
|
||||||
list->func(list);
|
list->func(list);
|
||||||
list = next;
|
list = next;
|
||||||
|
rdp->count--;
|
||||||
if (++count >= maxbatch)
|
if (++count >= maxbatch)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue