[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] gnttab: improve GNTTABOP_cache_flush locking
commit 553ac37137c2d1c03bf1b69cfb192ffbfe29daa4 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Mon Dec 4 11:04:18 2017 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Mon Dec 4 11:04:18 2017 +0100 gnttab: improve GNTTABOP_cache_flush locking Dropping the lock before returning from grant_map_exists() means handing possibly stale information back to the caller. Return back the pointer to the active entry instead, for the caller to release the lock once done. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andre Przywara <andre.przywara@xxxxxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> --- xen/common/grant_table.c | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index bce224b..250450b 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -786,10 +786,10 @@ static int _set_status(unsigned gt_version, return _set_status_v2(domid, readonly, mapflag, shah, act, status); } -static int grant_map_exists(const struct domain *ld, - struct grant_table *rgt, - unsigned long mfn, - grant_ref_t *cur_ref) +static struct active_grant_entry *grant_map_exists(const struct domain *ld, + struct grant_table *rgt, + unsigned long mfn, + grant_ref_t *cur_ref) { grant_ref_t ref, max_iter; @@ -805,28 +805,20 @@ static int grant_map_exists(const struct domain *ld, nr_grant_entries(rgt)); for ( ref = *cur_ref; ref < max_iter; ref++ ) { - struct active_grant_entry *act; - bool_t exists; - - act = active_entry_acquire(rgt, ref); - - exists = act->pin - && act->domid == ld->domain_id - && act->frame == mfn; + struct active_grant_entry *act = active_entry_acquire(rgt, ref); + if ( act->pin && act->domid == ld->domain_id && act->frame == mfn ) + return act; active_entry_release(act); - - if ( exists ) - return 0; } if ( ref < nr_grant_entries(rgt) ) { *cur_ref = ref; - return 1; + return NULL; } - return -EINVAL; + return ERR_PTR(-EINVAL); } #define MAPKIND_READ 1 @@ -3213,6 +3205,7 @@ static int cache_flush(const gnttab_cache_flush_t *cflush, grant_ref_t *cur_ref) struct domain *d, *owner; struct page_info *page; unsigned long mfn; + struct active_grant_entry *act = NULL; void *v; int ret; @@ -3250,13 +3243,13 @@ static int cache_flush(const gnttab_cache_flush_t *cflush, grant_ref_t *cur_ref) { grant_read_lock(owner->grant_table); - ret = grant_map_exists(d, owner->grant_table, mfn, cur_ref); - if ( ret != 0 ) + act = grant_map_exists(d, owner->grant_table, mfn, cur_ref); + if ( IS_ERR_OR_NULL(act) ) { grant_read_unlock(owner->grant_table); rcu_unlock_domain(d); put_page(page); - return ret; + return act ? PTR_ERR(act) : 1; } } @@ -3273,7 +3266,11 @@ static int cache_flush(const gnttab_cache_flush_t *cflush, grant_ref_t *cur_ref) ret = 0; if ( d != owner ) + { + active_entry_release(act); grant_read_unlock(owner->grant_table); + } + unmap_domain_page(v); put_page(page); -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |