mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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:
1 parent
ae8b8bc599
commit
6425f91c72
3 files changed
+31
-72
No files matched your search
+2
-2
@@ -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
@@ -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(>->lock, grant_rwlock);
|
||||
spin_lock_init(>->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)
|
||||
|
||||
@@ -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.
|
||||
|
||||