summaryrefslogtreecommitdiffstats
path: root/drivers/block/xen-blkfront.c
diff options
context:
space:
mode:
authorRoger Pau Monne <roger.pau@citrix.com>2013-08-12 06:53:44 -0400
committerJens Axboe <axboe@kernel.dk>2013-11-08 11:10:27 -0500
commitfbe363c476afe8ec992d3baf682670a4bd1b6ce6 (patch)
treeaec10083726bc4ff0a403480d0d2cb92837edc56 /drivers/block/xen-blkfront.c
parent370d6686683f44b6e869210eea2cf6a905b38a55 (diff)
xen-blkfront: revoke foreign access for grants not mapped by the backend
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>
Diffstat (limited to 'drivers/block/xen-blkfront.c')
-rw-r--r--drivers/block/xen-blkfront.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 8d53ed293606..429d52640940 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -1013,13 +1013,38 @@ static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info,
1013 } 1013 }
1014 /* Add the persistent grant into the list of free grants */ 1014 /* Add the persistent grant into the list of free grants */
1015 for (i = 0; i < nseg; i++) { 1015 for (i = 0; i < nseg; i++) {
1016 list_add(&s->grants_used[i]->node, &info->persistent_gnts); 1016 if (gnttab_query_foreign_access(s->grants_used[i]->gref)) {
1017 info->persistent_gnts_c++; 1017 /*
1018 * If the grant is still mapped by the backend (the
1019 * backend has chosen to make this grant persistent)
1020 * we add it at the head of the list, so it will be
1021 * reused first.
1022 */
1023 list_add(&s->grants_used[i]->node, &info->persistent_gnts);
1024 info->persistent_gnts_c++;
1025 } else {
1026 /*
1027 * If the grant is not mapped by the backend we end the
1028 * foreign access and add it to the tail of the list,
1029 * so it will not be picked again unless we run out of
1030 * persistent grants.
1031 */
1032 gnttab_end_foreign_access(s->grants_used[i]->gref, 0, 0UL);
1033 s->grants_used[i]->gref = GRANT_INVALID_REF;
1034 list_add_tail(&s->grants_used[i]->node, &info->persistent_gnts);
1035 }
1018 } 1036 }
1019 if (s->req.operation == BLKIF_OP_INDIRECT) { 1037 if (s->req.operation == BLKIF_OP_INDIRECT) {
1020 for (i = 0; i < INDIRECT_GREFS(nseg); i++) { 1038 for (i = 0; i < INDIRECT_GREFS(nseg); i++) {
1021 list_add(&s->indirect_grants[i]->node, &info->persistent_gnts); 1039 if (gnttab_query_foreign_access(s->indirect_grants[i]->gref)) {
1022 info->persistent_gnts_c++; 1040 list_add(&s->indirect_grants[i]->node, &info->persistent_gnts);
1041 info->persistent_gnts_c++;
1042 } else {
1043 gnttab_end_foreign_access(s->indirect_grants[i]->gref, 0, 0UL);
1044 s->indirect_grants[i]->gref = GRANT_INVALID_REF;
1045 list_add_tail(&s->indirect_grants[i]->node,
1046 &info->persistent_gnts);
1047 }
1023 } 1048 }
1024 } 1049 }
1025} 1050}