diff options
author | Andres Lagar-Cavilla <andres@lagarcavilla.org> | 2012-01-19 10:42:42 +0000 |
---|---|---|
committer | Andres Lagar-Cavilla <andres@lagarcavilla.org> | 2012-01-19 10:42:42 +0000 |
commit | cd00a203a562caad39fa774e414a02fbdd99333c (patch) | |
tree | 51c87871fac576c557f48f30a13bedfef9fe353a /xen | |
parent | 9c5f0457b2fff90b5004b5fdca2c620ca7904e5f (diff) | |
download | xen-cd00a203a562caad39fa774e414a02fbdd99333c.tar.gz xen-cd00a203a562caad39fa774e414a02fbdd99333c.tar.bz2 xen-cd00a203a562caad39fa774e414a02fbdd99333c.zip |
Correct p2m unlocking during grant table map
We were not putting gfn's consistently.
Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Acked-by: Tim Deegan <tim@xen.org>
Committed-by: Tim Deegan <tim@xen.org>
Diffstat (limited to 'xen')
-rw-r--r-- | xen/common/grant_table.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 014734d240..34a49dbc1a 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -141,7 +141,7 @@ shared_entry_header(struct grant_table *t, grant_ref_t ref) #define active_entry(t, e) \ ((t)->active[(e)/ACGNT_PER_PAGE][(e)%ACGNT_PER_PAGE]) -/* Check if the page has been paged out */ +/* Check if the page has been paged out. If rc == GNTST_okay, caller must do put_gfn(rd, gfn) */ static int __get_paged_frame(unsigned long gfn, unsigned long *frame, int readonly, struct domain *rd) { int rc = GNTST_okay; @@ -573,7 +573,10 @@ __gnttab_map_grant_ref( gfn = sha1 ? sha1->frame : sha2->full_page.frame; rc = __get_paged_frame(gfn, &frame, !!(op->flags & GNTMAP_readonly), rd); if ( rc != GNTST_okay ) + { + gfn = INVALID_GFN; goto unlock_out; + } act->gfn = gfn; act->domid = ld->domain_id; act->frame = frame; @@ -700,7 +703,8 @@ __gnttab_map_grant_ref( op->handle = handle; op->status = GNTST_okay; - put_gfn(rd, gfn); + if ( gfn != INVALID_GFN ) + put_gfn(rd, gfn); rcu_unlock_domain(rd); return; |