xen/p2m: Move code around to allow for better re-usage.
We are going to be using the early_alloc_p2m (and early_alloc_p2m_middle) code in follow up patches which are not related to setting identity pages. Hence lets move the code out in its own function and rename them as appropiate. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
f09d8432e3
commit
3f3aaea29f
1 changed files with 34 additions and 28 deletions
|
@ -499,7 +499,7 @@ static bool alloc_p2m(unsigned long pfn)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool __init __early_alloc_p2m(unsigned long pfn)
|
static bool __init early_alloc_p2m_middle(unsigned long pfn)
|
||||||
{
|
{
|
||||||
unsigned topidx, mididx, idx;
|
unsigned topidx, mididx, idx;
|
||||||
|
|
||||||
|
@ -541,6 +541,36 @@ static bool __init __early_alloc_p2m(unsigned long pfn)
|
||||||
}
|
}
|
||||||
return idx != 0;
|
return idx != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
unsigned long __init set_phys_range_identity(unsigned long pfn_s,
|
unsigned long __init set_phys_range_identity(unsigned long pfn_s,
|
||||||
unsigned long pfn_e)
|
unsigned long pfn_e)
|
||||||
{
|
{
|
||||||
|
@ -559,35 +589,11 @@ unsigned long __init set_phys_range_identity(unsigned long pfn_s,
|
||||||
pfn < ALIGN(pfn_e, (P2M_MID_PER_PAGE * P2M_PER_PAGE));
|
pfn < ALIGN(pfn_e, (P2M_MID_PER_PAGE * P2M_PER_PAGE));
|
||||||
pfn += P2M_MID_PER_PAGE * P2M_PER_PAGE)
|
pfn += P2M_MID_PER_PAGE * P2M_PER_PAGE)
|
||||||
{
|
{
|
||||||
unsigned topidx = p2m_top_index(pfn);
|
WARN_ON(!early_alloc_p2m(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 */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
__early_alloc_p2m(pfn_s);
|
early_alloc_p2m_middle(pfn_s);
|
||||||
__early_alloc_p2m(pfn_e);
|
early_alloc_p2m_middle(pfn_e);
|
||||||
|
|
||||||
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)))
|
||||||
|
|
Loading…
Add table
Reference in a new issue