Skip to content

Commit

Permalink
Merge branch 'stable/autoballoon.v5.2' into stable/for-linus-3.5
Browse files Browse the repository at this point in the history
* stable/autoballoon.v5.2:
  xen/setup: update VA mapping when releasing memory during setup
  xen/setup: Combine the two hypercall functions - since they are quite similar.
  xen/setup: Populate freed MFNs from non-RAM E820 entries and gaps to E820 RAM
  xen/setup: Only print "Freeing XXX-YYY pfn range: Z pages freed" if Z > 0
  xen/p2m: An early bootup variant of set_phys_to_machine
  xen/p2m: Collapse early_alloc_p2m_middle redundant checks.
  xen/p2m: Allow alloc_p2m_middle to call reserve_brk depending on argument
  xen/p2m: Move code around to allow for better re-usage.
  • Loading branch information
Konrad Rzeszutek Wilk committed May 7, 2012
2 parents f62805f + 83d51ab commit 4b3451a
Show file tree
Hide file tree
Showing 6 changed files with 207 additions and 94 deletions.
1 change: 1 addition & 0 deletions arch/x86/include/asm/xen/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ extern unsigned long machine_to_phys_nr;

extern unsigned long get_phys_to_machine(unsigned long pfn);
extern bool set_phys_to_machine(unsigned long pfn, unsigned long mfn);
extern bool __init early_set_phys_to_machine(unsigned long pfn, unsigned long mfn);
extern bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn);
extern unsigned long set_phys_range_identity(unsigned long pfn_s,
unsigned long pfn_e);
Expand Down
1 change: 0 additions & 1 deletion arch/x86/xen/enlighten.c
Original file line number Diff line number Diff line change
Expand Up @@ -1316,7 +1316,6 @@ asmlinkage void __init xen_start_kernel(void)

xen_raw_console_write("mapping kernel into physical memory\n");
pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages);
xen_ident_map_ISA();

/* Allocate and initialize top and mid mfn levels for p2m structure */
xen_build_mfn_list_list();
Expand Down
23 changes: 0 additions & 23 deletions arch/x86/xen/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1929,29 +1929,6 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
#endif
}

void __init xen_ident_map_ISA(void)
{
unsigned long pa;

/*
* If we're dom0, then linear map the ISA machine addresses into
* the kernel's address space.
*/
if (!xen_initial_domain())
return;

xen_raw_printk("Xen: setup ISA identity maps\n");

for (pa = ISA_START_ADDRESS; pa < ISA_END_ADDRESS; pa += PAGE_SIZE) {
pte_t pte = mfn_pte(PFN_DOWN(pa), PAGE_KERNEL_IO);

if (HYPERVISOR_update_va_mapping(PAGE_OFFSET + pa, pte, 0))
BUG();
}

xen_flush_tlb();
}

static void __init xen_post_allocator_init(void)
{
pv_mmu_ops.set_pte = xen_set_pte;
Expand Down
104 changes: 62 additions & 42 deletions arch/x86/xen/p2m.c
Original file line number Diff line number Diff line change
Expand Up @@ -499,16 +499,18 @@ static bool alloc_p2m(unsigned long pfn)
return true;
}

static bool __init __early_alloc_p2m(unsigned long pfn)
static bool __init early_alloc_p2m_middle(unsigned long pfn, bool check_boundary)
{
unsigned topidx, mididx, idx;
unsigned long *p2m;
unsigned long *mid_mfn_p;

topidx = p2m_top_index(pfn);
mididx = p2m_mid_index(pfn);
idx = p2m_index(pfn);

/* Pfff.. No boundary cross-over, lets get out. */
if (!idx)
if (!idx && check_boundary)
return false;

WARN(p2m_top[topidx][mididx] == p2m_identity,
Expand All @@ -522,24 +524,66 @@ static bool __init __early_alloc_p2m(unsigned long pfn)
return false;

/* Boundary cross-over for the edges: */
if (idx) {
unsigned long *p2m = extend_brk(PAGE_SIZE, PAGE_SIZE);
unsigned long *mid_mfn_p;
p2m = extend_brk(PAGE_SIZE, PAGE_SIZE);

p2m_init(p2m);
p2m_init(p2m);

p2m_top[topidx][mididx] = p2m;
p2m_top[topidx][mididx] = p2m;

/* For save/restore we need to MFN of the P2M saved */

mid_mfn_p = p2m_top_mfn_p[topidx];
WARN(mid_mfn_p[mididx] != virt_to_mfn(p2m_missing),
"P2M_TOP_P[%d][%d] != MFN of p2m_missing!\n",
topidx, mididx);
mid_mfn_p[mididx] = virt_to_mfn(p2m);
/* For save/restore we need to MFN of the P2M saved */

mid_mfn_p = p2m_top_mfn_p[topidx];
WARN(mid_mfn_p[mididx] != virt_to_mfn(p2m_missing),
"P2M_TOP_P[%d][%d] != MFN of p2m_missing!\n",
topidx, mididx);
mid_mfn_p[mididx] = virt_to_mfn(p2m);

return true;
}

static bool __init early_alloc_p2m(unsigned long pfn)
{
unsigned topidx = p2m_top_index(pfn);
unsigned long *mid_mfn_p;
unsigned long **mid;

mid = p2m_top[topidx];
mid_mfn_p = p2m_top_mfn_p[topidx];
if (mid == p2m_mid_missing) {
mid = extend_brk(PAGE_SIZE, PAGE_SIZE);

p2m_mid_init(mid);

p2m_top[topidx] = mid;

BUG_ON(mid_mfn_p != p2m_mid_missing_mfn);
}
return idx != 0;
/* And the save/restore P2M tables.. */
if (mid_mfn_p == p2m_mid_missing_mfn) {
mid_mfn_p = extend_brk(PAGE_SIZE, PAGE_SIZE);
p2m_mid_mfn_init(mid_mfn_p);

p2m_top_mfn_p[topidx] = mid_mfn_p;
p2m_top_mfn[topidx] = virt_to_mfn(mid_mfn_p);
/* Note: we don't set mid_mfn_p[midix] here,
* look in early_alloc_p2m_middle */
}
return true;
}
bool __init early_set_phys_to_machine(unsigned long pfn, unsigned long mfn)
{
if (unlikely(!__set_phys_to_machine(pfn, mfn))) {
if (!early_alloc_p2m(pfn))
return false;

if (!early_alloc_p2m_middle(pfn, false /* boundary crossover OK!*/))
return false;

if (!__set_phys_to_machine(pfn, mfn))
return false;
}

return true;
}
unsigned long __init set_phys_range_identity(unsigned long pfn_s,
unsigned long pfn_e)
Expand All @@ -559,35 +603,11 @@ unsigned long __init set_phys_range_identity(unsigned long pfn_s,
pfn < ALIGN(pfn_e, (P2M_MID_PER_PAGE * P2M_PER_PAGE));
pfn += P2M_MID_PER_PAGE * P2M_PER_PAGE)
{
unsigned topidx = p2m_top_index(pfn);
unsigned long *mid_mfn_p;
unsigned long **mid;

mid = p2m_top[topidx];
mid_mfn_p = p2m_top_mfn_p[topidx];
if (mid == p2m_mid_missing) {
mid = extend_brk(PAGE_SIZE, PAGE_SIZE);

p2m_mid_init(mid);

p2m_top[topidx] = mid;

BUG_ON(mid_mfn_p != p2m_mid_missing_mfn);
}
/* And the save/restore P2M tables.. */
if (mid_mfn_p == p2m_mid_missing_mfn) {
mid_mfn_p = extend_brk(PAGE_SIZE, PAGE_SIZE);
p2m_mid_mfn_init(mid_mfn_p);

p2m_top_mfn_p[topidx] = mid_mfn_p;
p2m_top_mfn[topidx] = virt_to_mfn(mid_mfn_p);
/* Note: we don't set mid_mfn_p[midix] here,
* look in __early_alloc_p2m */
}
WARN_ON(!early_alloc_p2m(pfn));
}

__early_alloc_p2m(pfn_s);
__early_alloc_p2m(pfn_e);
early_alloc_p2m_middle(pfn_s, true);
early_alloc_p2m_middle(pfn_e, true);

for (pfn = pfn_s; pfn < pfn_e; pfn++)
if (!__set_phys_to_machine(pfn, IDENTITY_FRAME(pfn)))
Expand Down
Loading

0 comments on commit 4b3451a

Please sign in to comment.