Commit ef46222e authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'stable/bug.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen

* 'stable/bug.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen:
  xen/setup: Fix for incorrect xen_extra_mem_start.
  xen: When calling power_off, don't call the halt function.
  xen: Fix compile warning when CONFIG_SMP is not defined.
  xen: support CONFIG_MAXSMP
  xen: partially revert "xen: set max_pfn_mapped to the last pfn mapped"
parents c01ad408 acd049c6
...@@ -1033,6 +1033,13 @@ static void xen_machine_halt(void) ...@@ -1033,6 +1033,13 @@ static void xen_machine_halt(void)
xen_reboot(SHUTDOWN_poweroff); xen_reboot(SHUTDOWN_poweroff);
} }
static void xen_machine_power_off(void)
{
if (pm_power_off)
pm_power_off();
xen_reboot(SHUTDOWN_poweroff);
}
static void xen_crash_shutdown(struct pt_regs *regs) static void xen_crash_shutdown(struct pt_regs *regs)
{ {
xen_reboot(SHUTDOWN_crash); xen_reboot(SHUTDOWN_crash);
...@@ -1058,7 +1065,7 @@ int xen_panic_handler_init(void) ...@@ -1058,7 +1065,7 @@ int xen_panic_handler_init(void)
static const struct machine_ops xen_machine_ops __initconst = { static const struct machine_ops xen_machine_ops __initconst = {
.restart = xen_restart, .restart = xen_restart,
.halt = xen_machine_halt, .halt = xen_machine_halt,
.power_off = xen_machine_halt, .power_off = xen_machine_power_off,
.shutdown = xen_machine_halt, .shutdown = xen_machine_halt,
.crash_shutdown = xen_crash_shutdown, .crash_shutdown = xen_crash_shutdown,
.emergency_restart = xen_emergency_restart, .emergency_restart = xen_emergency_restart,
......
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
#include <asm/page.h> #include <asm/page.h>
#include <asm/init.h> #include <asm/init.h>
#include <asm/pat.h> #include <asm/pat.h>
#include <asm/smp.h>
#include <asm/xen/hypercall.h> #include <asm/xen/hypercall.h>
#include <asm/xen/hypervisor.h> #include <asm/xen/hypervisor.h>
...@@ -1231,7 +1232,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, ...@@ -1231,7 +1232,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus,
{ {
struct { struct {
struct mmuext_op op; struct mmuext_op op;
DECLARE_BITMAP(mask, NR_CPUS); DECLARE_BITMAP(mask, num_processors);
} *args; } *args;
struct multicall_space mcs; struct multicall_space mcs;
...@@ -1599,6 +1600,11 @@ static void __init xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn) ...@@ -1599,6 +1600,11 @@ static void __init xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn)
for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) { for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) {
pte_t pte; pte_t pte;
#ifdef CONFIG_X86_32
if (pfn > max_pfn_mapped)
max_pfn_mapped = pfn;
#endif
if (!pte_none(pte_page[pteidx])) if (!pte_none(pte_page[pteidx]))
continue; continue;
...@@ -1766,7 +1772,9 @@ pgd_t * __init xen_setup_kernel_pagetable(pgd_t *pgd, ...@@ -1766,7 +1772,9 @@ pgd_t * __init xen_setup_kernel_pagetable(pgd_t *pgd,
initial_kernel_pmd = initial_kernel_pmd =
extend_brk(sizeof(pmd_t) * PTRS_PER_PMD, PAGE_SIZE); extend_brk(sizeof(pmd_t) * PTRS_PER_PMD, PAGE_SIZE);
max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->mfn_list)); max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->pt_base) +
xen_start_info->nr_pt_frames * PAGE_SIZE +
512*1024);
kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd); kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd);
memcpy(initial_kernel_pmd, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD); memcpy(initial_kernel_pmd, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD);
......
...@@ -227,11 +227,7 @@ char * __init xen_memory_setup(void) ...@@ -227,11 +227,7 @@ char * __init xen_memory_setup(void)
memcpy(map_raw, map, sizeof(map)); memcpy(map_raw, map, sizeof(map));
e820.nr_map = 0; e820.nr_map = 0;
#ifdef CONFIG_X86_32
xen_extra_mem_start = mem_end; xen_extra_mem_start = mem_end;
#else
xen_extra_mem_start = max((1ULL << 32), mem_end);
#endif
for (i = 0; i < memmap.nr_entries; i++) { for (i = 0; i < memmap.nr_entries; i++) {
unsigned long long end; unsigned long long end;
...@@ -266,6 +262,12 @@ char * __init xen_memory_setup(void) ...@@ -266,6 +262,12 @@ char * __init xen_memory_setup(void)
if (map[i].size > 0) if (map[i].size > 0)
e820_add_region(map[i].addr, map[i].size, map[i].type); e820_add_region(map[i].addr, map[i].size, map[i].type);
} }
/* Align the balloon area so that max_low_pfn does not get set
* to be at the _end_ of the PCI gap at the far end (fee01000).
* Note that xen_extra_mem_start gets set in the loop above to be
* past the last E820 region. */
if (xen_initial_domain() && (xen_extra_mem_start < (1ULL<<32)))
xen_extra_mem_start = (1ULL<<32);
/* /*
* In domU, the ISA region is normal, usable memory, but we * In domU, the ISA region is normal, usable memory, but we
......
...@@ -205,11 +205,18 @@ static void __init xen_smp_prepare_boot_cpu(void) ...@@ -205,11 +205,18 @@ static void __init xen_smp_prepare_boot_cpu(void)
static void __init xen_smp_prepare_cpus(unsigned int max_cpus) static void __init xen_smp_prepare_cpus(unsigned int max_cpus)
{ {
unsigned cpu; unsigned cpu;
unsigned int i;
xen_init_lock_cpu(0); xen_init_lock_cpu(0);
smp_store_cpu_info(0); smp_store_cpu_info(0);
cpu_data(0).x86_max_cores = 1; cpu_data(0).x86_max_cores = 1;
for_each_possible_cpu(i) {
zalloc_cpumask_var(&per_cpu(cpu_sibling_map, i), GFP_KERNEL);
zalloc_cpumask_var(&per_cpu(cpu_core_map, i), GFP_KERNEL);
zalloc_cpumask_var(&per_cpu(cpu_llc_shared_map, i), GFP_KERNEL);
}
set_cpu_sibling_map(0); set_cpu_sibling_map(0);
if (xen_smp_intr_init(0)) if (xen_smp_intr_init(0))
......
...@@ -395,9 +395,9 @@ static void unmask_evtchn(int port) ...@@ -395,9 +395,9 @@ static void unmask_evtchn(int port)
static void xen_irq_init(unsigned irq) static void xen_irq_init(unsigned irq)
{ {
struct irq_info *info; struct irq_info *info;
#ifdef CONFIG_SMP
struct irq_desc *desc = irq_to_desc(irq); struct irq_desc *desc = irq_to_desc(irq);
#ifdef CONFIG_SMP
/* By default all event channels notify CPU#0. */ /* By default all event channels notify CPU#0. */
cpumask_copy(desc->irq_data.affinity, cpumask_of(0)); cpumask_copy(desc->irq_data.affinity, cpumask_of(0));
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment