|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/P2M: p2m_change_type() should pass on error from p2m_set_entry()
commit e9304f30e903da20cbc278bfc753cfa94212c630
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Thu May 8 13:59:33 2014 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu May 8 13:59:33 2014 +0200
x86/P2M: p2m_change_type() should pass on error from p2m_set_entry()
Modify the function's name to help eventual backports involving this
function, and in one case where this is trivially possible also stop
ignoring its return value.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Tim Deegan <tim@xxxxxxx>
---
xen/arch/x86/cpu/mcheck/vmce.c | 3 +--
xen/arch/x86/domctl.c | 5 +++--
xen/arch/x86/hvm/hvm.c | 16 +++++-----------
xen/arch/x86/mm/mem_sharing.c | 5 ++---
xen/arch/x86/mm/p2m.c | 20 +++++++++++++-------
xen/arch/x86/mm/paging.c | 6 +-----
xen/drivers/passthrough/amd/iommu_guest.c | 2 +-
xen/include/asm-x86/p2m.h | 4 ++--
8 files changed, 28 insertions(+), 33 deletions(-)
diff --git a/xen/arch/x86/cpu/mcheck/vmce.c b/xen/arch/x86/cpu/mcheck/vmce.c
index c83375e..3f3ef3c 100644
--- a/xen/arch/x86/cpu/mcheck/vmce.c
+++ b/xen/arch/x86/cpu/mcheck/vmce.c
@@ -444,8 +444,7 @@ int unmmap_broken_page(struct domain *d, mfn_t mfn,
unsigned long gfn)
if ( p2m_to_mask(pt) & P2M_UNMAP_TYPES)
{
ASSERT(mfn_x(r_mfn) == mfn_x(mfn));
- p2m_change_type(d, gfn, pt, p2m_ram_broken);
- rc = 0;
+ rc = p2m_change_type_one(d, gfn, pt, p2m_ram_broken);
}
put_gfn(d, gfn);
diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index fbdc8e6..ff24e0e 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -1333,9 +1333,10 @@ long arch_do_domctl(
unsigned long pfn = domctl->u.set_broken_page_p2m.pfn;
mfn_t mfn = get_gfn_query(d, pfn, &pt);
- if ( unlikely(!mfn_valid(mfn_x(mfn)) || !p2m_is_ram(pt) ||
- (p2m_change_type(d, pfn, pt, p2m_ram_broken) != pt)) )
+ if ( unlikely(!mfn_valid(mfn_x(mfn))) || unlikely(!p2m_is_ram(pt)) )
ret = -EINVAL;
+ else
+ ret = p2m_change_type_one(d, pfn, pt, p2m_ram_broken);
put_gfn(d, pfn);
}
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index da220bf..b697b6c 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -1698,7 +1698,7 @@ int hvm_hap_nested_page_fault(paddr_t gpa,
if ( access_w )
{
paging_mark_dirty(v->domain, mfn_x(mfn));
- p2m_change_type(v->domain, gfn, p2m_ram_logdirty, p2m_ram_rw);
+ p2m_change_type_one(v->domain, gfn, p2m_ram_logdirty, p2m_ram_rw);
}
rc = 1;
goto out_put_gfn;
@@ -4540,7 +4540,7 @@ long do_hvm_op(unsigned long op,
XEN_GUEST_HANDLE_PARAM(void) arg)
while ( a.nr > start_iter )
{
unsigned long pfn = a.first_pfn + start_iter;
- p2m_type_t t, nt;
+ p2m_type_t t;
get_gfn_unshare(d, pfn, &t);
if ( p2m_is_paging(t) )
@@ -4563,16 +4563,10 @@ long do_hvm_op(unsigned long op,
XEN_GUEST_HANDLE_PARAM(void) arg)
goto param_fail4;
}
- nt = p2m_change_type(d, pfn, t, memtype[a.hvmmem_type]);
- if ( nt != t )
- {
- put_gfn(d, pfn);
- printk(XENLOG_G_WARNING
- "d%d: GFN %#lx type changed from %d to %d while trying
to change it to %d\n",
- d->domain_id, pfn, t, nt, memtype[a.hvmmem_type]);
- goto param_fail4;
- }
+ rc = p2m_change_type_one(d, pfn, t, memtype[a.hvmmem_type]);
put_gfn(d, pfn);
+ if ( rc )
+ goto param_fail4;
/* Check for continuation if it's not the last interation */
if ( a.nr > ++start_iter && !(start_iter & HVMOP_op_mask) &&
diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c
index 61f0b22..3e627f0 100644
--- a/xen/arch/x86/mm/mem_sharing.c
+++ b/xen/arch/x86/mm/mem_sharing.c
@@ -913,7 +913,7 @@ int mem_sharing_nominate_page(struct domain *d,
}
/* Change the p2m type, should never fail with p2m locked. */
- BUG_ON(p2m_change_type(d, gfn, p2mt, p2m_ram_shared) != p2mt);
+ BUG_ON(p2m_change_type_one(d, gfn, p2mt, p2m_ram_shared));
/* Account for this page. */
atomic_inc(&nr_shared_mfns);
@@ -1236,8 +1236,7 @@ int __mem_sharing_unshare_page(struct domain *d,
put_page_and_type(old_page);
private_page_found:
- if ( p2m_change_type(d, gfn, p2m_ram_shared, p2m_ram_rw) !=
- p2m_ram_shared )
+ if ( p2m_change_type_one(d, gfn, p2m_ram_shared, p2m_ram_rw) )
{
gdprintk(XENLOG_ERR, "Could not change p2m type d %hu gfn %lx.\n",
d->domain_id, gfn);
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index afff8db..1d1dd1b 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -704,27 +704,33 @@ out:
}
-/* Modify the p2m type of a single gfn from ot to nt, returning the
- * entry's previous type. Resets the access permissions. */
-p2m_type_t p2m_change_type(struct domain *d, unsigned long gfn,
- p2m_type_t ot, p2m_type_t nt)
+/*
+ * Modify the p2m type of a single gfn from ot to nt.
+ * Returns: 0 for success, -errno for failure.
+ * Resets the access permissions.
+ */
+int p2m_change_type_one(struct domain *d, unsigned long gfn,
+ p2m_type_t ot, p2m_type_t nt)
{
p2m_access_t a;
p2m_type_t pt;
mfn_t mfn;
struct p2m_domain *p2m = p2m_get_hostp2m(d);
+ int rc;
BUG_ON(p2m_is_grant(ot) || p2m_is_grant(nt));
gfn_lock(p2m, gfn, 0);
mfn = p2m->get_entry(p2m, gfn, &pt, &a, 0, NULL);
- if ( pt == ot )
- p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, nt, p2m->default_access);
+ rc = likely(pt == ot)
+ ? p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, nt,
+ p2m->default_access)
+ : -EBUSY;
gfn_unlock(p2m, gfn, 0);
- return pt;
+ return rc;
}
/* Modify the p2m type of a range of gfns from ot to nt. */
diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
index f956aa5..9e9a11b 100644
--- a/xen/arch/x86/mm/paging.c
+++ b/xen/arch/x86/mm/paging.c
@@ -469,12 +469,8 @@ void paging_log_dirty_range(struct domain *d,
p2m_lock(p2m);
for ( i = 0, pfn = begin_pfn; pfn < begin_pfn + nr; i++, pfn++ )
- {
- p2m_type_t pt;
- pt = p2m_change_type(d, pfn, p2m_ram_rw, p2m_ram_logdirty);
- if ( pt == p2m_ram_rw )
+ if ( !p2m_change_type_one(d, pfn, p2m_ram_rw, p2m_ram_logdirty) )
dirty_bitmap[i >> 3] |= (1 << (i & 7));
- }
p2m_unlock(p2m);
diff --git a/xen/drivers/passthrough/amd/iommu_guest.c
b/xen/drivers/passthrough/amd/iommu_guest.c
index 477de20..f638bef 100644
--- a/xen/drivers/passthrough/amd/iommu_guest.c
+++ b/xen/drivers/passthrough/amd/iommu_guest.c
@@ -823,7 +823,7 @@ int guest_iommu_set_base(struct domain *d, uint64_t base)
unsigned long gfn = base + i;
get_gfn_query(d, gfn, &t);
- p2m_change_type(d, gfn, t, p2m_mmio_dm);
+ p2m_change_type_one(d, gfn, t, p2m_mmio_dm);
put_gfn(d, gfn);
}
diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
index 9d48775..027f011 100644
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -519,8 +519,8 @@ void p2m_change_type_range(struct domain *d,
p2m_type_t ot, p2m_type_t nt);
/* Compare-exchange the type of a single p2m entry */
-p2m_type_t p2m_change_type(struct domain *d, unsigned long gfn,
- p2m_type_t ot, p2m_type_t nt);
+int p2m_change_type_one(struct domain *d, unsigned long gfn,
+ p2m_type_t ot, p2m_type_t nt);
/* Report a change affecting memory types. */
void p2m_memory_type_changed(struct domain *d);
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |