|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 1/2] xen/gnttab: Clean up goto tangle in grant_table_init()
On 29/09/17 15:23, Andrew Cooper wrote:
> No functional change.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> CC: Tim Deegan <tim@xxxxxxx>
> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
> CC: Juergen Gross <jgross@xxxxxxxx>
> ---
> xen/common/grant_table.c | 39 +++++++++++++++++++--------------------
> 1 file changed, 19 insertions(+), 20 deletions(-)
>
> diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
> index 71706f5..2e4b5e7 100644
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -1732,60 +1732,59 @@ gnttab_grow_table(struct domain *d, unsigned int
> req_nr_frames)
> static int
> grant_table_init(struct domain *d, struct grant_table *gt)
> {
> - int ret;
> + int ret = -ENOMEM;
>
> grant_write_lock(gt);
>
> if ( gt->active )
> {
> ret = -EBUSY;
> - goto unlock;
> + goto out;
That's wrong. In case someone is calling grant_table_init() again you
are freeing all resources.
Juergen
> }
>
> /* Active grant table. */
> gt->active = xzalloc_array(struct active_grant_entry *,
> max_nr_active_grant_frames);
> if ( gt->active == NULL )
> - goto no_mem;
> + goto out;
>
> /* Tracking of mapped foreign frames table */
> gt->maptrack = vzalloc(max_maptrack_frames * sizeof(*gt->maptrack));
> if ( gt->maptrack == NULL )
> - goto no_mem;
> + goto out;
>
> /* Shared grant table. */
> gt->shared_raw = xzalloc_array(void *, max_grant_frames);
> if ( gt->shared_raw == NULL )
> - goto no_mem;
> + goto out;
>
> /* Status pages for grant table - for version 2 */
> gt->status = xzalloc_array(grant_status_t *,
> grant_to_status_frames(max_grant_frames));
> if ( gt->status == NULL )
> - goto no_mem;
> + goto out;
>
> ret = gnttab_init_arch(gt);
> if ( ret )
> goto out;
>
> /* gnttab_grow_table() allocates a min number of frames, so 0 is okay. */
> - if ( gnttab_grow_table(d, 0) )
> - goto unlock;
> + ret = gnttab_grow_table(d, 0) ? 0 : -ENOMEM;
>
> - no_mem:
> - ret = -ENOMEM;
> out:
> - 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;
> + 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;
> + }
>
> - unlock:
> grant_write_unlock(gt);
>
> return ret;
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |