Commit cef4cca5 authored by Konrad Rzeszutek Wilk's avatar Konrad Rzeszutek Wilk

xen/p2m: Allow alloc_p2m_middle to call reserve_brk depending on argument

For identity cases we want to call reserve_brk only on the boundary
conditions of the middle P2M (so P2M[x][y][0] = extend_brk). This is
to work around identify regions (PCI spaces, gaps in E820) which are not
aligned on 2MB regions.

However for the case were we want to allocate P2M middle leafs at the
early bootup stage, irregardless of this alignment check we need some
means of doing that.  For that we provide the new argument.
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 3f3aaea2
...@@ -499,7 +499,7 @@ static bool alloc_p2m(unsigned long pfn) ...@@ -499,7 +499,7 @@ static bool alloc_p2m(unsigned long pfn)
return true; return true;
} }
static bool __init early_alloc_p2m_middle(unsigned long pfn) static bool __init early_alloc_p2m_middle(unsigned long pfn, bool check_boundary)
{ {
unsigned topidx, mididx, idx; unsigned topidx, mididx, idx;
...@@ -508,7 +508,7 @@ static bool __init early_alloc_p2m_middle(unsigned long pfn) ...@@ -508,7 +508,7 @@ static bool __init early_alloc_p2m_middle(unsigned long pfn)
idx = p2m_index(pfn); idx = p2m_index(pfn);
/* Pfff.. No boundary cross-over, lets get out. */ /* Pfff.. No boundary cross-over, lets get out. */
if (!idx) if (!idx && check_boundary)
return false; return false;
WARN(p2m_top[topidx][mididx] == p2m_identity, WARN(p2m_top[topidx][mididx] == p2m_identity,
...@@ -531,7 +531,7 @@ static bool __init early_alloc_p2m_middle(unsigned long pfn) ...@@ -531,7 +531,7 @@ static bool __init early_alloc_p2m_middle(unsigned long pfn)
p2m_top[topidx][mididx] = p2m; p2m_top[topidx][mididx] = p2m;
/* For save/restore we need to MFN of the P2M saved */ /* For save/restore we need to MFN of the P2M saved */
mid_mfn_p = p2m_top_mfn_p[topidx]; mid_mfn_p = p2m_top_mfn_p[topidx];
WARN(mid_mfn_p[mididx] != virt_to_mfn(p2m_missing), WARN(mid_mfn_p[mididx] != virt_to_mfn(p2m_missing),
"P2M_TOP_P[%d][%d] != MFN of p2m_missing!\n", "P2M_TOP_P[%d][%d] != MFN of p2m_missing!\n",
...@@ -592,8 +592,8 @@ unsigned long __init set_phys_range_identity(unsigned long pfn_s, ...@@ -592,8 +592,8 @@ unsigned long __init set_phys_range_identity(unsigned long pfn_s,
WARN_ON(!early_alloc_p2m(pfn)); WARN_ON(!early_alloc_p2m(pfn));
} }
early_alloc_p2m_middle(pfn_s); early_alloc_p2m_middle(pfn_s, true);
early_alloc_p2m_middle(pfn_e); early_alloc_p2m_middle(pfn_e, true);
for (pfn = pfn_s; pfn < pfn_e; pfn++) for (pfn = pfn_s; pfn < pfn_e; pfn++)
if (!__set_phys_to_machine(pfn, IDENTITY_FRAME(pfn))) if (!__set_phys_to_machine(pfn, IDENTITY_FRAME(pfn)))
......
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