On Wednesday 13 February 2008, Keir Fraser wrote:
>
> On 12/2/08 19:09, "Langsdorf, Mark" <mark.langsdorf@xxxxxxx> wrote:
>
> >> It's fine not to change this case if you don't want to. It
> >> would probably logically belong in a separate patch anyway.
> >
> > Is there an easy way to get Xen to pass the "cpufreq=dom0-kernel"
> > hypervisor argument onto to the Linux command line? I can
> > add a separate parament to Linux easily enough, but I'd like it
> > if the end-user didn't need to add it twice.
>
> I'm happy to fix this aspect myself when I check your patch in.
I'm not exactly sure if this is what you wanted or not, but it's
the minimum patch that resolves the issue on my system and it
should be the correct logic path.
Replace the hard coded values in the dom0_vcpus_pinned case with
with the correct logic to get Xen to do the right thing.
I'm happy to add a platform call if that's what you wanted instead.
-Mark Langsdorf
Operating System Research Center
AMD
Signed-off-by: Mark Langsdorf <mark.langsdorf@xxxxxxx>
diff -r 08e85e79c65d arch/x86_64/kernel/setup-xen.c
--- a/arch/x86_64/kernel/setup-xen.c Mon Feb 11 11:05:27 2008 +0000
+++ b/arch/x86_64/kernel/setup-xen.c Wed Feb 13 16:39:58 2008 -0600
@@ -107,6 +107,9 @@ DEFINE_PER_CPU(int, nr_multicall_ents);
/* Raw start-of-day parameters from the hypervisor. */
start_info_t *xen_start_info;
EXPORT_SYMBOL(xen_start_info);
+
+int dom0_vcpus_pinned;
+EXPORT_SYMBOL(dom0_vcpus_pinned);
#endif
/*
@@ -412,6 +415,9 @@ static __init void parse_cmdline_early (
skip_ioapic_setup = 0;
ioapic_force = 1;
}
+#else
+ if (fullarg(from, "cpufreq=dom0-kernel") || fullarg(from,
"pin_dom0_vcpus"))
+ dom0_vcpus_pinned = 1;
#endif
if (!memcmp(from, "mem=", 4))
diff -r 08e85e79c65d drivers/xen/core/smpboot.c
--- a/drivers/xen/core/smpboot.c Mon Feb 11 11:05:27 2008 +0000
+++ b/drivers/xen/core/smpboot.c Wed Feb 13 16:39:58 2008 -0600
@@ -70,6 +70,8 @@ unsigned int maxcpus = NR_CPUS;
unsigned int maxcpus = NR_CPUS;
#endif
+extern int dom0_vcpus_pinned;
+
void __init prefill_possible_map(void)
{
int i, rc;
@@ -267,9 +269,13 @@ void __init smp_prepare_cpus(unsigned in
boot_cpu_data.apicid = 0;
cpu_data[0] = boot_cpu_data;
- cpu_2_logical_apicid[0] = 0;
- x86_cpu_to_apicid[0] = 0;
-
+ if (dom0_vcpus_pinned) {
+ cpu_2_logical_apicid[0] = 4;
+ x86_cpu_to_apicid[0] = 4;
+ } else {
+ cpu_2_logical_apicid[0] = 0;
+ x86_cpu_to_apicid[0] = 0;
+ }
current_thread_info()->cpu = 0;
for (cpu = 0; cpu < NR_CPUS; cpu++) {
@@ -315,8 +321,13 @@ void __init smp_prepare_cpus(unsigned in
cpu_data[cpu] = boot_cpu_data;
cpu_data[cpu].apicid = cpu;
- cpu_2_logical_apicid[cpu] = cpu;
- x86_cpu_to_apicid[cpu] = cpu;
+ if (dom0_vcpus_pinned) {
+ cpu_2_logical_apicid[cpu] = cpu + 4;
+ x86_cpu_to_apicid[cpu] = cpu + 4;
+ } else {
+ cpu_2_logical_apicid[cpu] = cpu;
+ x86_cpu_to_apicid[cpu] = cpu;
+ }
idle = fork_idle(cpu);
if (IS_ERR(idle))
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|