[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Ensure curr_vcpu in domain.c is set correctly, even when
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 5715cf1171787e91f11783d29923a953df494adb # Parent d7cbcf5d7cd636acd5bdce97b96ab7e534c1ec88 Ensure curr_vcpu in domain.c is set correctly, even when nr physical cpus is greater than max virtual cpus per domain. Also do not initialise secondary CPU smp_processor_id() from smpboot.c cpucount. It will be wrong if some CPUs fail to boot. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r d7cbcf5d7cd6 -r 5715cf117178 xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Wed Mar 29 13:54:43 2006 +++ b/xen/arch/x86/domain.c Wed Mar 29 14:39:22 2006 @@ -208,6 +208,11 @@ } } +void set_current_execstate(struct vcpu *v) +{ + percpu_ctxt[smp_processor_id()].curr_vcpu = v; +} + struct vcpu *alloc_vcpu_struct(struct domain *d, unsigned int vcpu_id) { struct vcpu *v; @@ -219,15 +224,8 @@ v->arch.flags = TF_kernel_mode; - if ( is_idle_domain(d) ) - { - percpu_ctxt[vcpu_id].curr_vcpu = v; - v->arch.schedule_tail = continue_idle_domain; - } - else - { - v->arch.schedule_tail = continue_nonidle_domain; - } + v->arch.schedule_tail = is_idle_domain(d) ? + continue_idle_domain : continue_nonidle_domain; v->arch.ctxt_switch_from = paravirt_ctxt_switch_from; v->arch.ctxt_switch_to = paravirt_ctxt_switch_to; diff -r d7cbcf5d7cd6 -r 5715cf117178 xen/arch/x86/setup.c --- a/xen/arch/x86/setup.c Wed Mar 29 13:54:43 2006 +++ b/xen/arch/x86/setup.c Wed Mar 29 14:39:22 2006 @@ -404,6 +404,7 @@ BUG_ON(idle_domain == NULL); set_current(idle_domain->vcpu[0]); + set_current_execstate(idle_domain->vcpu[0]); idle_vcpu[0] = current; paging_init(); diff -r d7cbcf5d7cd6 -r 5715cf117178 xen/arch/x86/smpboot.c --- a/xen/arch/x86/smpboot.c Wed Mar 29 13:54:43 2006 +++ b/xen/arch/x86/smpboot.c Wed Mar 29 14:39:22 2006 @@ -441,7 +441,7 @@ calibrate_tsc_ap(); } -static int cpucount; +static int cpucount, booting_cpu; /* representing cpus for which sibling maps can be computed */ static cpumask_t cpu_sibling_setup_map; @@ -524,12 +524,13 @@ * booting is too fragile that we want to limit the * things done here to the most necessary things. */ - unsigned int cpu = cpucount; + unsigned int cpu = booting_cpu; extern void percpu_traps_init(void); + set_processor_id(cpu); set_current(idle_vcpu[cpu]); - set_processor_id(cpu); + set_current_execstate(idle_vcpu[cpu]); percpu_traps_init(); @@ -889,6 +890,8 @@ int vcpu_id; ++cpucount; + + booting_cpu = cpu; if ((vcpu_id = cpu % MAX_VIRT_CPUS) == 0) { d = domain_create(IDLE_DOMAIN_ID, cpu); diff -r d7cbcf5d7cd6 -r 5715cf117178 xen/include/asm-x86/current.h --- a/xen/include/asm-x86/current.h Wed Mar 29 13:54:43 2006 +++ b/xen/include/asm-x86/current.h Wed Mar 29 14:39:22 2006 @@ -53,4 +53,6 @@ #define schedule_tail(_ed) (((_ed)->arch.schedule_tail)(_ed)) +extern void set_current_execstate(struct vcpu *v); + #endif /* __X86_CURRENT_H__ */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |