Merge branch 'upstream/core' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen
* 'upstream/core' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen: xen: do not release any memory under 1M in domain 0 xen: events: do not unmask event channels on resume xen: correct size of level2_kernel_pgt
This commit is contained in:
commit
891cbd30ef
3 changed files with 30 additions and 15 deletions
|
@ -2126,7 +2126,7 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd,
|
||||||
{
|
{
|
||||||
pmd_t *kernel_pmd;
|
pmd_t *kernel_pmd;
|
||||||
|
|
||||||
level2_kernel_pgt = extend_brk(sizeof(pmd_t *) * PTRS_PER_PMD, PAGE_SIZE);
|
level2_kernel_pgt = extend_brk(sizeof(pmd_t) * PTRS_PER_PMD, PAGE_SIZE);
|
||||||
|
|
||||||
max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->pt_base) +
|
max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->pt_base) +
|
||||||
xen_start_info->nr_pt_frames * PAGE_SIZE +
|
xen_start_info->nr_pt_frames * PAGE_SIZE +
|
||||||
|
|
|
@ -118,16 +118,18 @@ static unsigned long __init xen_return_unused_memory(unsigned long max_pfn,
|
||||||
const struct e820map *e820)
|
const struct e820map *e820)
|
||||||
{
|
{
|
||||||
phys_addr_t max_addr = PFN_PHYS(max_pfn);
|
phys_addr_t max_addr = PFN_PHYS(max_pfn);
|
||||||
phys_addr_t last_end = 0;
|
phys_addr_t last_end = ISA_END_ADDRESS;
|
||||||
unsigned long released = 0;
|
unsigned long released = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* Free any unused memory above the low 1Mbyte. */
|
||||||
for (i = 0; i < e820->nr_map && last_end < max_addr; i++) {
|
for (i = 0; i < e820->nr_map && last_end < max_addr; i++) {
|
||||||
phys_addr_t end = e820->map[i].addr;
|
phys_addr_t end = e820->map[i].addr;
|
||||||
end = min(max_addr, end);
|
end = min(max_addr, end);
|
||||||
|
|
||||||
released += xen_release_chunk(last_end, end);
|
if (last_end < end)
|
||||||
last_end = e820->map[i].addr + e820->map[i].size;
|
released += xen_release_chunk(last_end, end);
|
||||||
|
last_end = max(last_end, e820->map[i].addr + e820->map[i].size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last_end < max_addr)
|
if (last_end < max_addr)
|
||||||
|
@ -164,6 +166,7 @@ char * __init xen_memory_setup(void)
|
||||||
XENMEM_memory_map;
|
XENMEM_memory_map;
|
||||||
rc = HYPERVISOR_memory_op(op, &memmap);
|
rc = HYPERVISOR_memory_op(op, &memmap);
|
||||||
if (rc == -ENOSYS) {
|
if (rc == -ENOSYS) {
|
||||||
|
BUG_ON(xen_initial_domain());
|
||||||
memmap.nr_entries = 1;
|
memmap.nr_entries = 1;
|
||||||
map[0].addr = 0ULL;
|
map[0].addr = 0ULL;
|
||||||
map[0].size = mem_end;
|
map[0].size = mem_end;
|
||||||
|
@ -201,12 +204,13 @@ char * __init xen_memory_setup(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Even though this is normal, usable memory under Xen, reserve
|
* In domU, the ISA region is normal, usable memory, but we
|
||||||
* ISA memory anyway because too many things think they can poke
|
* reserve ISA memory anyway because too many things poke
|
||||||
* about in there.
|
* about in there.
|
||||||
*
|
*
|
||||||
* In a dom0 kernel, this region is identity mapped with the
|
* In Dom0, the host E820 information can leave gaps in the
|
||||||
* hardware ISA area, so it really is out of bounds.
|
* ISA range, which would cause us to release those pages. To
|
||||||
|
* avoid this, we unconditionally reserve them here.
|
||||||
*/
|
*/
|
||||||
e820_add_region(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS,
|
e820_add_region(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS,
|
||||||
E820_RESERVED);
|
E820_RESERVED);
|
||||||
|
|
|
@ -1299,9 +1299,6 @@ static void restore_cpu_virqs(unsigned int cpu)
|
||||||
evtchn_to_irq[evtchn] = irq;
|
evtchn_to_irq[evtchn] = irq;
|
||||||
irq_info[irq] = mk_virq_info(evtchn, virq);
|
irq_info[irq] = mk_virq_info(evtchn, virq);
|
||||||
bind_evtchn_to_cpu(evtchn, cpu);
|
bind_evtchn_to_cpu(evtchn, cpu);
|
||||||
|
|
||||||
/* Ready for use. */
|
|
||||||
unmask_evtchn(evtchn);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1327,10 +1324,6 @@ static void restore_cpu_ipis(unsigned int cpu)
|
||||||
evtchn_to_irq[evtchn] = irq;
|
evtchn_to_irq[evtchn] = irq;
|
||||||
irq_info[irq] = mk_ipi_info(evtchn, ipi);
|
irq_info[irq] = mk_ipi_info(evtchn, ipi);
|
||||||
bind_evtchn_to_cpu(evtchn, cpu);
|
bind_evtchn_to_cpu(evtchn, cpu);
|
||||||
|
|
||||||
/* Ready for use. */
|
|
||||||
unmask_evtchn(evtchn);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1390,6 +1383,7 @@ void xen_poll_irq(int irq)
|
||||||
void xen_irq_resume(void)
|
void xen_irq_resume(void)
|
||||||
{
|
{
|
||||||
unsigned int cpu, irq, evtchn;
|
unsigned int cpu, irq, evtchn;
|
||||||
|
struct irq_desc *desc;
|
||||||
|
|
||||||
init_evtchn_cpu_bindings();
|
init_evtchn_cpu_bindings();
|
||||||
|
|
||||||
|
@ -1408,6 +1402,23 @@ void xen_irq_resume(void)
|
||||||
restore_cpu_virqs(cpu);
|
restore_cpu_virqs(cpu);
|
||||||
restore_cpu_ipis(cpu);
|
restore_cpu_ipis(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unmask any IRQF_NO_SUSPEND IRQs which are enabled. These
|
||||||
|
* are not handled by the IRQ core.
|
||||||
|
*/
|
||||||
|
for_each_irq_desc(irq, desc) {
|
||||||
|
if (!desc->action || !(desc->action->flags & IRQF_NO_SUSPEND))
|
||||||
|
continue;
|
||||||
|
if (desc->status & IRQ_DISABLED)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
evtchn = evtchn_from_irq(irq);
|
||||||
|
if (evtchn == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
unmask_evtchn(evtchn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irq_chip xen_dynamic_chip __read_mostly = {
|
static struct irq_chip xen_dynamic_chip __read_mostly = {
|
||||||
|
|
Loading…
Reference in a new issue