|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] 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>
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -786,10 +786,10 @@ static int _set_status(unsigned gt_versi
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
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_cach
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_cach
{
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_cach
ret = 0;
if ( d != owner )
+ {
+ active_entry_release(act);
grant_read_unlock(owner->grant_table);
+ }
+
unmap_domain_page(v);
put_page(page);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |