|
@@ -1040,18 +1040,33 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
|
|
|
return ret;
|
|
|
|
|
|
for (i = 0; i < count; i++) {
|
|
|
- /* Retry eagain maps */
|
|
|
- if (map_ops[i].status == GNTST_eagain)
|
|
|
- gnttab_retry_eagain_gop(GNTTABOP_map_grant_ref, map_ops + i,
|
|
|
- &map_ops[i].status, __func__);
|
|
|
-
|
|
|
- if (map_ops[i].status == GNTST_okay) {
|
|
|
+ switch (map_ops[i].status) {
|
|
|
+ case GNTST_okay:
|
|
|
+ {
|
|
|
struct xen_page_foreign *foreign;
|
|
|
|
|
|
SetPageForeign(pages[i]);
|
|
|
foreign = xen_page_foreign(pages[i]);
|
|
|
foreign->domid = map_ops[i].dom;
|
|
|
foreign->gref = map_ops[i].ref;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case GNTST_no_device_space:
|
|
|
+ pr_warn_ratelimited("maptrack limit reached, can't map all guest pages\n");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case GNTST_eagain:
|
|
|
+ /* Retry eagain maps */
|
|
|
+ gnttab_retry_eagain_gop(GNTTABOP_map_grant_ref,
|
|
|
+ map_ops + i,
|
|
|
+ &map_ops[i].status, __func__);
|
|
|
+ /* Test status in next loop iteration. */
|
|
|
+ i--;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|