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"
This commit is contained in:
commit
ef46222e7b
|
@ -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)
|
||||||
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 @@
|
||||||
#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,
|
||||||
{
|
{
|
||||||
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)
|
||||||
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,
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue