[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.7] gnttab: improve GNTTABOP_cache_flush locking
commit d02140fc4d2ba7151e70bab84aa0c791fe4e15a2 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Wed Dec 20 16:23:52 2017 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Wed Dec 20 16:23:52 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> master commit: 553ac37137c2d1c03bf1b69cfb192ffbfe29daa4 master date: 2017-12-04 11:04:18 +0100 --- 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 1eb8c7c..1c91704 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -680,10 +680,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, - unsigned int *ref_count) +static struct active_grant_entry *grant_map_exists(const struct domain *ld, + struct grant_table *rgt, + unsigned long mfn, + unsigned int *ref_count) { unsigned int ref, max_iter; @@ -699,28 +699,20 @@ static int grant_map_exists(const struct domain *ld, nr_grant_entries(rgt)); for ( ref = *ref_count; 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) ) { *ref_count = ref; - return 1; + return NULL; } - return -EINVAL; + return ERR_PTR(-EINVAL); } #define MAPKIND_READ 1 @@ -3012,6 +3004,7 @@ static int __gnttab_cache_flush(const gnttab_cache_flush_t *cflush, struct domain *d, *owner; struct page_info *page; unsigned long mfn; + struct active_grant_entry *act = NULL; void *v; int ret; @@ -3049,13 +3042,13 @@ static int __gnttab_cache_flush(const gnttab_cache_flush_t *cflush, { grant_read_lock(owner->grant_table); - ret = grant_map_exists(d, owner->grant_table, mfn, ref_count); - if ( ret != 0 ) + act = grant_map_exists(d, owner->grant_table, mfn, ref_count); + 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; } } @@ -3072,7 +3065,11 @@ static int __gnttab_cache_flush(const gnttab_cache_flush_t *cflush, 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#stable-4.7 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |