diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-10-18 17:14:17 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-10-18 17:14:17 -0400 |
commit | 28af493cd7b89cba7e3ee534079cf4f41bb4b4f9 (patch) | |
tree | ea27df5ab7b728496a15602e0a7da74ff188378f /kernel/rcupdate.c | |
parent | 74cfe03f80adc320bde4dd37616354aefe2271aa (diff) | |
parent | 39ca371c45b04cd50d0974030ae051906fc516b6 (diff) | |
download | op-kernel-dev-28af493cd7b89cba7e3ee534079cf4f41bb4b4f9.zip op-kernel-dev-28af493cd7b89cba7e3ee534079cf4f41bb4b4f9.tar.gz |
Merge branch 'master'
Diffstat (limited to 'kernel/rcupdate.c')
-rw-r--r-- | kernel/rcupdate.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index bef3b69..2559d4b 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c @@ -71,7 +71,7 @@ DEFINE_PER_CPU(struct rcu_data, rcu_bh_data) = { 0L }; /* Fake initialization required by compiler */ static DEFINE_PER_CPU(struct tasklet_struct, rcu_tasklet) = {NULL}; -static int maxbatch = 10; +static int maxbatch = 10000; #ifndef __HAVE_ARCH_CMPXCHG /* @@ -109,6 +109,10 @@ void fastcall call_rcu(struct rcu_head *head, rdp = &__get_cpu_var(rcu_data); *rdp->nxttail = head; rdp->nxttail = &head->next; + + if (unlikely(++rdp->count > 10000)) + set_need_resched(); + 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->nxttail = head; 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); } @@ -157,6 +167,7 @@ static void rcu_do_batch(struct rcu_data *rdp) next = rdp->donelist = list->next; list->func(list); list = next; + rdp->count--; if (++count >= maxbatch) break; } |