From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keir Fraser Subject: Re: [RFC] irq rate limit Date: Wed, 09 Sep 2009 10:29:00 +0100 Message-ID: References: <20090909090700.GB25462@ub-qhe2> Mime-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20090909090700.GB25462@ub-qhe2> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Qing He Cc: "xen-devel@lists.xensource.com" List-Id: xen-devel@lists.xenproject.org On 09/09/2009 10:07, "Qing He" wrote: >> What's the generation counter for? Why not just zero desc->rl_cnt in the >> timer handler? > > If zeroing desc->rl_cnt in the timer handler, we have to zero that of > all irqs. If the numbers of possible irqs is big or sparse, it's a bit > painful. Ah yes, I see. An always-on 10ms timer is ugly however. The Intel guys working on power management won't like it as it will reduce deep-sleep residency. I would suggest getting rid of the generation counter and enable the timer only when the irq_ratelimit_list is non-empty. In do_IRQ(), when rl_cnt exceeds the threshold: now = NOW(); if ( now < (desc->rl_quantum_start + MILLISECS(10)) ) Add to irq_ratelimit_list; Kick timer if list was previously empty; else desc->rl_cnt = 0; desc->rl_quantum_start = now; And in the timer handler, for each desc on the list: desc->rl_cnt = 0; desc->rl_quantum_start = now; And at the end of the timer handler, do not set_timer(). This approach adds the overhead of get_s_time() every irq_ratelimit_threshold interrupts, which should be unmeasurably tiny. -- Keir