Messages in this thread | | | Date | Fri, 27 Jan 2006 22:57:59 +0300 | From | Oleg Nesterov <> | Subject | Re: [patch 1/2] rcu batch tuning |
| |
Dipankar Sarma wrote: > > +static void force_quiescent_state(struct rcu_data *rdp, > + struct rcu_ctrlblk *rcp) > +{ > + int cpu; > + cpumask_t cpumask; > + set_need_resched(); > + if (unlikely(rdp->qlen - rdp->last_rs_qlen > rsinterval)) { > + rdp->last_rs_qlen = rdp->qlen; > + /* > + * Don't send IPI to itself. With irqs disabled, > + * rdp->cpu is the current cpu. > + */ > + cpumask = rcp->cpumask; > + cpu_clear(rdp->cpu, cpumask); > + for_each_cpu_mask(cpu, cpumask) > + smp_send_reschedule(cpu); > + } > +} > [ ... snip ... ] > > @@ -92,17 +128,13 @@ void fastcall call_rcu(struct rcu_head * > rdp = &__get_cpu_var(rcu_data); > *rdp->nxttail = head; > rdp->nxttail = &head->next; > - > - if (unlikely(++rdp->count > 10000)) > - set_need_resched(); > - > + if (unlikely(++rdp->qlen > qhimark)) { > + rdp->blimit = INT_MAX; > + force_quiescent_state(rdp, &rcu_ctrlblk); > + }
When ->qlen exceeds qhimark for the first time we send reschedule IPI to other CPUs and force_quiescent_state() records ->last_rs_qlen = ->qlen. But we don't reset ->last_rs_qlen when ->qlen goes to 0, this means that next time we need ++rdp->qlen > qhimark + rsinterval to force other CPUS to pass quiescent state, no?
Also, it seems to me it's better to have 2 counters, one for length(->donelist) and another for length(->curlist + ->nxtlist). I think we don't need force_quiescent_state() when all rcu callbacks are placed in ->donelist, we only need to increase rdp->blimit in this case.
Oleg. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |