Jan Beulich
2012-Sep-27 14:55 UTC
[PATCH] x86/HPET: don''t needlessly set up channels for broadcast
When there are more FSB delivery capable HPET channels than CPU cores (or threads), we can simply use a dedicated channel per CPU. This avoids wasting the resources to handle the excess channels (including the pointless triggering of the respective interrupt on each wraparound) as well as the ping-pong of the interrupts'' affinities (when getting assigned to different CPUs). Signed-off-by: Jan Beulich <jbeulich@suse.com> --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -369,7 +369,7 @@ static void __init hpet_fsb_cap_lookup(v if ( !hpet_events ) return; - for ( i = 0; i < num_chs; i++ ) + for ( i = 0; i < num_chs && num_hpets_used < nr_cpu_ids; i++ ) { struct hpet_event_channel *ch = &hpet_events[num_hpets_used]; u32 cfg = hpet_read32(HPET_Tn_CFG(i)); @@ -408,6 +408,9 @@ static struct hpet_event_channel *hpet_g if ( num_hpets_used == 0 ) return hpet_events; + if ( num_hpets_used >= nr_cpu_ids ) + return &hpet_events[cpu]; + do { next = next_channel; if ( (i = next + 1) == num_hpets_used ) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Keir Fraser
2012-Sep-27 15:31 UTC
Re: [PATCH] x86/HPET: don''t needlessly set up channels for broadcast
On 27/09/2012 15:55, "Jan Beulich" <JBeulich@suse.com> wrote:> When there are more FSB delivery capable HPET channels than CPU cores > (or threads), we can simply use a dedicated channel per CPU. This > avoids wasting the resources to handle the excess channels (including > the pointless triggering of the respective interrupt on each > wraparound) as well as the ping-pong of the interrupts'' affinities > (when getting assigned to different CPUs). > > Signed-off-by: Jan Beulich <jbeulich@suse.com>Acked-by: Keir Fraser <keir@xen.org>> --- a/xen/arch/x86/hpet.c > +++ b/xen/arch/x86/hpet.c > @@ -369,7 +369,7 @@ static void __init hpet_fsb_cap_lookup(v > if ( !hpet_events ) > return; > > - for ( i = 0; i < num_chs; i++ ) > + for ( i = 0; i < num_chs && num_hpets_used < nr_cpu_ids; i++ ) > { > struct hpet_event_channel *ch = &hpet_events[num_hpets_used]; > u32 cfg = hpet_read32(HPET_Tn_CFG(i)); > @@ -408,6 +408,9 @@ static struct hpet_event_channel *hpet_g > if ( num_hpets_used == 0 ) > return hpet_events; > > + if ( num_hpets_used >= nr_cpu_ids ) > + return &hpet_events[cpu]; > + > do { > next = next_channel; > if ( (i = next + 1) == num_hpets_used ) > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel