kernel: do not drop RAM caps
[barrelfish] / kernel / cap_delete.c
index 56dfcf2..fd5c11a 100644 (file)
@@ -253,6 +253,16 @@ cleanup_last(struct cte *cte, struct cte *ret_ram_cap)
         }
     }
 
+    // have cap to return to monitor but no allocated slot and no room in
+    // monitor channel; have user retry over monitor rpc interface
+    if (ram.bits > 0 &&
+        !ret_ram_cap &&
+        err_is_fail(lmp_can_deliver_payload(&monitor_ep, len)))
+    {
+        return SYS_ERR_RETRY_THROUGH_MONITOR;
+    }
+
+
     err = cleanup_copy(cte);
     if (err_is_fail(err)) {
         return err;
@@ -279,7 +289,7 @@ cleanup_last(struct cte *cte, struct cte *ret_ram_cap)
             memset(&ramcte, 0, sizeof(ramcte));
             ramcte.cap.u.ram = ram;
             ramcte.cap.type = ObjType_RAM;
-            TRACE_CAP_MSG("reclaimed", ret_ram_cap);
+            TRACE_CAP_MSG("reclaimed", &ramcte);
 #endif
             // XXX: This looks pretty ugly. We need an interface.
             err = lmp_deliver_payload(&monitor_ep, NULL,