@@ -6,7 +6,7 @@
static struct mcinfo_recovery *
mci_action_add_pageoffline(int bank, struct mc_info *mi,
- uint64_t mfn, uint32_t status)
+ mfn_t mfn, uint32_t status)
{
struct mcinfo_recovery *rec;
@@ -22,7 +22,7 @@ mci_action_add_pageoffline(int bank, struct mc_info *mi,
rec->mc_bank = bank;
rec->action_types = MC_ACTION_PAGE_OFFLINE;
- rec->action_info.page_retire.mfn = mfn;
+ rec->action_info.page_retire.mfn = mfn_x(mfn);
rec->action_info.page_retire.status = status;
return rec;
}
@@ -42,7 +42,8 @@ mc_memerr_dhandler(struct mca_binfo *binfo,
struct mcinfo_bank *bank = binfo->mib;
struct mcinfo_global *global = binfo->mig;
struct domain *d;
- unsigned long mfn, gfn;
+ mfn_t mfn;
+ unsigned long gfn;
uint32_t status;
int vmce_vcpuid;
unsigned int mc_vcpuid;
@@ -54,11 +55,12 @@ mc_memerr_dhandler(struct mca_binfo *binfo,
return;
}
- mfn = bank->mc_addr >> PAGE_SHIFT;
+ mfn = maddr_to_mfn(bank->mc_addr);
if ( offline_page(mfn, 1, &status) )
{
dprintk(XENLOG_WARNING,
- "Failed to offline page %lx for MCE error\n", mfn);
+ "Failed to offline page %"PRI_mfn" for MCE error\n",
+ mfn_x(mfn));
return;
}
@@ -89,10 +91,10 @@ mc_memerr_dhandler(struct mca_binfo *binfo,
ASSERT(d);
gfn = get_gpfn_from_mfn((bank->mc_addr) >> PAGE_SHIFT);
- if ( unmmap_broken_page(d, _mfn(mfn), gfn) )
+ if ( unmmap_broken_page(d, mfn, gfn) )
{
- printk("Unmap broken memory %lx for DOM%d failed\n",
- mfn, d->domain_id);
+ printk("Unmap broken memory %"PRI_mfn" for DOM%d failed\n",
+ mfn_x(mfn), d->domain_id);
goto vmce_failed;
}
@@ -1556,23 +1556,23 @@ static int reserve_heap_page(struct page_info *pg)
}
-int offline_page(unsigned long mfn, int broken, uint32_t *status)
+int offline_page(mfn_t mfn, int broken, uint32_t *status)
{
unsigned long old_info = 0;
struct domain *owner;
struct page_info *pg;
- if ( !mfn_valid(_mfn(mfn)) )
+ if ( !mfn_valid(mfn) )
{
dprintk(XENLOG_WARNING,
- "try to offline page out of range %lx\n", mfn);
+ "try to offline out of range page %"PRI_mfn"\n", mfn_x(mfn));
return -EINVAL;
}
*status = 0;
- pg = mfn_to_page(_mfn(mfn));
+ pg = mfn_to_page(mfn);
- if ( is_xen_fixed_mfn(mfn) )
+ if ( is_xen_fixed_mfn(mfn_x(mfn)) )
{
*status = PG_OFFLINE_XENPAGE | PG_OFFLINE_FAILED |
(DOMID_XEN << PG_OFFLINE_OWNER_SHIFT);
@@ -1583,7 +1583,7 @@ int offline_page(unsigned long mfn, int broken, uint32_t *status)
* N.B. xen's txt in x86_64 is marked reserved and handled already.
* Also kexec range is reserved.
*/
- if ( !page_is_ram_type(mfn, RAM_TYPE_CONVENTIONAL) )
+ if ( !page_is_ram_type(mfn_x(mfn), RAM_TYPE_CONVENTIONAL) )
{
*status = PG_OFFLINE_FAILED | PG_OFFLINE_NOT_CONV_RAM;
return -EINVAL;
@@ -1665,19 +1665,19 @@ int offline_page(unsigned long mfn, int broken, uint32_t *status)
* The caller should make sure end_pfn <= max_page,
* if not, expand_pages() should be called prior to online_page().
*/
-unsigned int online_page(unsigned long mfn, uint32_t *status)
+unsigned int online_page(mfn_t mfn, uint32_t *status)
{
unsigned long x, nx, y;
struct page_info *pg;
int ret;
- if ( !mfn_valid(_mfn(mfn)) )
+ if ( !mfn_valid(mfn) )
{
dprintk(XENLOG_WARNING, "call expand_pages() first\n");
return -EINVAL;
}
- pg = mfn_to_page(_mfn(mfn));
+ pg = mfn_to_page(mfn);
spin_lock(&heap_lock);
@@ -1718,11 +1718,11 @@ unsigned int online_page(unsigned long mfn, uint32_t *status)
return ret;
}
-int query_page_offline(unsigned long mfn, uint32_t *status)
+int query_page_offline(mfn_t mfn, uint32_t *status)
{
struct page_info *pg;
- if ( !mfn_valid(_mfn(mfn)) || !page_is_ram_type(mfn, RAM_TYPE_CONVENTIONAL) )
+ if ( !mfn_valid(mfn) || !page_is_ram_type(mfn_x(mfn), RAM_TYPE_CONVENTIONAL) )
{
dprintk(XENLOG_WARNING, "call expand_pages() first\n");
return -EINVAL;
@@ -1731,7 +1731,7 @@ int query_page_offline(unsigned long mfn, uint32_t *status)
*status = 0;
spin_lock(&heap_lock);
- pg = mfn_to_page(_mfn(mfn));
+ pg = mfn_to_page(mfn);
if ( page_state_is(pg, offlining) )
*status |= PG_OFFLINE_STATUS_OFFLINE_PENDING;
@@ -185,7 +185,7 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
case XEN_SYSCTL_page_offline_op:
{
uint32_t *status, *ptr;
- unsigned long pfn;
+ mfn_t mfn;
ret = xsm_page_offline(XSM_HOOK, op->u.page_offline.cmd);
if ( ret )
@@ -204,21 +204,21 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
memset(status, PG_OFFLINE_INVALID, sizeof(uint32_t) *
(op->u.page_offline.end - op->u.page_offline.start + 1));
- for ( pfn = op->u.page_offline.start;
- pfn <= op->u.page_offline.end;
- pfn ++ )
+ for ( mfn = _mfn(op->u.page_offline.start);
+ mfn_x(mfn) <= op->u.page_offline.end;
+ mfn = mfn_add(mfn, 1) )
{
switch ( op->u.page_offline.cmd )
{
/* Shall revert her if failed, or leave caller do it? */
case sysctl_page_offline:
- ret = offline_page(pfn, 0, ptr++);
+ ret = offline_page(mfn, 0, ptr++);
break;
case sysctl_page_online:
- ret = online_page(pfn, ptr++);
+ ret = online_page(mfn, ptr++);
break;
case sysctl_query_page_offline:
- ret = query_page_offline(pfn, ptr++);
+ ret = query_page_offline(mfn, ptr++);
break;
default:
ret = -EINVAL;
@@ -206,9 +206,9 @@ unsigned long avail_domheap_pages(void);
unsigned long avail_node_heap_pages(unsigned int);
#define alloc_domheap_page(d,f) (alloc_domheap_pages(d,0,f))
#define free_domheap_page(p) (free_domheap_pages(p,0))
-unsigned int online_page(unsigned long mfn, uint32_t *status);
-int offline_page(unsigned long mfn, int broken, uint32_t *status);
-int query_page_offline(unsigned long mfn, uint32_t *status);
+unsigned int online_page(mfn_t mfn, uint32_t *status);
+int offline_page(mfn_t mfn, int broken, uint32_t *status);
+int query_page_offline(mfn_t mfn, uint32_t *status);
void heap_init_late(void);