|
@@ -532,12 +532,13 @@ static bool alloc_p2m(unsigned long pfn)
|
|
|
unsigned topidx, mididx;
|
|
|
unsigned long ***top_p, **mid;
|
|
|
unsigned long *top_mfn_p, *mid_mfn;
|
|
|
+ unsigned long *p2m_orig;
|
|
|
|
|
|
topidx = p2m_top_index(pfn);
|
|
|
mididx = p2m_mid_index(pfn);
|
|
|
|
|
|
top_p = &p2m_top[topidx];
|
|
|
- mid = *top_p;
|
|
|
+ mid = ACCESS_ONCE(*top_p);
|
|
|
|
|
|
if (mid == p2m_mid_missing) {
|
|
|
/* Mid level is missing, allocate a new one */
|
|
@@ -552,7 +553,7 @@ static bool alloc_p2m(unsigned long pfn)
|
|
|
}
|
|
|
|
|
|
top_mfn_p = &p2m_top_mfn[topidx];
|
|
|
- mid_mfn = p2m_top_mfn_p[topidx];
|
|
|
+ mid_mfn = ACCESS_ONCE(p2m_top_mfn_p[topidx]);
|
|
|
|
|
|
BUG_ON(virt_to_mfn(mid_mfn) != *top_mfn_p);
|
|
|
|
|
@@ -579,11 +580,10 @@ static bool alloc_p2m(unsigned long pfn)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (p2m_top[topidx][mididx] == p2m_identity ||
|
|
|
- p2m_top[topidx][mididx] == p2m_missing) {
|
|
|
+ p2m_orig = ACCESS_ONCE(p2m_top[topidx][mididx]);
|
|
|
+ if (p2m_orig == p2m_identity || p2m_orig == p2m_missing) {
|
|
|
/* p2m leaf page is missing */
|
|
|
unsigned long *p2m;
|
|
|
- unsigned long *p2m_orig = p2m_top[topidx][mididx];
|
|
|
|
|
|
p2m = alloc_p2m_page();
|
|
|
if (!p2m)
|