distops: fix typos and small bugs in delete state machine.
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Wed, 6 May 2015 15:55:48 +0000 (17:55 +0200)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Wed, 6 May 2015 15:55:48 +0000 (17:55 +0200)
Signed-off-by: Simon Gerber <simon.gerber@inf.ethz.ch>

errors/errno.fugu
kernel/cap_delete.c
usr/monitor/capops/capsend.c
usr/monitor/capops/delete.c
usr/tests/multihoptest/multihoptest.c

index a69ffbd..f7b7515 100755 (executable)
@@ -69,6 +69,7 @@ errors kernel SYS_ERR_ {
 
     // errors on the monitor-kernel interface
     failure DELETE_LAST_OWNED   "Tried to delete the last copy of a locally owned capability that may have remote copies",
+    failure DELETE_REMOTE_LOCAL "Tried to delete foreign copies from local copy",
     failure CAP_LOCKED          "The cap has already been locked",
     success RAM_CAP_CREATED     "A new RAM cap has been created",
 
index 4dea0d3..59a3cc7 100644 (file)
@@ -366,6 +366,11 @@ errval_t caps_delete_foreigns(struct cte *cte)
 {
     errval_t err;
     struct cte *next;
+    if (cte->mdbnode.owner == my_core_id) {
+        debug(SUBSYS_CAPS, "%s called on %d for %p, owner=%d\n",
+                __FUNCTION__, my_core_id, cte, cte->mdbnode.owner);
+        return SYS_ERR_DELETE_REMOTE_LOCAL;
+    }
     assert(cte->mdbnode.owner != my_core_id);
     if (cte->mdbnode.in_delete) {
         printk(LOG_WARN,
@@ -375,20 +380,22 @@ errval_t caps_delete_foreigns(struct cte *cte)
 
     TRACE_CAP_MSG("del copies of", cte);
 
+    // XXX: should we go predecessor as well?
     for (next = mdb_successor(cte);
          next && is_copy(&cte->cap, &next->cap);
          next = mdb_successor(cte))
     {
-        assert(next->mdbnode.owner = my_core_id);
-        if (cte->mdbnode.in_delete) {
+        // XXX: should this be == or != ?
+        assert(next->mdbnode.owner != my_core_id);
+        if (next->mdbnode.in_delete) {
             printk(LOG_WARN,
                    "foreign caps with in_delete set,"
                    " this should not happen");
         }
         err = cleanup_copy(next);
         if (err_is_fail(err)) {
-            panic("error while deleting foreign copy for remote_delete:"
-                  " 0x%"PRIuERRV"\n", err);
+            panic("error while deleting extra foreign copy for remote_delete:"
+                  " %"PRIuERRV"\n", err);
         }
     }
 
@@ -404,7 +411,7 @@ errval_t caps_delete_foreigns(struct cte *cte)
     err = caps_try_delete(cte);
     if (err_is_fail(err)) {
         panic("error while deleting foreign copy for remote_delete:"
-              " 0x%"PRIuERRV"\n", err);
+              " %"PRIuERRV"\n", err);
     }
 
     return SYS_ERR_OK;
index 1f9ca9e..e2e806d 100644 (file)
@@ -57,7 +57,7 @@ capsend_owner(struct domcapref capref, struct msg_queue_elem *queue_elem)
 }
 
 /*
- * Multicast helpers {{{1
+ * Multicast helpers {{{2
  */
 
 struct capsend_mc_msg_st;
@@ -166,7 +166,7 @@ capsend_broadcast(struct capsend_mc_st *bc_st, struct capsend_destset *dests,
     size_t online_monitors = num_monitors_online();
     // do not count self when calculating #dest cores
     dest_count = online_monitors - 1;
-    DEBUG_CAPOPS("%s: dest_count = %d\n", __FUNCTION__, dest_count);
+    DEBUG_CAPOPS("%s: dest_count = %zu\n", __FUNCTION__, dest_count);
     DEBUG_CAPOPS("%s: num_queued = %d\n", __FUNCTION__, bc_st->num_queued);
     DEBUG_CAPOPS("%s: num_pending = %d\n", __FUNCTION__, bc_st->num_pending);
     if (dests && dests->set == NULL) {
index de87a14..706fb47 100644 (file)
@@ -413,7 +413,7 @@ delete_trylock_cont(void *st)
                                           0, 0, &relations);
     GOTO_IF_ERR(err, report_error);
 
-    if (!(relations && RRELS_COPY_BIT)) {
+    if (!(relations & RRELS_COPY_BIT)) {
         // no remote relations, proceed with final delete
         DEBUG_CAPOPS("%s: deleting last copy\n", __FUNCTION__);
         delete_last(del_st);
@@ -485,6 +485,6 @@ free_st:
     free(del_st);
 
 err_cont:
-    DEBUG_CAPOPS("%s: calling result handler with err=%d\n", __FUNCTION__, err);
+    DEBUG_CAPOPS("%s: calling result handler with err=%"PRIuERRV"\n", __FUNCTION__, err);
     result_handler(err, st);
 }
index 5267a85..9c2acbb 100644 (file)
@@ -120,6 +120,7 @@ static void send_cont(void *arg)
         assert(err_is_ok(err));
 
 #ifdef __gem5__
+        // XXX: why do we need to do this for gem5 only? -SG, 2015-05-05.
         struct test_multihop_binding *mb = (struct test_multihop_binding *)b;
         mb->capst.tx_capnum = 0;
 #endif