diff --git a/xen/arch/x86/mm/hap/nested_hap.c b/xen/arch/x86/mm/hap/nested_hap.c index 38e2327957..78701dca4f 100644 --- a/xen/arch/x86/mm/hap/nested_hap.c +++ b/xen/arch/x86/mm/hap/nested_hap.c @@ -124,7 +124,7 @@ nestedhap_fix_p2m(struct vcpu *v, struct p2m_domain *p2m, gfn = (L2_gpa >> PAGE_SHIFT) & mask; mfn = _mfn((L0_gpa >> PAGE_SHIFT) & mask); - rv = set_p2m_entry(p2m, gfn, mfn, page_order, p2mt, p2ma); + rv = p2m_set_entry(p2m, gfn, mfn, page_order, p2mt, p2ma); } p2m_unlock(p2m); diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c index 237d346692..096868108a 100644 --- a/xen/arch/x86/mm/mem_sharing.c +++ b/xen/arch/x86/mm/mem_sharing.c @@ -1092,7 +1092,7 @@ int mem_sharing_add_to_physmap(struct domain *sd, unsigned long sgfn, shr_handle goto err_unlock; } - ret = set_p2m_entry(p2m, cgfn, smfn, PAGE_ORDER_4K, p2m_ram_shared, a); + ret = p2m_set_entry(p2m, cgfn, smfn, PAGE_ORDER_4K, p2m_ram_shared, a); /* Tempted to turn this into an assert */ if ( !ret ) diff --git a/xen/arch/x86/mm/p2m-pod.c b/xen/arch/x86/mm/p2m-pod.c index d14565d8ee..3c86255b26 100644 --- a/xen/arch/x86/mm/p2m-pod.c +++ b/xen/arch/x86/mm/p2m-pod.c @@ -556,7 +556,8 @@ recount: { /* All PoD: Mark the whole region invalid and tell caller * we're done. */ - set_p2m_entry(p2m, gpfn, _mfn(INVALID_MFN), order, p2m_invalid, p2m->default_access); + p2m_set_entry(p2m, gpfn, _mfn(INVALID_MFN), order, p2m_invalid, + p2m->default_access); p2m->pod.entry_count-=(1<pod.entry_count < 0); ret = 1; @@ -589,7 +590,8 @@ recount: mfn = p2m->get_entry(p2m, gpfn + i, &t, &a, 0, NULL); if ( t == p2m_populate_on_demand ) { - set_p2m_entry(p2m, gpfn + i, _mfn(INVALID_MFN), 0, p2m_invalid, p2m->default_access); + p2m_set_entry(p2m, gpfn + i, _mfn(INVALID_MFN), 0, p2m_invalid, + p2m->default_access); p2m->pod.entry_count--; BUG_ON(p2m->pod.entry_count < 0); pod--; @@ -602,7 +604,8 @@ recount: page = mfn_to_page(mfn); - set_p2m_entry(p2m, gpfn + i, _mfn(INVALID_MFN), 0, p2m_invalid, p2m->default_access); + p2m_set_entry(p2m, gpfn + i, _mfn(INVALID_MFN), 0, p2m_invalid, + p2m->default_access); set_gpfn_from_mfn(mfn_x(mfn), INVALID_M2P_ENTRY); p2m_pod_cache_add(p2m, page, 0); @@ -721,7 +724,7 @@ p2m_pod_zero_check_superpage(struct p2m_domain *p2m, unsigned long gfn) } /* Try to remove the page, restoring old mapping if it fails. */ - set_p2m_entry(p2m, gfn, _mfn(0), PAGE_ORDER_2M, + p2m_set_entry(p2m, gfn, _mfn(0), PAGE_ORDER_2M, p2m_populate_on_demand, p2m->default_access); /* Make none of the MFNs are used elsewhere... for example, mapped @@ -779,7 +782,7 @@ p2m_pod_zero_check_superpage(struct p2m_domain *p2m, unsigned long gfn) out_reset: if ( reset ) - set_p2m_entry(p2m, gfn, mfn0, 9, type0, p2m->default_access); + p2m_set_entry(p2m, gfn, mfn0, 9, type0, p2m->default_access); out: gfn_unlock(p2m, gfn, SUPERPAGE_ORDER); @@ -837,7 +840,7 @@ p2m_pod_zero_check(struct p2m_domain *p2m, unsigned long *gfns, int count) } /* Try to remove the page, restoring old mapping if it fails. */ - set_p2m_entry(p2m, gfns[i], _mfn(0), PAGE_ORDER_4K, + p2m_set_entry(p2m, gfns[i], _mfn(0), PAGE_ORDER_4K, p2m_populate_on_demand, p2m->default_access); /* See if the page was successfully unmapped. (Allow one refcount @@ -847,7 +850,7 @@ p2m_pod_zero_check(struct p2m_domain *p2m, unsigned long *gfns, int count) unmap_domain_page(map[i]); map[i] = NULL; - set_p2m_entry(p2m, gfns[i], mfns[i], PAGE_ORDER_4K, + p2m_set_entry(p2m, gfns[i], mfns[i], PAGE_ORDER_4K, types[i], p2m->default_access); continue; @@ -870,7 +873,7 @@ p2m_pod_zero_check(struct p2m_domain *p2m, unsigned long *gfns, int count) * check timing. */ if ( j < PAGE_SIZE/sizeof(*map[i]) ) { - set_p2m_entry(p2m, gfns[i], mfns[i], PAGE_ORDER_4K, + p2m_set_entry(p2m, gfns[i], mfns[i], PAGE_ORDER_4K, types[i], p2m->default_access); } else @@ -1000,15 +1003,15 @@ p2m_pod_demand_populate(struct p2m_domain *p2m, unsigned long gfn, { pod_unlock(p2m); gfn_aligned = (gfn >> order) << order; - /* Note that we are supposed to call set_p2m_entry() 512 times to + /* Note that we are supposed to call p2m_set_entry() 512 times to * split 1GB into 512 2MB pages here. But We only do once here because - * set_p2m_entry() should automatically shatter the 1GB page into + * p2m_set_entry() should automatically shatter the 1GB page into * 512 2MB pages. The rest of 511 calls are unnecessary. * * NOTE: In a fine-grained p2m locking scenario this operation * may need to promote its locking from gfn->1g superpage */ - set_p2m_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M, + p2m_set_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M, p2m_populate_on_demand, p2m->default_access); return 0; } @@ -1037,7 +1040,8 @@ p2m_pod_demand_populate(struct p2m_domain *p2m, unsigned long gfn, gfn_aligned = (gfn >> order) << order; - set_p2m_entry(p2m, gfn_aligned, mfn, order, p2m_ram_rw, p2m->default_access); + p2m_set_entry(p2m, gfn_aligned, mfn, order, p2m_ram_rw, + p2m->default_access); for( i = 0; i < (1UL << order); i++ ) { @@ -1091,7 +1095,7 @@ remap_and_retry: * need promoting the gfn lock from gfn->2M superpage */ gfn_aligned = (gfn>>order)<default_access); if ( tb_init_done ) { @@ -1146,7 +1150,7 @@ guest_physmap_mark_populate_on_demand(struct domain *d, unsigned long gfn, } /* Now, actually do the two-way mapping */ - if ( !set_p2m_entry(p2m, gfn, _mfn(0), order, + if ( !p2m_set_entry(p2m, gfn, _mfn(0), order, p2m_populate_on_demand, p2m->default_access) ) rc = -EINVAL; else diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index d2de237d97..35f9a29a3e 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -321,7 +321,7 @@ struct page_info *get_page_from_gfn_p2m( } -int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, +int p2m_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma) { struct domain *d = p2m->domain; @@ -429,7 +429,7 @@ int p2m_alloc_table(struct p2m_domain *p2m) /* Initialise physmap tables for slot zero. Other code assumes this. */ p2m->defer_nested_flush = 1; - if ( !set_p2m_entry(p2m, 0, _mfn(INVALID_MFN), PAGE_ORDER_4K, + if ( !p2m_set_entry(p2m, 0, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_invalid, p2m->default_access) ) goto error; p2m->defer_nested_flush = 0; @@ -508,7 +508,8 @@ p2m_remove_page(struct p2m_domain *p2m, unsigned long gfn, unsigned long mfn, ASSERT( !p2m_is_valid(t) || mfn + i == mfn_x(mfn_return) ); } } - set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), page_order, p2m_invalid, p2m->default_access); + p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), page_order, p2m_invalid, + p2m->default_access); } void @@ -647,7 +648,8 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn, /* Now, actually do the two-way mapping */ if ( mfn_valid(_mfn(mfn)) ) { - if ( !set_p2m_entry(p2m, gfn, _mfn(mfn), page_order, t, p2m->default_access) ) + if ( !p2m_set_entry(p2m, gfn, _mfn(mfn), page_order, t, + p2m->default_access) ) { rc = -EINVAL; goto out; /* Failed to update p2m, bail without updating m2p. */ @@ -662,7 +664,7 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn, { gdprintk(XENLOG_WARNING, "Adding bad mfn to p2m map (%#lx -> %#lx)\n", gfn, mfn); - if ( !set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), page_order, + if ( !p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), page_order, p2m_invalid, p2m->default_access) ) rc = -EINVAL; else @@ -697,7 +699,7 @@ p2m_type_t p2m_change_type(struct domain *d, unsigned long gfn, mfn = p2m->get_entry(p2m, gfn, &pt, &a, 0, NULL); if ( pt == ot ) - set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, nt, p2m->default_access); + p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, nt, p2m->default_access); gfn_unlock(p2m, gfn, 0); @@ -738,7 +740,7 @@ void p2m_change_type_range(struct domain *d, order = PAGE_ORDER_4K; } if ( pt == ot ) - set_p2m_entry(p2m, gfn, mfn, order, nt, a); + p2m_set_entry(p2m, gfn, mfn, order, nt, a); gfn += 1UL << order; gfn &= -1UL << order; if ( !gfn ) @@ -780,11 +782,12 @@ set_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn) } P2M_DEBUG("set mmio %lx %lx\n", gfn, mfn_x(mfn)); - rc = set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_mmio_direct, p2m->default_access); + rc = p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_mmio_direct, + p2m->default_access); gfn_unlock(p2m, gfn, 0); if ( 0 == rc ) gdprintk(XENLOG_ERR, - "set_mmio_p2m_entry: set_p2m_entry failed! mfn=%08lx\n", + "set_mmio_p2m_entry: p2m_set_entry failed! mfn=%08lx\n", mfn_x(get_gfn_query_unlocked(p2m->domain, gfn, &ot))); return rc; } @@ -811,7 +814,8 @@ clear_mmio_p2m_entry(struct domain *d, unsigned long gfn) "clear_mmio_p2m_entry: gfn_to_mfn failed! gfn=%08lx\n", gfn); goto out; } - rc = set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_invalid, p2m->default_access); + rc = p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_invalid, + p2m->default_access); out: gfn_unlock(p2m, gfn, 0); @@ -846,11 +850,12 @@ set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn) set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY); P2M_DEBUG("set shared %lx %lx\n", gfn, mfn_x(mfn)); - rc = set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_shared, p2m->default_access); + rc = p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_shared, + p2m->default_access); gfn_unlock(p2m, gfn, 0); if ( 0 == rc ) gdprintk(XENLOG_ERR, - "set_shared_p2m_entry: set_p2m_entry failed! mfn=%08lx\n", + "set_shared_p2m_entry: p2m_set_entry failed! mfn=%08lx\n", mfn_x(get_gfn_query_unlocked(p2m->domain, gfn, &ot))); return rc; } @@ -908,7 +913,7 @@ int p2m_mem_paging_nominate(struct domain *d, unsigned long gfn) goto out; /* Fix p2m entry */ - set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_out, a); + p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_out, a); ret = 0; out: @@ -973,7 +978,7 @@ int p2m_mem_paging_evict(struct domain *d, unsigned long gfn) put_page(page); /* Remove mapping from p2m table */ - set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_ram_paged, a); + p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_ram_paged, a); /* Clear content before returning the page to Xen */ scrub_one_page(page); @@ -1082,7 +1087,7 @@ void p2m_mem_paging_populate(struct domain *d, unsigned long gfn) if ( p2mt == p2m_ram_paging_out ) req.flags |= MEM_EVENT_FLAG_EVICT_FAIL; - set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_in, a); + p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_paging_in, a); } gfn_unlock(p2m, gfn, 0); @@ -1182,9 +1187,9 @@ int p2m_mem_paging_prep(struct domain *d, unsigned long gfn, uint64_t buffer) /* Make the page already guest-accessible. If the pager still has a * pending resume operation, it will be idempotent p2m entry-wise, * but will unpause the vcpu */ - set_p2m_entry(p2m, gfn, mfn, PAGE_ORDER_4K, - paging_mode_log_dirty(d) ? p2m_ram_logdirty : - p2m_ram_rw, a); + p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, + paging_mode_log_dirty(d) ? p2m_ram_logdirty : + p2m_ram_rw, a); set_gpfn_from_mfn(mfn_x(mfn), gfn); if ( !page_extant ) @@ -1234,9 +1239,9 @@ void p2m_mem_paging_resume(struct domain *d) * were nominated but not evicted */ if ( mfn_valid(mfn) && (p2mt == p2m_ram_paging_in) ) { - set_p2m_entry(p2m, rsp.gfn, mfn, PAGE_ORDER_4K, - paging_mode_log_dirty(d) ? p2m_ram_logdirty : - p2m_ram_rw, a); + p2m_set_entry(p2m, rsp.gfn, mfn, PAGE_ORDER_4K, + paging_mode_log_dirty(d) ? p2m_ram_logdirty : + p2m_ram_rw, a); set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn); } gfn_unlock(p2m, rsp.gfn, 0); diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h index c64f3d0652..0a87ea6e63 100644 --- a/xen/include/asm-x86/p2m.h +++ b/xen/include/asm-x86/p2m.h @@ -597,7 +597,7 @@ void p2m_free_ptp(struct p2m_domain *p2m, struct page_info *pg); /* Directly set a p2m entry: only for use by p2m code. Does not need * a call to put_gfn afterwards/ */ -int set_p2m_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, +int p2m_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma); /* Set up function pointers for PT implementation: only for use by p2m code */