| From fbe363c476afe8ec992d3baf682670a4bd1b6ce6 Mon Sep 17 00:00:00 2001 |
| From: Roger Pau Monne <roger.pau@citrix.com> |
| Date: Mon, 12 Aug 2013 12:53:44 +0200 |
| Subject: xen-blkfront: revoke foreign access for grants not mapped by the backend |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Roger Pau Monne <roger.pau@citrix.com> |
| |
| commit fbe363c476afe8ec992d3baf682670a4bd1b6ce6 upstream. |
| |
| There's no need to keep the foreign access in a grant if it is not |
| persistently mapped by the backend. This allows us to free grants that |
| are not mapped by the backend, thus preventing blkfront from hoarding |
| all grants. |
| |
| The main effect of this is that blkfront will only persistently map |
| the same grants as the backend, and it will always try to use grants |
| that are already mapped by the backend. Also the number of persistent |
| grants in blkfront is the same as in blkback (and is controlled by the |
| value in blkback). |
| |
| Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> |
| Reviewed-by: David Vrabel <david.vrabel@citrix.com> |
| Acked-by: Matt Wilson <msw@amazon.com> |
| Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Cc: David Vrabel <david.vrabel@citrix.com> |
| Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| |
| --- |
| drivers/block/xen-blkfront.c | 24 +++++++++++++++++++++--- |
| 1 file changed, 21 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/block/xen-blkfront.c |
| +++ b/drivers/block/xen-blkfront.c |
| @@ -894,9 +894,27 @@ static void blkif_completion(struct blk_ |
| } |
| } |
| /* Add the persistent grant into the list of free grants */ |
| - for (i = 0; i < s->req.u.rw.nr_segments; i++) { |
| - list_add(&s->grants_used[i]->node, &info->persistent_gnts); |
| - info->persistent_gnts_c++; |
| + for (i = 0; i < nseg; i++) { |
| + if (gnttab_query_foreign_access(s->grants_used[i]->gref)) { |
| + /* |
| + * If the grant is still mapped by the backend (the |
| + * backend has chosen to make this grant persistent) |
| + * we add it at the head of the list, so it will be |
| + * reused first. |
| + */ |
| + list_add(&s->grants_used[i]->node, &info->persistent_gnts); |
| + info->persistent_gnts_c++; |
| + } else { |
| + /* |
| + * If the grant is not mapped by the backend we end the |
| + * foreign access and add it to the tail of the list, |
| + * so it will not be picked again unless we run out of |
| + * persistent grants. |
| + */ |
| + gnttab_end_foreign_access(s->grants_used[i]->gref, 0, 0UL); |
| + s->grants_used[i]->gref = GRANT_INVALID_REF; |
| + list_add_tail(&s->grants_used[i]->node, &info->persistent_gnts); |
| + } |
| } |
| } |
| |