xen/gnttab: Fold grant_table_{create,set_limits}() into grant_table_init()

Now that the max_{grant,maptrack}_frames are specified from the very beginning
of grant table construction, the various initialisation functions can be
folded together and simplified as a result.

Leave grant_table_init() as the public interface, which is more consistent
with other subsystems.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Andrew Cooper committed 2018-08-31 12:06:53 +01:00
1 parent ae8b8bc599
commit 6425f91c72
3 files changed
+31 -72

No files matched your search

+2 -2
View File
@@ -366,8 +366,8 @@ struct domain *domain_create(domid_t domid,
goto fail;
init_status |= INIT_evtchn;
if ( (err = grant_table_create(d, config->max_grant_frames,
config->max_maptrack_frames)) != 0 )
if ( (err = grant_table_init(d, config->max_grant_frames,
config->max_maptrack_frames)) != 0 )
goto fail;
init_status |= INIT_gnttab;
+27 -66
View File
@@ -1806,22 +1806,31 @@ active_alloc_failed:
return -ENOMEM;
}
static int
grant_table_init(struct domain *d, struct grant_table *gt,
unsigned int grant_frames, unsigned int maptrack_frames)
int grant_table_init(struct domain *d, unsigned int max_grant_frames,
unsigned int max_maptrack_frames)
{
struct grant_table *gt;
int ret = -ENOMEM;
grant_write_lock(gt);
if ( max_grant_frames < INITIAL_NR_GRANT_FRAMES ||
max_grant_frames > opt_max_grant_frames ||
max_maptrack_frames > opt_max_maptrack_frames )
return -EINVAL;
if ( gt->active )
{
ret = -EBUSY;
goto out_no_cleanup;
}
if ( (gt = xzalloc(struct grant_table)) == NULL )
return -ENOMEM;
gt->max_grant_frames = grant_frames;
gt->max_maptrack_frames = maptrack_frames;
/* Simple stuff. */
percpu_rwlock_resource_init(&gt->lock, grant_rwlock);
spin_lock_init(&gt->maptrack_lock);
gt->gt_version = 1;
gt->max_grant_frames = max_grant_frames;
gt->max_maptrack_frames = max_maptrack_frames;
/* Install the structure early to simplify the error path. */
gt->domain = d;
d->grant_table = gt;
/* Active grant table. */
gt->active = xzalloc_array(struct active_grant_entry *,
@@ -1848,29 +1857,21 @@ grant_table_init(struct domain *d, struct grant_table *gt,
if ( gt->status == NULL )
goto out;
grant_write_lock(gt);
ret = gnttab_init_arch(gt);
if ( ret )
goto out;
goto unlock;
/* gnttab_grow_table() allocates a min number of frames, so 0 is okay. */
ret = gnttab_grow_table(d, 0);
unlock:
grant_write_unlock(gt);
out:
if ( ret )
{
gnttab_destroy_arch(gt);
xfree(gt->status);
gt->status = NULL;
xfree(gt->shared_raw);
gt->shared_raw = NULL;
vfree(gt->maptrack);
gt->maptrack = NULL;
xfree(gt->active);
gt->active = NULL;
}
out_no_cleanup:
grant_write_unlock(gt);
grant_table_destroy(d);
return ret;
}
@@ -3567,30 +3568,6 @@ do_grant_table_op(
#include "compat/grant_table.c"
#endif
int grant_table_create(struct domain *d, unsigned int max_grant_frames,
unsigned int max_maptrack_frames)
{
struct grant_table *t;
int ret = 0;
if ( (t = xzalloc(struct grant_table)) == NULL )
return -ENOMEM;
/* Simple stuff. */
percpu_rwlock_resource_init(&t->lock, grant_rwlock);
spin_lock_init(&t->maptrack_lock);
t->gt_version = 1;
/* Okay, install the structure. */
t->domain = d;
d->grant_table = t;
ret = grant_table_set_limits(d, max_maptrack_frames, max_maptrack_frames);
return ret;
}
void
gnttab_release_mappings(
struct domain *d)
@@ -3781,22 +3758,6 @@ void grant_table_init_vcpu(struct vcpu *v)
v->maptrack_tail = MAPTRACK_TAIL;
}
int grant_table_set_limits(struct domain *d, unsigned int grant_frames,
unsigned int maptrack_frames)
{
struct grant_table *gt = d->grant_table;
if ( grant_frames < INITIAL_NR_GRANT_FRAMES ||
grant_frames > opt_max_grant_frames ||
maptrack_frames > opt_max_maptrack_frames )
return -EINVAL;
if ( !gt )
return -ENOENT;
/* Set limits. */
return grant_table_init(d, gt, grant_frames, maptrack_frames);
}
#ifdef CONFIG_HAS_MEM_SHARING
int mem_sharing_gref_to_gfn(struct grant_table *gt, grant_ref_t ref,
gfn_t *gfn, uint16_t *status)
+2 -4
View File
@@ -35,13 +35,11 @@ extern unsigned int opt_max_grant_frames;
extern unsigned int opt_max_maptrack_frames;
/* Create/destroy per-domain grant table context. */
int grant_table_create(struct domain *d, unsigned int max_grant_frames,
unsigned int max_maptrack_frames);
int grant_table_init(struct domain *d, unsigned int max_grant_frames,
unsigned int max_maptrack_frames);
void grant_table_destroy(
struct domain *d);
void grant_table_init_vcpu(struct vcpu *v);
int grant_table_set_limits(struct domain *d, unsigned int grant_frames,
unsigned int maptrack_frames);
/*
* Check if domain has active grants and log first 10 of them.
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.