[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH][retry 3][2/2] new vcpu op call to get physicalCPU information



I'll be making a number of tasteful changes when I commit these patches.
What's been submitted is close enough for me to run with, I think.

 Cheers,
 Keir

On 5/3/08 08:18, "Jan Beulich" <jbeulich@xxxxxxxxxx> wrote:

> Given that you modify a common (32- and 64-bit) file, you also need to
> touch asm-i386/mach-xen/asm/smp.h. But perhaps that logic would be
> better placed in a Xen interface file anyway?
> 
> Jan
> 
>>>> Mark Langsdorf <mark.langsdorf@xxxxxxx> 04.03.08 22:55 >>>
> Some AMD machines have APIC IDs that not equal to CPU IDs.  In
> the default Xen configuration, ACPI calls on these machines
> can get confused.  This shows up most noticeably when running
> AMD PowerNow!.  The only solution is for dom0 to get the
> hypervisor's cpuid to apicid table when needed (ie, when dom0
> vcpus are pinned).
> 
> Make dom0 call a new vcpu op hypercall that returns
> architecture dependent information about the physical cpu if
> and only iff the vcpus are pinned.  In this particular case,
> the information is the underlying ACPIID and APICIDs for the
> physical processor.  Only the APICIDs are used in this case
> as the ACPIIDs are set up correctly by the ACPI subsystem
> already.
> 
> The decision logic (dom0_vcpus_pinned) is currently hard-coded
> but should be passed from the hypervisor.  Keir wrote that he
> would take care of that when he suggested this solution.
> 
> I have tested this on my 4p/16 core machine and it works.  I
> would appreciate testing on other boxes.
> 
> 
> diff -r 1cf7ba68d855 drivers/xen/core/smpboot.c
> --- a/drivers/xen/core/smpboot.c Mon Mar 03 13:36:57 2008 +0000
> +++ b/drivers/xen/core/smpboot.c Tue Mar 04 15:45:19 2008 -0600
> @@ -254,21 +254,35 @@ static void __cpuinit cpu_initialize_con
> spin_unlock(&ctxt_lock);
>  }
>  
> +int dom0_vcpus_pinned = 1;
>  void __init smp_prepare_cpus(unsigned int max_cpus)
>  {
> unsigned int cpu;
> struct task_struct *idle;
> + int apicid;
>  #ifdef __x86_64__
> struct desc_ptr *gdt_descr;
>  #else
> struct Xgt_desc_struct *gdt_descr;
>  #endif
>  
> - boot_cpu_data.apicid = 0;
> + if (dom0_vcpus_pinned) {
> +  vcpu_get_physid_t cpu_data;
> +  if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, 0, &cpu_data)) {
> +   /* failed to get valid data from hypervisor */
> +   printk(KERN_ERR "failed to get valid APIC ID information\n");
> +   dom0_vcpus_pinned = 0;
> +   apicid = 0;
> +  }
> +  else
> +   apicid = GET_APICID_FROM_PHYSID(cpu_data.phys_id);
> + } else
> +  apicid = 0;
> + boot_cpu_data.apicid = apicid;
> cpu_data[0] = boot_cpu_data;
>  
> - cpu_2_logical_apicid[0] = 0;
> - x86_cpu_to_apicid[0] = 0;
> + cpu_2_logical_apicid[0] = apicid;
> + x86_cpu_to_apicid[0] = apicid;
>  
> current_thread_info()->cpu = 0;
>  
> @@ -312,11 +326,20 @@ void __init smp_prepare_cpus(unsigned in
> (void *)gdt_descr->address,
> XENFEAT_writable_descriptor_tables);
>  
> +  if (dom0_vcpus_pinned) {
> +   vcpu_get_physid_t cpu_data;
> +   if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, cpu, &cpu_data)) {
> +    dom0_vcpus_pinned = 0;
> +    apicid = cpu;
> +   } else
> +    apicid = GET_APICID_FROM_PHYSID(cpu_data.phys_id);
> +  } else
> +   apicid = cpu;
> cpu_data[cpu] = boot_cpu_data;
> -  cpu_data[cpu].apicid = cpu;
> -
> -  cpu_2_logical_apicid[cpu] = cpu;
> -  x86_cpu_to_apicid[cpu] = cpu;
> +  cpu_data[cpu].apicid = apicid;
> +
> +  cpu_2_logical_apicid[cpu] = apicid;
> +  x86_cpu_to_apicid[cpu] = apicid;
>  
> idle = fork_idle(cpu);
> if (IS_ERR(idle))
> diff -r 1cf7ba68d855 include/asm-x86_64/mach-xen/asm/smp.h
> --- a/include/asm-x86_64/mach-xen/asm/smp.h Mon Mar 03 13:36:57 2008 +0000
> +++ b/include/asm-x86_64/mach-xen/asm/smp.h Tue Mar 04 15:45:19 2008 -0600
> @@ -146,5 +146,11 @@ static __inline int logical_smp_processo
>  #define cpu_physical_id(cpu)  boot_cpu_id
>  #endif
>  
> +#define APICMASK   0xff
> +#define APICSHIFT   0
> +#define ACPIMASK   0xff00
> +#define ACPISHIFT   8
> +#define GET_APICID_FROM_PHYSID(physid) (physid & APICMASK) >> APICSHIFT;
> +#define GET_ACPIID_FROM_PHYSID(physid) (physid & ACPIMASK) >> ACPISHIFT;
>  #endif
>  
> diff -r 1cf7ba68d855 include/xen/interface/vcpu.h
> --- a/include/xen/interface/vcpu.h Mon Mar 03 13:36:57 2008 +0000
> +++ b/include/xen/interface/vcpu.h Tue Mar 04 15:45:19 2008 -0600
> @@ -182,6 +182,17 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_register_vc
>  /* Send an NMI to the specified VCPU. @extra_arg == NULL. */
>  #define VCPUOP_send_nmi             11
>  
> +/* 
> + * Get the physical ID information for a pinned vcpu's underlying
> + * physical processor.  The phyiscal ID informmation is architecture
> + * defined, but would ACPI and APIC IDs on x86 processors.
> + */
> +#define VCPUOP_get_physid           12 /* arg == vcpu_get_physid_t */
> +struct vcpu_get_physid {
> +    uint64_t phys_id;
> +};
> +typedef struct vcpu_get_physid vcpu_get_physid_t;
> +DEFINE_XEN_GUEST_HANDLE(vcpu_get_physid_t);
>  #endif /* __XEN_PUBLIC_VCPU_H__ */
>  
>  /*
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.