[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 08/12] 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@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx> CC: Julien Grall <julien.grall@xxxxxxx> CC: Wei Liu <wei.liu2@xxxxxxxxxx> v2: * Fix the cleanup path to avoid memory leaks. --- xen/common/domain.c | 4 +- xen/common/grant_table.c | 93 +++++++++++++------------------------------ xen/include/xen/grant_table.h | 6 +-- 3 files changed, 31 insertions(+), 72 deletions(-) diff --git a/xen/common/domain.c b/xen/common/domain.c index 1dcab8d..be51426 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -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; diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 3200542..a60d166 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -1802,22 +1802,31 @@ gnttab_grow_table(struct domain *d, unsigned int req_nr_frames) 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; + + /* 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; - gt->max_grant_frames = grant_frames; - gt->max_maptrack_frames = 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 *, @@ -1844,29 +1853,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; } @@ -3563,30 +3564,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) @@ -3777,22 +3754,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) diff --git a/xen/include/xen/grant_table.h b/xen/include/xen/grant_table.h index b46bb0a..12e8a4b 100644 --- a/xen/include/xen/grant_table.h +++ b/xen/include/xen/grant_table.h @@ -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. -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |