Commit 5ee832db authored by Eric Dumazet's avatar Eric Dumazet Committed by Linus Torvalds

[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: default avatarLinus Torvalds <torvalds@osdl.org>
parent cc675230
...@@ -94,6 +94,7 @@ struct rcu_data { ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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;
} }
......
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