|
[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 |