fix memory registeration bug with persistent message
authorGengbin Zheng <gzheng@illinois.edu>
Tue, 20 Mar 2012 07:27:44 +0000 (02:27 -0500)
committerGengbin Zheng <gzheng@illinois.edu>
Tue, 20 Mar 2012 07:27:44 +0000 (02:27 -0500)
src/arch/gemini_gni/machine-persistent.c
src/arch/gemini_gni/machine-persistent.h
src/arch/gemini_gni/machine.c
src/arch/util/persist-comm.c

index c607865a802a966535a24c7e373011b52d48a6dd..688f7b681f170cbbcc3f9853672210a71f5e7c4a 100644 (file)
@@ -66,7 +66,7 @@ void LrtsSendPersistentMsg(PersistentHandle h, int destNode, int size, void *m)
 #else
 #if REMOTE_EVENT
         pd->cq_mode |= GNI_CQMODE_REMOTE_EVENT;
-        int sts = GNI_EpSetEventData(ep_hndl_array[destNode], destNode, ACK_EVENT((int)(slot->destHandle)));
+        int sts = GNI_EpSetEventData(ep_hndl_array[destNode], destNode, ACK_EVENT((int)(size_t)(slot->destHandle)));
         GNI_RC_CHECK("GNI_EpSetEventData", sts);
 #endif
 
@@ -82,7 +82,11 @@ void LrtsSendPersistentMsg(PersistentHandle h, int destNode, int size, void *m)
             status = GNI_RC_ERROR_RESOURCE;
         if(status == GNI_RC_ERROR_RESOURCE|| status == GNI_RC_ERROR_NOMEM )
         {
+#if REMOTE_EVENT
+            bufferRdmaMsg(destNode, pd, (int)(size_t)(slot->destHandle));
+#else
             bufferRdmaMsg(destNode, pd, -1);
+#endif
         }else
             GNI_RC_CHECK("AFter posting", status);
 #endif
@@ -274,15 +278,19 @@ void setupRecvSlot(PersistentReceivesTable *slot, int maxBytes)
   }
   slot->sizeMax = maxBytes;
 #if REMOTE_EVENT
-  slot->index = IndexPool_getslot(&ackPool, slot->destBuf[0].destAddress, 2);
+  slot->index = IndexPool_getslot(&ackPool, slot, 2);
 #endif
 }
 
 
-PersistentHandle getPersistentHandle(PersistentHandle h)
+PersistentHandle getPersistentHandle(PersistentHandle h, int toindex)
 {
 #if REMOTE_EVENT
-  return (PersistentHandle)(((PersistentReceivesTable*)h)->index);
+  if (toindex)
+    return (PersistentHandle)(((PersistentReceivesTable*)h)->index);
+  else {
+    return (PersistentHandle)GetIndexAddress((int)(size_t)h);
+  }
 #else
   return h;
 #endif
index dc7ce76d87b2bfcf31f2293da4e468e56c902422..c0d4aed5432e55788574fb2eda4243ae1bdca8fb 100644 (file)
@@ -48,7 +48,7 @@ CpvExtern(PersistentHandle *, phs);
 CpvExtern(int, phsSize);
 CpvExtern(int, curphs);
 
-PersistentHandle getPersistentHandle(PersistentHandle h);
+PersistentHandle getPersistentHandle(PersistentHandle h, int toindex);
 void *PerAlloc(int size);
 void PerFree(char *msg);
 int PumpPersistent();
@@ -57,3 +57,4 @@ void swapRecvSlotBuffers(PersistentReceivesTable *slot);
 void setupRecvSlot(PersistentReceivesTable *slot, int maxBytes);
 
 /*@}*/
+
index 4cc109b10d3a5acc564f3073600b17041cdba359..0f93a816cc26dabc2b07dc13499cba32bf3fdaa8 100644 (file)
@@ -645,9 +645,9 @@ CpvDeclare(mempool_type*, mempool);
 /* ack pool for remote events */
 
 #define ACK_SHIFT                  19
-#define ACK_EVENT(idx)             ((idx<<ACK_SHIFT) | myrank)
-#define ACK_GET_RANK(evt)          (evt & ((1<<ACK_SHIFT)-1))
-#define ACK_GET_INDEX(evt)         (evt >> ACK_SHIFT)
+#define ACK_EVENT(idx)             (((idx)<<ACK_SHIFT) | myrank)
+#define ACK_GET_RANK(evt)          ((evt) & ((1<<ACK_SHIFT)-1))
+#define ACK_GET_INDEX(evt)         ((evt) >> ACK_SHIFT)
 
 struct IndexStruct {
 void *addr;
@@ -1074,7 +1074,7 @@ static void sweep_mempool(mempool_type *mptr)
 
     printf("[n %d %d] sweep_mempool slot START.\n", myrank, n++);
     while( current!= NULL) {
-        printf("[n %d %d] sweep_mempool slot %p size: %d (%d %d) %lld %lld.\n", myrank, n++, current, current->size, current->msgs_in_send, current->msgs_in_recv, current->mem_hndl.qword1, current->mem_hndl.qword2);
+        printf("[n %d %d] sweep_mempool slot %p size: %lld used: %d (%d %d) %lld %lld.\n", myrank, n++, current, current->size, 1<<current->used, current->msgs_in_send, current->msgs_in_recv, current->mem_hndl.qword1, current->mem_hndl.qword2);
         current = current->block_next?(block_header *)((char*)mptr+current->block_next):NULL;
     }
     printf("[n %d] sweep_mempool slot END.\n", myrank);
@@ -2149,7 +2149,11 @@ static gni_return_t  registerMessage(void *msg, int size, int seqno, gni_mem_han
         return GNI_RC_SUCCESS;
     }
 #endif
-    if(seqno == 0)
+    if(seqno == 0 
+#if CMK_PERSISTENT_COMM
+         || seqno == PERSIST_SEQ
+#endif
+      )
     {
         if(IsMemHndlZero((GetMemHndl(msg))))
         {
@@ -2443,14 +2447,19 @@ static void PumpRemoteTransactions()
             CmiFree(msg);
             IndexPool_freeslot(&ackPool, slot);
             break;
+#if CMK_PERSISTENT_COMM
         case 2:     // PERSISTENT
+            msg = ((PersistentReceivesTable*)msg)->destBuf[0].destAddress;
             size = CmiGetMsgSize(msg);
             CmiReference(msg);
             CMI_CHECK_CHECKSUM(msg, size);
             handleOneRecvedMsg(size, msg); 
             break;
-        default:
+#endif
+        default: {
+            fprintf(stderr, "[%d] PumpRemoteTransactions: unknown type: %d\n", myrank, type);
             CmiAbort("PumpRemoteTransactions: unknown type");
+            }
         }
     }
     if(status == GNI_RC_ERROR_RESOURCE)
@@ -2680,7 +2689,11 @@ static void  SendRdmaMsg()
             CmiNodeLock lock = (pd->type == GNI_POST_RDMA_GET || pd->type == GNI_POST_RDMA_PUT) ? rdma_tx_cq_lock:default_tx_cq_lock;
             CMI_GNI_LOCK(lock);
 #if REMOTE_EVENT
-            if( pd->cqwrite_value == 0 || pd->cqwrite_value == PERSIST_SEQ)
+            if( pd->cqwrite_value == 0
+#if CMK_PERSISTENT_COMM
+                || pd->cqwrite_value == PERSIST_SEQ
+#endif
+              )
             {
                 pd->cq_mode |= GNI_CQMODE_REMOTE_EVENT;
                 int sts = GNI_EpSetEventData(ep_hndl_array[ptr->destNode], ptr->destNode, ACK_EVENT(ptr->ack_index));
@@ -3726,7 +3739,7 @@ void LrtsDrainResources()
 }
 
 void LrtsAbort(const char *message) {
-    printf("CmiAbort is calling on PE:%d\n", myrank);
+    fprintf(stderr, "[%d] CmiAbort: %s\n", myrank, message);
     CmiPrintStackTrace(0);
     PMI_Abort(-1, message);
 }
index 766b36ebb7f8e169e4a2935df266f769ff7be2cb..73f670e4b8f91e5b0379994ea38a00be3b12a99c 100644 (file)
@@ -193,7 +193,7 @@ static void persistentRequestHandler(void *env)
   }
 
   gmsg->sourceHandler = msg->sourceHandler;
-  gmsg->destHandler = getPersistentHandle(h);
+  gmsg->destHandler = getPersistentHandle(h, 1);
 
   CmiSetHandler(gmsg, persistentReqGrantedHandlerIdx);
   CmiSyncSendAndFree(msg->requestorPE,sizeof(PersistentReqGrantedMsg),gmsg);
@@ -293,7 +293,7 @@ void persistentDestoryHandler(void *env)
 {             
   int i;
   PersistentDestoryMsg *msg = (PersistentDestoryMsg *)env;
-  PersistentHandle h = msg->destHandlerIndex;
+  PersistentHandle h = getPersistentHandle(msg->destHandlerIndex, 0);
   CmiAssert(h!=NULL);
   CmiFree(msg);
   PersistentReceivesTable *slot = (PersistentReceivesTable *)h;
@@ -323,7 +323,7 @@ void CmiDestoryPersistent(PersistentHandle h)
   if (h == 0) CmiAbort("CmiDestoryPersistent: not a valid PersistentHandle\n");
 
   PersistentSendsTable *slot = (PersistentSendsTable *)h;
-  CmiAssert(slot->destHandle != 0);
+  //CmiAssert(slot->destHandle != 0);
 
   PersistentDestoryMsg *msg = (PersistentDestoryMsg *)
                               CmiAlloc(sizeof(PersistentDestoryMsg));