diff options
| -rw-r--r-- | arch/arm/xen/enlighten.c | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index d30042e39974..13609e01f4b7 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c | |||
| @@ -152,11 +152,12 @@ int xen_unmap_domain_mfn_range(struct vm_area_struct *vma, | |||
| 152 | } | 152 | } |
| 153 | EXPORT_SYMBOL_GPL(xen_unmap_domain_mfn_range); | 153 | EXPORT_SYMBOL_GPL(xen_unmap_domain_mfn_range); |
| 154 | 154 | ||
| 155 | static int __init xen_secondary_init(unsigned int cpu) | 155 | static void __init xen_percpu_init(void *unused) |
| 156 | { | 156 | { |
| 157 | struct vcpu_register_vcpu_info info; | 157 | struct vcpu_register_vcpu_info info; |
| 158 | struct vcpu_info *vcpup; | 158 | struct vcpu_info *vcpup; |
| 159 | int err; | 159 | int err; |
| 160 | int cpu = get_cpu(); | ||
| 160 | 161 | ||
| 161 | pr_info("Xen: initializing cpu%d\n", cpu); | 162 | pr_info("Xen: initializing cpu%d\n", cpu); |
| 162 | vcpup = per_cpu_ptr(xen_vcpu_info, cpu); | 163 | vcpup = per_cpu_ptr(xen_vcpu_info, cpu); |
| @@ -165,14 +166,10 @@ static int __init xen_secondary_init(unsigned int cpu) | |||
| 165 | info.offset = offset_in_page(vcpup); | 166 | info.offset = offset_in_page(vcpup); |
| 166 | 167 | ||
| 167 | err = HYPERVISOR_vcpu_op(VCPUOP_register_vcpu_info, cpu, &info); | 168 | err = HYPERVISOR_vcpu_op(VCPUOP_register_vcpu_info, cpu, &info); |
| 168 | if (err) { | 169 | BUG_ON(err); |
| 169 | pr_debug("register_vcpu_info failed: err=%d\n", err); | 170 | per_cpu(xen_vcpu, cpu) = vcpup; |
| 170 | } else { | 171 | |
| 171 | /* This cpu is using the registered vcpu info, even if | 172 | enable_percpu_irq(xen_events_irq, 0); |
| 172 | later ones fail to. */ | ||
| 173 | per_cpu(xen_vcpu, cpu) = vcpup; | ||
| 174 | } | ||
| 175 | return 0; | ||
| 176 | } | 173 | } |
| 177 | 174 | ||
| 178 | static void xen_restart(char str, const char *cmd) | 175 | static void xen_restart(char str, const char *cmd) |
| @@ -208,7 +205,6 @@ static int __init xen_guest_init(void) | |||
| 208 | const char *version = NULL; | 205 | const char *version = NULL; |
| 209 | const char *xen_prefix = "xen,xen-"; | 206 | const char *xen_prefix = "xen,xen-"; |
| 210 | struct resource res; | 207 | struct resource res; |
| 211 | int i; | ||
| 212 | 208 | ||
| 213 | node = of_find_compatible_node(NULL, NULL, "xen,xen"); | 209 | node = of_find_compatible_node(NULL, NULL, "xen,xen"); |
| 214 | if (!node) { | 210 | if (!node) { |
| @@ -265,19 +261,23 @@ static int __init xen_guest_init(void) | |||
| 265 | sizeof(struct vcpu_info)); | 261 | sizeof(struct vcpu_info)); |
| 266 | if (xen_vcpu_info == NULL) | 262 | if (xen_vcpu_info == NULL) |
| 267 | return -ENOMEM; | 263 | return -ENOMEM; |
| 268 | for_each_online_cpu(i) | ||
| 269 | xen_secondary_init(i); | ||
| 270 | 264 | ||
| 271 | gnttab_init(); | 265 | gnttab_init(); |
| 272 | if (!xen_initial_domain()) | 266 | if (!xen_initial_domain()) |
| 273 | xenbus_probe(NULL); | 267 | xenbus_probe(NULL); |
| 274 | 268 | ||
| 269 | return 0; | ||
| 270 | } | ||
| 271 | core_initcall(xen_guest_init); | ||
| 272 | |||
| 273 | static int __init xen_pm_init(void) | ||
| 274 | { | ||
| 275 | pm_power_off = xen_power_off; | 275 | pm_power_off = xen_power_off; |
| 276 | arm_pm_restart = xen_restart; | 276 | arm_pm_restart = xen_restart; |
| 277 | 277 | ||
| 278 | return 0; | 278 | return 0; |
| 279 | } | 279 | } |
| 280 | core_initcall(xen_guest_init); | 280 | subsys_initcall(xen_pm_init); |
| 281 | 281 | ||
| 282 | static irqreturn_t xen_arm_callback(int irq, void *arg) | 282 | static irqreturn_t xen_arm_callback(int irq, void *arg) |
| 283 | { | 283 | { |
| @@ -285,11 +285,6 @@ static irqreturn_t xen_arm_callback(int irq, void *arg) | |||
| 285 | return IRQ_HANDLED; | 285 | return IRQ_HANDLED; |
| 286 | } | 286 | } |
| 287 | 287 | ||
| 288 | static __init void xen_percpu_enable_events(void *unused) | ||
| 289 | { | ||
| 290 | enable_percpu_irq(xen_events_irq, 0); | ||
| 291 | } | ||
| 292 | |||
| 293 | static int __init xen_init_events(void) | 288 | static int __init xen_init_events(void) |
| 294 | { | 289 | { |
| 295 | if (!xen_domain() || xen_events_irq < 0) | 290 | if (!xen_domain() || xen_events_irq < 0) |
| @@ -303,7 +298,7 @@ static int __init xen_init_events(void) | |||
| 303 | return -EINVAL; | 298 | return -EINVAL; |
| 304 | } | 299 | } |
| 305 | 300 | ||
| 306 | on_each_cpu(xen_percpu_enable_events, NULL, 0); | 301 | on_each_cpu(xen_percpu_init, NULL, 0); |
| 307 | 302 | ||
| 308 | return 0; | 303 | return 0; |
| 309 | } | 304 | } |
