X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fx86_64%2Fkernel%2Fgenapic_xen.c;h=0c651ef98745aa541604ae3ceaef4c52b0f6eb8c;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=3079d649e24bc8ba65a7b666699aba57d04d9693;hpb=16c70f8c1b54b61c3b951b6fb220df250fe09b32;p=linux-2.6.git diff --git a/arch/x86_64/kernel/genapic_xen.c b/arch/x86_64/kernel/genapic_xen.c index 3079d649e..0c651ef98 100644 --- a/arch/x86_64/kernel/genapic_xen.c +++ b/arch/x86_64/kernel/genapic_xen.c @@ -71,6 +71,20 @@ static cpumask_t xen_target_cpus(void) return cpu_online_map; } +static cpumask_t xen_vector_allocation_domain(int cpu) +{ + /* Careful. Some cpus do not strictly honor the set of cpus + * specified in the interrupt destination when using lowest + * priority interrupt delivery mode. + * + * In particular there was a hyperthreading cpu observed to + * deliver interrupts to the wrong hyperthread when only one + * hyperthread was specified in the interrupt desitination. + */ + cpumask_t domain = { { [0] = APIC_ALL_CPUS, } }; + return domain; +} + /* * Set up the logical destination ID. * Do nothing, not called now. @@ -162,8 +176,8 @@ struct genapic apic_xen = { .int_delivery_mode = dest_LowestPrio, #endif .int_dest_mode = (APIC_DEST_LOGICAL != 0), - .int_delivery_dest = APIC_DEST_LOGICAL | APIC_DM_LOWEST, .target_cpus = xen_target_cpus, + .vector_allocation_domain = xen_vector_allocation_domain, #ifdef CONFIG_XEN_PRIVILEGED_GUEST .apic_id_registered = xen_apic_id_registered, #endif