aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Gross <jgross@suse.com>2018-09-19 09:42:33 -0400
committerBoris Ostrovsky <boris.ostrovsky@oracle.com>2018-09-19 11:27:42 -0400
commitd59f532480f5231bf62615a9287e05b78225fb05 (patch)
treed67f3ae4a076a445fec3a4becbb84b849e9a6dae
parent70513d58751d7c6c1a0133557b13089b9f2e3e66 (diff)
xen: issue warning message when out of grant maptrack entries
When a driver domain (e.g. dom0) is running out of maptrack entries it can't map any more foreign domain pages. Instead of silently stalling the affected domUs issue a rate limited warning in this case in order to make it easier to detect that situation. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
-rw-r--r--drivers/xen/grant-table.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 7bafa703a992..84575baceebc 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -1040,18 +1040,33 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
1040 return ret; 1040 return ret;
1041 1041
1042 for (i = 0; i < count; i++) { 1042 for (i = 0; i < count; i++) {
1043 /* Retry eagain maps */ 1043 switch (map_ops[i].status) {
1044 if (map_ops[i].status == GNTST_eagain) 1044 case GNTST_okay:
1045 gnttab_retry_eagain_gop(GNTTABOP_map_grant_ref, map_ops + i, 1045 {
1046 &map_ops[i].status, __func__);
1047
1048 if (map_ops[i].status == GNTST_okay) {
1049 struct xen_page_foreign *foreign; 1046 struct xen_page_foreign *foreign;
1050 1047
1051 SetPageForeign(pages[i]); 1048 SetPageForeign(pages[i]);
1052 foreign = xen_page_foreign(pages[i]); 1049 foreign = xen_page_foreign(pages[i]);
1053 foreign->domid = map_ops[i].dom; 1050 foreign->domid = map_ops[i].dom;
1054 foreign->gref = map_ops[i].ref; 1051 foreign->gref = map_ops[i].ref;
1052 break;
1053 }
1054
1055 case GNTST_no_device_space:
1056 pr_warn_ratelimited("maptrack limit reached, can't map all guest pages\n");
1057 break;
1058
1059 case GNTST_eagain:
1060 /* Retry eagain maps */
1061 gnttab_retry_eagain_gop(GNTTABOP_map_grant_ref,
1062 map_ops + i,
1063 &map_ops[i].status, __func__);
1064 /* Test status in next loop iteration. */
1065 i--;
1066 break;
1067
1068 default:
1069 break;
1055 } 1070 }
1056 } 1071 }
1057 1072