mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
libxc: Check xc_domain_maximum_gpfn for negative return values
Instead of assuming everything is always OK. We stash the gpfns value as an parameter. Since we use it in three of places we might as well update xc_domain_maximum_gpfn to do the right thing. Suggested-by: Ian Campbell <ian.campbell@citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
af5d428947
commit
a8f8a590e0
5 files changed
+30
-29
No files matched your search
@@ -1315,7 +1315,7 @@ int xc_domain_get_tsc_info(xc_interface *xch,
|
||||
|
||||
int xc_domain_disable_migrate(xc_interface *xch, uint32_t domid);
|
||||
|
||||
int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid);
|
||||
int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid, xen_pfn_t *gpfns);
|
||||
|
||||
int xc_domain_increase_reservation(xc_interface *xch,
|
||||
uint32_t domid,
|
||||
|
||||
@@ -30,12 +30,6 @@ xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int nr_gpfns(xc_interface *xch, domid_t domid)
|
||||
{
|
||||
return xc_domain_maximum_gpfn(xch, domid) + 1;
|
||||
}
|
||||
|
||||
int
|
||||
xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info)
|
||||
{
|
||||
@@ -48,9 +42,12 @@ xc_core_arch_memory_map_get(xc_interface *xch, struct xc_core_arch_context *unus
|
||||
xc_core_memory_map_t **mapp,
|
||||
unsigned int *nr_entries)
|
||||
{
|
||||
unsigned long p2m_size = nr_gpfns(xch, info->domid);
|
||||
xen_pfn_t p2m_size = 0;
|
||||
xc_core_memory_map_t *map;
|
||||
|
||||
if ( xc_domain_maximum_gpfn(xch, info->domid, &p2m_size) < 0 )
|
||||
return -1;
|
||||
|
||||
map = malloc(sizeof(*map));
|
||||
if ( map == NULL )
|
||||
{
|
||||
|
||||
+11
-18
@@ -35,12 +35,6 @@ xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt,
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int nr_gpfns(xc_interface *xch, domid_t domid)
|
||||
{
|
||||
return xc_domain_maximum_gpfn(xch, domid) + 1;
|
||||
}
|
||||
|
||||
int
|
||||
xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info)
|
||||
{
|
||||
@@ -53,9 +47,12 @@ xc_core_arch_memory_map_get(xc_interface *xch, struct xc_core_arch_context *unus
|
||||
xc_core_memory_map_t **mapp,
|
||||
unsigned int *nr_entries)
|
||||
{
|
||||
unsigned long p2m_size = nr_gpfns(xch, info->domid);
|
||||
xen_pfn_t p2m_size = 0;
|
||||
xc_core_memory_map_t *map;
|
||||
|
||||
if ( xc_domain_maximum_gpfn(xch, info->domid, &p2m_size) < 0 )
|
||||
return -1;
|
||||
|
||||
map = malloc(sizeof(*map));
|
||||
if ( map == NULL )
|
||||
{
|
||||
@@ -88,7 +85,12 @@ xc_core_arch_map_p2m_rw(xc_interface *xch, struct domain_info_context *dinfo, xc
|
||||
int err;
|
||||
int i;
|
||||
|
||||
dinfo->p2m_size = nr_gpfns(xch, info->domid);
|
||||
if ( xc_domain_maximum_gpfn(xch, info->domid, &dinfo->p2m_size) < 0 )
|
||||
{
|
||||
ERROR("Could not get maximum GPFN!");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( dinfo->p2m_size < info->nr_pages )
|
||||
{
|
||||
ERROR("p2m_size < nr_pages -1 (%lx < %lx", dinfo->p2m_size, info->nr_pages - 1);
|
||||
@@ -210,16 +212,7 @@ int
|
||||
xc_core_arch_get_scratch_gpfn(xc_interface *xch, domid_t domid,
|
||||
xen_pfn_t *gpfn)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = xc_domain_maximum_gpfn(xch, domid);
|
||||
|
||||
if ( rc < 0 )
|
||||
return rc;
|
||||
|
||||
*gpfn = (xen_pfn_t)rc + 1;
|
||||
|
||||
return 0;
|
||||
return xc_domain_maximum_gpfn(xch, domid, gpfn);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -789,9 +789,16 @@ int xc_domain_get_tsc_info(xc_interface *xch,
|
||||
}
|
||||
|
||||
|
||||
int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid)
|
||||
int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid, xen_pfn_t *gpfns)
|
||||
{
|
||||
return do_memory_op(xch, XENMEM_maximum_gpfn, &domid, sizeof(domid));
|
||||
int rc = do_memory_op(xch, XENMEM_maximum_gpfn, &domid, sizeof(domid));
|
||||
|
||||
if ( rc >= 0 )
|
||||
{
|
||||
*gpfns = rc + 1;
|
||||
rc = 0;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int xc_domain_increase_reservation(xc_interface *xch,
|
||||
|
||||
@@ -939,7 +939,11 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
|
||||
}
|
||||
|
||||
/* Get the size of the P2M table */
|
||||
dinfo->p2m_size = xc_domain_maximum_gpfn(xch, dom) + 1;
|
||||
if ( xc_domain_maximum_gpfn(xch, dom, &dinfo->p2m_size) < 0 )
|
||||
{
|
||||
ERROR("Could not get maximum GPFN!");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( dinfo->p2m_size > ~XEN_DOMCTL_PFINFO_LTAB_MASK )
|
||||
{
|
||||
|
||||