[mpich2-commits] r4198 - mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad

mercierg at mcs.anl.gov mercierg at mcs.anl.gov
Thu Mar 26 10:16:26 CDT 2009


Author: mercierg
Date: 2009-03-26 10:16:25 -0500 (Thu, 26 Mar 2009)
New Revision: 4198

Added:
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_cancel.c
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_probe.c
Modified:
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/Makefile.sm
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_finalize.c
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_impl.h
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_init.c
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_poll.c
   mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_send.c
Log:
New version of the newmad module


Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/Makefile.sm
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/Makefile.sm	2009-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/Makefile.sm	2009-03-26 15:16:25 UTC (rev 4198)
@@ -2,4 +2,4 @@
            -I${top_builddir}/src/include
 lib${MPILIBNAME}_a_SOURCES = \
   newmad_finalize.c  newmad_init.c  newmad_poll.c      newmad_send.c \
-  newmad_register.c  newmad_test.c  newmad_cancel.c
+  newmad_register.c  newmad_test.c  newmad_cancel.c    newmad_probe.c  

Added: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_cancel.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_cancel.c	                        (rev 0)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_cancel.c	2009-03-26 15:16:25 UTC (rev 4198)
@@ -0,0 +1,66 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ *  (C) 2006 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+#include "newmad_impl.h"
+#include "my_papi_defs.h"
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_mx_cancel_send
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_newmad_cancel_send(MPIDI_VC_t *vc, MPID_Request *sreq)
+{
+    nm_sr_request_t *nmad_req = NULL;
+    int mpi_errno = MPI_SUCCESS;
+    int ret;
+    
+    nmad_req = &(REQ_FIELD(sreq,newmad_req));    
+    ret = nm_sr_scancel(mpid_nem_newmad_pcore,nmad_req);
+
+    if (ret ==  NM_ESUCCESS)
+    {
+        sreq->status.cancelled = TRUE;
+	mpid_nem_newmad_pending_send_req--;
+    }
+    else
+    {	    
+        sreq->status.cancelled = FALSE;
+    }
+    
+ fn_exit:
+    return mpi_errno;
+ fn_fail:  ATTRIBUTE((unused))
+    goto fn_exit;
+}
+
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_newmad_cancel_recv
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_newmad_cancel_recv(MPIDI_VC_t *vc, MPID_Request *rreq)
+{
+    nm_sr_request_t *nmad_req = NULL;
+    int mpi_errno = MPI_SUCCESS;
+    int ret;
+    
+    nmad_req = &(REQ_FIELD(rreq,newmad_req));    
+    ret = nm_sr_rcancel(mpid_nem_newmad_pcore,nmad_req);
+
+    if (ret ==  NM_ESUCCESS)
+    {	    
+        rreq->status.cancelled = TRUE;
+    }
+    else
+    {
+        rreq->status.cancelled = FALSE;
+    }
+
+ fn_exit:
+    return mpi_errno;
+ fn_fail:  ATTRIBUTE((unused))
+    goto fn_exit;
+}

Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_finalize.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_finalize.c	2009-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_finalize.c	2009-03-26 15:16:25 UTC (rev 4198)
@@ -18,7 +18,7 @@
 
    fn_exit:
      return mpi_errno;
-   fn_fail:
+   fn_fail:  ATTRIBUTE((unused))
      goto fn_exit;
 }
 
@@ -32,7 +32,7 @@
    int mpi_errno = MPI_SUCCESS;
    fn_exit:
       return mpi_errno;
-   fn_fail:
+   fn_fail:  ATTRIBUTE((unused))
       goto fn_exit;
 }
 

Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_impl.h
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_impl.h	2009-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_impl.h	2009-03-26 15:16:25 UTC (rev 4198)
@@ -6,7 +6,6 @@
 
 #ifndef NEWMAD_MODULE_IMPL_H
 #define NEWMAD_MODULE_IMPL_H
-//#include <linux/types.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <stdint.h>
@@ -45,15 +44,17 @@
 int MPID_nem_newmad_directRecv(MPIDI_VC_t *vc, MPID_Request *rreq);
 int MPID_nem_newmad_cancel_send(MPIDI_VC_t *vc, MPID_Request *sreq);
 int MPID_nem_newmad_cancel_recv(MPIDI_VC_t *vc, MPID_Request *rreq);
-
+int MPID_nem_newmad_probe(MPIDI_VC_t *vc,  int source, int tag, MPID_Comm *comm, 
+			  int context_offset, MPI_Status *status);
+int MPID_nem_newmad_iprobe(MPIDI_VC_t *vc,  int source, int tag, MPID_Comm *comm, 
+			   int context_offset, int *flag, MPI_Status *status);
 /* Any source management */
-int MPID_nem_newmad_anysource_posted(MPID_Request *rreq);
+void MPID_nem_newmad_anysource_posted(MPID_Request *rreq);
 int MPID_nem_newmad_anysource_matched(MPID_Request *rreq);
 
 /* Callbacks for events */
-void MPID_nem_newmad_get_adi_msg(nm_sr_event_t event, nm_sr_event_info_t*info);
-void MPID_nem_newmad_handle_sreq(nm_sr_event_t event, nm_sr_event_info_t*info);
-void MPID_nem_newmad_handle_rreq(nm_sr_event_t event, nm_sr_event_info_t*info);
+void MPID_nem_newmad_get_adi_msg(nm_sr_event_t event, const nm_sr_event_info_t*info);
+void MPID_nem_newmad_handle_sreq(nm_sr_event_t event, const nm_sr_event_info_t*info);
 
 /* Dtype management */
 int MPID_nem_newmad_process_sdtype(MPID_Request **sreq_p,  MPI_Datatype datatype,  MPID_Datatype * dt_ptr, const void *buf, 
@@ -64,16 +65,15 @@
 /* Connection management*/
 int MPID_nem_newmad_send_conn_info (MPIDI_VC_t *vc);
 
-#define MPID_NEM_NMAD_MAX_STRING_SIZE   ((MPID_NEM_MAX_NETMOD_STRING_LEN)/2)
-#define MPID_NEM_NMAD_MAX_NETS          4
+#define MPID_NEM_NMAD_MAX_NETS 3
+#define MY_SIZE (MPID_NEM_MAX_NETMOD_STRING_LEN/2)
+typedef nm_gate_t mpid_nem_newmad_p_gate_t;
 
-typedef nm_gate_id_t mpid_nem_newmad_p_gate_t;
-
 typedef struct MPID_nem_newmad_vc_area_internal
 {
-    char hostname[MPID_NEM_NMAD_MAX_STRING_SIZE];
-    char url[MPID_NEM_NMAD_MAX_NETS][MPID_NEM_NMAD_MAX_STRING_SIZE];
-    uint8_t drv_id[MPID_NEM_NMAD_MAX_NETS];
+    char                     hostname[MY_SIZE];
+    char                     url[MPID_NEM_NMAD_MAX_NETS][MY_SIZE];
+    uint8_t                  drv_id[MPID_NEM_NMAD_MAX_NETS];
     mpid_nem_newmad_p_gate_t p_gate;
 } MPID_nem_newmad_vc_area_internal_t;
 
@@ -164,9 +164,10 @@
 #define NEM_NMAD_DIRECT_MATCH(_match,_tag,_rank,_context) NEM_NMAD_SET_MATCH(_match,_tag,_rank,_context)
 #define NEM_NMAD_ADI_MATCH(_match)                        NEM_NMAD_SET_MATCH(_match,0,0,NEM_NMAD_INTRA_CTXT)
 
-extern nm_core_t                 mpid_nem_newmad_pcore;
-extern mpid_nem_newmad_p_gate_t *mpid_nem_newmad_gate_to_rank;
-extern int                       mpid_nem_newmad_pending_send_req;
+extern nm_core_t  mpid_nem_newmad_pcore;
+extern int        mpid_nem_newmad_pending_send_req;
 
+#define NMAD_IOV_MAX_DEPTH 15 /* NM_SO_PREALLOC_IOV_LEN */
+
 #endif //NEWMAD_MODULE_IMPL_H
 

Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_init.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_init.c	2009-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_init.c	2009-03-26 15:16:25 UTC (rev 4198)
@@ -39,21 +39,21 @@
     NULL,                   /* startall */
 
     MPID_nem_newmad_cancel_send,/* cancel_send */
-    MPID_nem_newmad_cancel_recv /* cancel_recv */
+    MPID_nem_newmad_cancel_recv, /* cancel_recv */
+
+    MPID_nem_newmad_probe, /* probe */
+    MPID_nem_newmad_iprobe /* iprobe */
 };
 
-//typedef int (*nm_driver_load)(struct nm_drv_ops*);
 
 static int         mpid_nem_newmad_myrank;
 static nm_drv_id_t drv_id[MPID_NEM_NMAD_MAX_NETS];
 static char       *url[MPID_NEM_NMAD_MAX_NETS];
-static char        url_keys[MPID_NEM_NMAD_MAX_NETS][MPID_NEM_NMAD_MAX_STRING_SIZE] = {"url_id0","url_id1","url_id2","url_id3"};
+static char        url_keys[MPID_NEM_NMAD_MAX_NETS][MPID_NEM_MAX_NETMOD_STRING_LEN] = {"url_id0","url_id1","url_id2","url_id3"};
 static int         mpid_nem_newmad_num_rails = 1 ;
 nm_core_t          mpid_nem_newmad_pcore;
 int                mpid_nem_newmad_pending_send_req = 0;
-mpid_nem_newmad_p_gate_t *mpid_nem_newmad_gate_to_rank = NULL;
 
-                                                                                                      
 #ifdef MPID_MAD_MODULE_MULTIRAIL
 static puk_component_t *p_driver_load_array;
 static void mpid_nem_newmad_rails(void)
@@ -75,6 +75,7 @@
 #if defined CONFIG_TCP
     mpid_nem_newmad_num_rails++;
 #endif
+    MPIU_Assert(mpid_nem_newmad_num_rails <= MPID_NEM_NMAD_MAX_NETS);
 
     p_driver_load_array = (puk_component_t *)MPIU_Malloc( mpid_nem_newmad_num_rails*sizeof(puk_component_t));
 
@@ -94,7 +95,7 @@
     p_driver_load_array[index++] = nm_core_component_load("driver", "tcp");
 #endif
 }
-#else //MPID_MAD_MODULE_MULTIRAIL
+#else /* MPID_MAD_MODULE_MULTIRAIL */
 static puk_component_t  p_driver_load;
 static void mpid_nem_newmad_rails(void)
 {
@@ -110,7 +111,7 @@
     p_driver_load = nm_core_component_load("driver", "tcp");
 # endif
 }
-#endif //MULTIRAIL
+#endif /* MULTIRAIL */
 
 
 #undef FUNCNAME
@@ -123,8 +124,8 @@
 #ifdef CONFIG_TCP
 #ifndef MPID_MAD_MODULE_MULTIRAIL
     char  hostname[16];
-#endif //TCP
-#endif //MPID_MAD_MODULE_MULTIRAIL
+#endif /* TCP */
+#endif /* MPID_MAD_MODULE_MULTIRAIL */
 #endif
     int   index = 0;
     int   ret;
@@ -140,7 +141,7 @@
     mpid_nem_newmad_rails();
 #ifdef MPID_MAD_MODULE_MULTIRAIL
     fprintf(stdout,"Number of rails : %i\n",nem_mad_num_rail);
-#endif //MPID_MAD_MODULE_MULTIRAIL
+#endif /* MPID_MAD_MODULE_MULTIRAIL */
 
     ret = nm_sr_init(mpid_nem_newmad_pcore);
     if(ret != NM_ESUCCESS) {
@@ -150,10 +151,10 @@
 #warning "========== MAD MODULE MULTIRAIL CODE ENABLED ============="
     ret = nm_core_driver_load_init_some(mpid_nem_newmad_pcore, mpid_nem_newmad_num_rails, 
 					p_driver_load_array, drv_id, url);
-#else //MPID_MAD_MODULE_MULTIRAIL
+#else /* MPID_MAD_MODULE_MULTIRAIL */
     ret = nm_core_driver_load_init(mpid_nem_newmad_pcore, 
 				   p_driver_load, &drv_id[0], &url[0]);
-#endif //MPID_MAD_MODULE_MULTIRAIL
+#endif /* MPID_MAD_MODULE_MULTIRAIL */
     if (ret != NM_ESUCCESS) {
 	fprintf(stdout,"nm_core_driver_init(some) returned ret = %d\n", ret);
     }
@@ -168,15 +169,15 @@
 	url[0] = (char *)MPIU_Malloc(strlen(hostname)+1);
 	strcpy(url[0],hostname);
     }
-#endif //!MULTIRAIL 
-#endif // TCP                                                                                                                             
+#endif /* !MULTIRAIL  */
+#endif /* TCP */                                                                                                                            
 #endif  
     
     nm_ns_init(mpid_nem_newmad_pcore);
-    
+
  fn_exit:
     return mpi_errno;
- fn_fail:
+ fn_fail: ATTRIBUTE((unused))
     goto fn_exit;
 }
 
@@ -219,7 +220,7 @@
    int index;
 
    fprintf(stdout,"Size of MPID_nem_mad_module_vc_area_internal_t : %i | size of nm_sr_request_t :%i | Size of req_area : %i\n",
-           sizeof(MPID_nem_newmad_vc_area_internal_t),sizeof(nm_sr_request_t), sizeof(MPID_nem_newmad_req_area));
+         sizeof(MPID_nem_newmad_vc_area_internal_t),sizeof(nm_sr_request_t), sizeof(MPID_nem_newmad_req_area));
    MPIU_Assert( sizeof(MPID_nem_newmad_vc_area_internal_t) <= MPID_NEM_VC_NETMOD_AREA_LEN);
    MPIU_Assert( sizeof(MPID_nem_newmad_req_area) <= MPID_NEM_REQ_NETMOD_AREA_LEN);
 
@@ -232,12 +233,11 @@
 
    init_mad(pg_p);
 
-   mpi_errno = MPID_nem_mad_module_get_business_card (pg_rank,bc_val_p, val_max_sz_p);
+   mpi_errno = MPID_nem_newmad_get_business_card(pg_rank,bc_val_p, val_max_sz_p);
    if (mpi_errno) MPIU_ERR_POP (mpi_errno);
 
    nm_sr_monitor(mpid_nem_newmad_pcore, NM_SR_EVENT_RECV_UNEXPECTED, &MPID_nem_newmad_get_adi_msg);
    nm_sr_monitor(mpid_nem_newmad_pcore, NM_SR_EVENT_SEND_COMPLETED, &MPID_nem_newmad_handle_sreq);
-   //nm_sr_monitor(mpid_nem_newmad_pcore, NM_SR_EVENT_RECV_COMPLETED, &MPID_nem_newmad_handle_rreq);
 
    mpi_errno = MPIDI_CH3I_Register_anysource_notification(MPID_nem_newmad_anysource_posted, 
                                                           MPID_nem_newmad_anysource_matched);
@@ -245,7 +245,7 @@
 
    fn_exit:
        return mpi_errno;
-   fn_fail:
+   fn_fail: 
        goto fn_exit;
 }
 
@@ -341,10 +341,38 @@
 int
 MPID_nem_newmad_vc_init (MPIDI_VC_t *vc)
 {
-    int mpi_errno = MPI_SUCCESS;   
-    MPIDI_CH3I_VC *vc_ch = (MPIDI_CH3I_VC *)vc->channel_private;
+    MPIDI_CH3I_VC           *vc_ch = (MPIDI_CH3I_VC *)vc->channel_private;
+    char                     business_card[MPID_NEM_MAX_NETMOD_STRING_LEN];
+    int                      mpi_errno = MPI_SUCCESS;   
+    int                      ret;
+    int                      index;
 
+    mpi_errno = vc->pg->getConnInfo(vc->pg_rank, business_card, MPID_NEM_MAX_NETMOD_STRING_LEN, vc->pg);
+    if (mpi_errno) MPIU_ERR_POP(mpi_errno);
+       
+    (((MPID_nem_newmad_vc_area *)((MPIDI_CH3I_VC *)(vc)->channel_private)->netmod_area.padding)->area) =
+	(MPID_nem_newmad_vc_area_internal_t *)MPIU_Malloc(sizeof(MPID_nem_newmad_vc_area_internal_t));
+
+    MPIU_Assert( (((MPID_nem_newmad_vc_area *)((MPIDI_CH3I_VC *)(vc)->channel_private)->netmod_area.padding)->area) != NULL);
+
+    ret = nm_core_gate_init(mpid_nem_newmad_pcore, &(VC_FIELD(vc, p_gate)));
+    if (ret != NM_ESUCCESS) fprintf(stdout,"nm_core_gate_init returned ret = %d\n", ret);
+    nm_gate_ref_set(VC_FIELD(vc, p_gate),(void*)vc);
     
+    for(index = 0 ; index < mpid_nem_newmad_num_rails ; index ++)
+    {	
+	mpi_errno = MPID_nem_newmad_get_from_bc (business_card, VC_FIELD(vc, hostname), VC_FIELD(vc, url[index]), index);
+	if (mpi_errno) MPIU_ERR_POP (mpi_errno);
+	
+	VC_FIELD(vc, drv_id[index]) = drv_id[index];
+	
+	if (vc->lpid > mpid_nem_newmad_myrank){
+	    ret = nm_core_gate_accept(mpid_nem_newmad_pcore,VC_FIELD(vc, p_gate), drv_id[index], NULL);
+	}
+	else if (vc->lpid < mpid_nem_newmad_myrank){
+	    ret = nm_core_gate_connect(mpid_nem_newmad_pcore,VC_FIELD(vc, p_gate), drv_id[index], VC_FIELD(vc, url[index]));
+	}
+    }
 
     vc->eager_max_msg_sz = 32768;
     vc->rndvSend_fn      = NULL;
@@ -368,6 +396,8 @@
 {
     int mpi_errno = MPI_SUCCESS;   
 
+    MPIU_Free((((MPID_nem_newmad_vc_area *)((MPIDI_CH3I_VC *)(vc)->channel_private)->netmod_area.padding)->area));
+
  fn_exit:   
        return mpi_errno;
  fn_fail:

Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_poll.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_poll.c	2009-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_poll.c	2009-03-26 15:16:25 UTC (rev 4198)
@@ -6,7 +6,7 @@
 
 #include "newmad_impl.h"
 #include "my_papi_defs.h"
-#include "uthash.h"
+#include "../mx/uthash.h"
 
 typedef struct mpid_nem_nmad_hash_struct {
     MPID_Request    *mpid_req_ptr;
@@ -28,48 +28,43 @@
 	if(s){HASH_DELETE(hh, mpid_nem_nmad_asreqs, s); (_nmad_req) = s->nmad_req_ptr; } else {(_nmad_req) = NULL;} \
     }while(0)
 
+static int MPID_nem_newmad_handle_rreq(MPID_Request *req, nm_sr_request_t *nmad_request, nm_tag_t match_info, size_t size);
 
-
-
 #undef FUNCNAME
 #define FUNCNAME MPID_nem_newmad_get_adi_msg
 #undef FCNAME
 #define FCNAME MPIDI_QUOTE(FUNCNAME)
-void MPID_nem_newmad_get_adi_msg(nm_sr_event_t event, nm_sr_event_info_t*info)
+void 
+MPID_nem_newmad_get_adi_msg(nm_sr_event_t event, const nm_sr_event_info_t*info)
 {
     nm_tag_t match_info = info->recv_unexpected.tag;
     MPIR_Context_id_t ctxt;
     NEM_NMAD_MATCH_GET_CTXT(match_info, ctxt);
     if(ctxt == NEM_NMAD_INTRA_CTXT)
     {
-	nm_gate_t     from = info->recv_unexpected.p_gate;
+	mpid_nem_newmad_p_gate_t from   = info->recv_unexpected.p_gate;
+	int                      length = info->recv_unexpected.len; 
 	MPID_Request *rreq;
-	MPIDI_VC_t   *vc;
-	struct iovec  mad_iov;
-	int           num_iov = 1;
-	int           length = 0; //=info->...
+	void         *data;
 
 	rreq = MPID_Request_create();
 	MPIU_Assert (rreq != NULL);
 	MPIU_Object_set_ref (rreq, 1);
 	rreq->kind = MPID_REQUEST_RECV;   
-
-	//get vc from gate
-	rreq->ch.vc = vc;
+	rreq->ch.vc = nm_gate_ref_get(from);
       
 	if(length <=  sizeof(MPIDI_CH3_PktGeneric_t)) {
-	    mad_iov.iov_base = (char*)&(rreq->dev.pending_pkt);
+	    data = (void *)&(rreq->dev.pending_pkt);
 	}
 	else{
 	    rreq->dev.tmpbuf = MPIU_Malloc(length);
 	    MPIU_Assert(rreq->dev.tmpbuf);
 	    rreq->dev.tmpbuf_sz = length;               
-	    mad_iov.iov_base = (char*)(rreq->dev.tmpbuf);
+	    data = (void *)(rreq->dev.tmpbuf);
 	}
-	mad_iov.iov_len = length;
 	
-	nm_sr_irecv_with_ref(mpid_nem_newmad_pcore, from, match_info, mad_iov.iov_base,
-			     length, &(REQ_FIELD(rreq,newmad_req)), (void *)&rreq);	
+	nm_sr_irecv_with_ref(mpid_nem_newmad_pcore, from, match_info, data,length, 
+			     &(REQ_FIELD(rreq,newmad_req)),(void *)rreq);	
     }
     return;
 }
@@ -84,35 +79,163 @@
     MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_NEWMAD_DIRECTRECV);    
     MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_NEWMAD_DIRECTRECV);    
     
+    if (!((MPIDI_CH3I_VC *)vc->channel_private)->is_local)
+    {
+	nm_tag_t          match_info = 0; 
+	MPIR_Rank_t       source     = rreq->dev.match.parts.rank;
+	MPIR_Context_id_t context    = rreq->dev.match.parts.context_id;
+	Nmad_Nem_tag_t    tag        = rreq->dev.match.parts.tag;
+	int               ret;
+	int               num_seg = 1;
+	MPIDI_msg_sz_t    data_sz;
+	int               dt_contig;
+	MPI_Aint          dt_true_lb;
+	MPID_Datatype    *dt_ptr;
+	struct iovec      newmad_iov[NMAD_IOV_MAX_DEPTH];
+	
+	NEM_NMAD_DIRECT_MATCH(match_info,0,source,context);
+	if (tag != MPI_ANY_TAG)
+	{
+	    NEM_NMAD_SET_TAG(match_info,tag);
+	}
+	else
+	{
+	    MPIU_Assert(0);
+	}
+	
+	MPIDI_Datatype_get_info(rreq->dev.user_count,rreq->dev.datatype, dt_contig, data_sz, dt_ptr,dt_true_lb);
+	rreq->dev.OnDataAvail = NULL;
+	
+	if (dt_contig)
+	{
+            newmad_iov[0].iov_base = (char*)(rreq->dev.user_buf) + dt_true_lb;
+            newmad_iov[0].iov_len  = data_sz;
+	}
+	else
+	{
+	    struct iovec *newmad_iov_ptr = &(newmad_iov[0]); 
+	    MPID_nem_newmad_process_rdtype(&rreq,dt_ptr,data_sz,&newmad_iov_ptr,&num_seg);
+	}
+	
+	MPIU_Assert(num_seg <= NMAD_IOV_MAX_DEPTH);
 
-
-
-
+	ret = nm_sr_irecv_iov_with_ref(mpid_nem_newmad_pcore,VC_FIELD(vc,p_gate),match_info,
+				       newmad_iov,num_seg,&(REQ_FIELD(rreq,newmad_req)),(void*)rreq);	
+    }
+   
  fn_exit:
     MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_DIRECTRECV);
     return mpi_errno;
- fn_fail:
+ fn_fail:  ATTRIBUTE((unused))
     goto fn_exit;
 }
 
 #undef FUNCNAME
-#define FUNCNAME MPID_nem_newmad_poll
+#define FUNCNAME MPID_nem_newmad_poll_recv
 #undef FCNAME
 #define FCNAME MPIDI_QUOTE(FUNCNAME)
-int
-MPID_nem_newmad_poll(MPID_nem_poll_dir_t in_or_out)
+static int 
+MPID_nem_newmad_poll_recv(void)
 {
    int              mpi_errno = MPI_SUCCESS;   
    nm_sr_request_t *p_out_req = NULL;
-   MPID_Request    *rreq = NULL;
+   MPID_Request    *req = NULL;
+   int              ret;
 
-   //   nm_sr_progress(mpid_nem_newmad_pcore);
-   nm_sr_recv_success(mpid_nem_newmad_pcore, &p_out_req);
+   ret = nm_sr_recv_success(mpid_nem_newmad_pcore, &p_out_req);
+   if (p_out_req != NULL)
+   {
+       nm_tag_t          match_info = 0;
+       MPIR_Context_id_t ctxt;
+       size_t            size;
+       MPID_Request     *req;
+       void             *ref;
+       nm_sr_get_size(mpid_nem_newmad_pcore, p_out_req, &size);
+       nm_sr_get_tag(mpid_nem_newmad_pcore, p_out_req, &match_info);
+       nm_sr_get_ref(mpid_nem_newmad_pcore,p_out_req,&ref);
+       req =  (MPID_Request *)ref;
+       MPIU_Assert(req != NULL);
 
+       NEM_NMAD_MATCH_GET_CTXT(match_info, ctxt);       
+       if(ctxt == NEM_NMAD_INTRA_CTXT)
+       {
+	   if (req->kind == MPID_REQUEST_RECV)
+	   {
+	       if (size <= sizeof(MPIDI_CH3_PktGeneric_t))
+	       {
+		   MPID_nem_handle_pkt(req->ch.vc,(char *)&(req->dev.pending_pkt),(MPIDI_msg_sz_t)(size));
+	       }
+	       else
+	       {
+		   MPID_nem_handle_pkt(req->ch.vc,(char *)(req->dev.tmpbuf),(MPIDI_msg_sz_t)(req->dev.tmpbuf_sz));
+		   MPIU_Free(req->dev.tmpbuf);
+	       }
+	       MPIDI_CH3_Request_destroy(req);
+	   }
+	   else
+	   {
+	       MPIU_Assert(0);
+	   }
+       }
+       else
+       {
+	   if ((req->kind == MPID_REQUEST_RECV) || (req->kind == MPID_PREQUEST_RECV))
+	   {
+	       int found = FALSE;
+	       nm_sr_request_t *nmad_request = NULL;	       
+	       MPIU_Assert(MPIDI_Request_get_type(req) != MPIDI_REQUEST_TYPE_GET_RESP);
+	       MPIU_THREAD_CS_ENTER(MSGQUEUE,req);
+	       MPID_NEM_NMAD_GET_REQ_FROM_HASH(req,nmad_request);
+	       found = MPIDI_CH3U_Recvq_DP(req);
+	       if(found){
+		   MPID_nem_newmad_handle_rreq(req,nmad_request,match_info,size);
+	       }
+	       if(nmad_request != NULL)
+	       {
+		   MPIU_Assert(req->dev.match.parts.rank == MPI_ANY_SOURCE);
+		   MPIU_Free(nmad_request);
+	       }
+	       MPIU_THREAD_CS_EXIT(MSGQUEUE,req);
+	   }
+	   else
+	   {
+	       MPIU_Assert(0);
+	   }
+       }
+   }
+ fn_exit:
+   return mpi_errno;
+ fn_fail:  ATTRIBUTE((unused))
+   goto fn_exit;   
+}
 
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_newmad_poll
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int 
+MPID_nem_newmad_poll(MPID_nem_poll_dir_t in_or_out)
+{
+   int mpi_errno = MPI_SUCCESS;   
+
+   MPID_nem_newmad_poll_recv();   
+
+   /*
+   if (in_or_out)
+   {
+       MPID_nem_newmad_poll_recv();   
+       MPID_nem_newmad_poll_send();   
+   }
+   else 
+   {
+       MPID_nem_newmad_poll_send();   
+       MPID_nem_newmad_poll_recv();   
+   }
+   */
+
  fn_exit:
    return mpi_errno;
- fn_fail:
+ fn_fail:  ATTRIBUTE((unused))
    goto fn_exit;   
 }
 
@@ -121,14 +244,25 @@
 #undef FCNAME
 #define FCNAME MPIDI_QUOTE(FUNCNAME)
 void
-MPID_nem_newmad_handle_sreq(nm_sr_event_t event, nm_sr_event_info_t*info)
+MPID_nem_newmad_handle_sreq(nm_sr_event_t event, const nm_sr_event_info_t*info)
 {
+    nm_sr_request_t  *p_request = info->send_completed.p_request;
+    MPID_Request     *req;
+    nm_tag_t          match_info = 0;
+    MPIR_Context_id_t ctxt;
+    void             *ref; 
+    int (*reqFn)(MPIDI_VC_t *, MPID_Request *, int *);
+   
+    nm_sr_get_tag(mpid_nem_newmad_pcore,p_request, &match_info);
+    nm_sr_get_ref(mpid_nem_newmad_pcore,p_request,&ref);
+    req = (MPID_Request *)ref;
+    MPIU_Assert(req != NULL);
 
-    int (*reqFn)(MPIDI_VC_t *, MPID_Request *, int *);
-    nm_sr_request_t *p_request = info->send_completed.p_request;
-    MPID_Request *req;
-    nm_sr_get_ref(mpid_nem_newmad_pcore,p_request,(void *)&req);
-    MPIU_Assert(MPIDI_Request_get_type(req) != MPIDI_REQUEST_TYPE_GET_RESP);                  
+    NEM_NMAD_MATCH_GET_CTXT(match_info, ctxt);
+    if(ctxt != NEM_NMAD_INTRA_CTXT)
+    {
+	MPIU_Assert(MPIDI_Request_get_type(req) != MPIDI_REQUEST_TYPE_GET_RESP);                  
+    }
     reqFn = req->dev.OnDataAvail;
     if (!reqFn){
 	MPIDI_CH3U_Request_complete(req);
@@ -145,23 +279,136 @@
 	}
     }
     mpid_nem_newmad_pending_send_req--;
-    return;
 }
 
 #undef FUNCNAME
+#define FUNCNAME MPID_nem_new_handle_rreq
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+static int
+MPID_nem_newmad_handle_rreq(MPID_Request *req, nm_sr_request_t *nmad_request, nm_tag_t match_info, size_t size)
+{
+    int            mpi_errno = MPI_SUCCESS;
+    int            complete = FALSE;
+    int            dt_contig;
+    MPI_Aint       dt_true_lb;
+    MPIDI_msg_sz_t userbuf_sz;
+    MPID_Datatype *dt_ptr;
+    MPIDI_msg_sz_t data_sz;
+    MPIDI_VC_t    *vc = NULL;
+
+    if (req->dev.match.parts.rank == MPI_ANY_SOURCE)
+    {
+	mpid_nem_newmad_p_gate_t source;
+	MPIU_Assert(nmad_request != NULL);
+	nm_sr_recv_source(mpid_nem_newmad_pcore,nmad_request,&source);
+	vc = nm_gate_ref_get(source);
+	req->status.MPI_SOURCE = vc->lpid;
+    }
+    else
+	NEM_NMAD_MATCH_GET_RANK(match_info,req->status.MPI_SOURCE);
+
+    NEM_NMAD_MATCH_GET_TAG(match_info,req->status.MPI_TAG);
+    req->status.count = size;
+    req->dev.recv_data_sz = size;
+
+    MPIDI_Datatype_get_info(req->dev.user_count, req->dev.datatype, dt_contig, userbuf_sz, dt_ptr, dt_true_lb);
+
+    if (size <=  userbuf_sz) {
+	data_sz = req->dev.recv_data_sz;
+    }
+    else
+    {
+	MPIU_DBG_MSG_FMT(CH3_OTHER,VERBOSE,(MPIU_DBG_FDEST,
+					    "receive buffer too small; message truncated, msg_sz="
+					    MPIDI_MSG_SZ_FMT ", userbuf_sz="
+					    MPIDI_MSG_SZ_FMT,
+					    req->dev.recv_data_sz, userbuf_sz));
+	req->status.MPI_ERROR = MPIR_Err_create_code(MPI_SUCCESS,
+						     MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_TRUNCATE,
+						     "**truncate", "**truncate %d %d %d %d",
+						     req->status.MPI_SOURCE, req->status.MPI_TAG,
+						     req->dev.recv_data_sz, userbuf_sz );
+	req->status.count = userbuf_sz;
+	data_sz = userbuf_sz;
+    }
+    
+    if ((!dt_contig)&&(req->dev.tmpbuf != NULL))
+    {
+	MPIDI_msg_sz_t last;
+	last = req->dev.recv_data_sz;
+	MPID_Segment_unpack( req->dev.segment_ptr, 0, &last, req->dev.tmpbuf);
+	MPIU_Free(req->dev.tmpbuf);
+	if (last != data_sz) {
+	    req->status.count = (int)last;
+	    if (req->dev.recv_data_sz <= userbuf_sz) {
+		MPIU_ERR_SETSIMPLE(req->status.MPI_ERROR,MPI_ERR_TYPE,"**dtypemismatch");
+	    }
+	}
+    }
+    
+    MPIDI_Comm_get_vc(req->comm, req->status.MPI_SOURCE, &vc);
+    MPIDI_CH3U_Handle_recv_req(vc, req, &complete);
+    MPIU_Assert(complete == TRUE);
+ fn_exit:
+    return mpi_errno;
+ fn_fail: ATTRIBUTE((unused))
+	goto fn_exit;
+}
+
+
+
+#undef FUNCNAME
 #define FUNCNAME MPID_nem_newmad_anysource_posted
 #undef FCNAME
 #define FCNAME MPIDI_QUOTE(FUNCNAME)
-int MPID_nem_newmad_anysource_posted(MPID_Request *rreq)
+void MPID_nem_newmad_anysource_posted(MPID_Request *rreq)
 {
     /* This function is called whenever an anyource request has been
        posted to the posted receive queue.  */
-    int mpi_errno = MPI_SUCCESS;
+    MPIR_Context_id_t context;
+    Nmad_Nem_tag_t    tag;
+    nm_tag_t          match_info = 0;
+    nm_sr_request_t  *newmad_req= MPIU_Malloc(sizeof(nm_sr_request_t));
+    int               num_seg = 1;
+    int               ret;
+    MPIDI_msg_sz_t    data_sz;
+    int               dt_contig;
+    MPI_Aint          dt_true_lb;
+    MPID_Datatype    *dt_ptr;               
+    struct iovec      newmad_iov[NMAD_IOV_MAX_DEPTH];
+  
+    MPIDI_Datatype_get_info(rreq->dev.user_count,rreq->dev.datatype, dt_contig, data_sz, dt_ptr,dt_true_lb);              
 
- fn_exit:
-    return mpi_errno;
- fn_fail:
-    goto fn_exit;
+    tag     = rreq->dev.match.parts.tag;
+    context = rreq->dev.match.parts.context_id;                       
+    NEM_NMAD_DIRECT_MATCH(match_info,0,0,context);
+    if (tag != MPI_ANY_TAG)
+    {
+	NEM_NMAD_SET_TAG(match_info,tag);	
+    }
+    else
+    {
+	MPIU_Assert(0);
+    }
+
+    MPIDI_Datatype_get_info(rreq->dev.user_count,rreq->dev.datatype, dt_contig, data_sz, dt_ptr,dt_true_lb);
+    rreq->dev.OnDataAvail = NULL;
+    
+    if (dt_contig)
+    {
+	newmad_iov[0].iov_base = (char*)(rreq->dev.user_buf) + dt_true_lb;
+	newmad_iov[0].iov_len  = data_sz;
+    }
+    else
+    {
+	struct iovec *newmad_iov_ptr = &(newmad_iov[0]); 
+	MPID_nem_newmad_process_rdtype(&rreq,dt_ptr,data_sz,&newmad_iov_ptr,&num_seg);
+    }
+
+    ret = nm_sr_irecv_iov_with_ref(mpid_nem_newmad_pcore,NM_ANY_GATE,match_info,
+				   newmad_iov,num_seg,newmad_req,(void*)rreq);	
+    MPID_MEM_NMAD_ADD_REQ_IN_HASH(rreq,newmad_req);  
 }
 
 #undef FUNCNAME
@@ -172,11 +419,94 @@
 {
     /* This function is called when an anysource request in the posted
        receive queue is matched and dequeued */
-    int mpi_errno = MPI_SUCCESS;
+    nm_sr_request_t *nmad_request = NULL;
+    int ret;
+    int matched = FALSE;
 
+    MPID_NEM_NMAD_GET_REQ_FROM_HASH(rreq,nmad_request);
+    if(nmad_request != NULL)
+    {	
+	ret = nm_sr_rcancel(mpid_nem_newmad_pcore,nmad_request);
+	if (ret ==  NM_ESUCCESS)
+	{
+	    size_t size;
+	    nm_tag_t match_info;
+	    MPIU_Assert(MPIDI_Request_get_type(rreq) != MPIDI_REQUEST_TYPE_GET_RESP);                  	
+	    ret = nm_sr_rwait(mpid_nem_newmad_pcore,nmad_request);
+	    MPIU_Assert(ret ==  NM_ESUCCESS);
+	    nm_sr_get_tag(mpid_nem_newmad_pcore,nmad_request,&match_info);
+	    nm_sr_get_size(mpid_nem_newmad_pcore,nmad_request,&size);
+	    MPID_nem_newmad_handle_rreq(rreq, nmad_request,match_info, size);
+	    matched = TRUE;
+	}
+	else
+	{
+	    MPID_Segment_free(rreq->dev.segment_ptr);
+	}    
+	MPIU_Free(nmad_request);
+    }    
+    return matched;
+}
+
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_newmad_process_rdtype
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_newmad_process_rdtype(MPID_Request **rreq_p, MPID_Datatype * dt_ptr, MPIDI_msg_sz_t data_sz, struct iovec *newmad_iov[], int *num_iov)
+{
+    MPID_Request  *rreq =*rreq_p;
+    MPIDI_msg_sz_t last;
+    MPID_IOV      *iov;
+    int            iov_num_ub  = rreq->dev.user_count * dt_ptr->max_contig_blocks;
+    int            n_iov       = iov_num_ub;
+    int            mpi_errno   = MPI_SUCCESS;
+    int            index;
+    
+    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_RDTYPE);
+    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_RDTYPE);
+
+    if (rreq->dev.segment_ptr == NULL)
+    {
+	rreq->dev.segment_ptr = MPID_Segment_alloc( );
+	MPIU_ERR_CHKANDJUMP1((rreq->dev.segment_ptr == NULL), mpi_errno, MPI_ERR_OTHER, "**nomem", "**nomem %s", "MPID_Segment_alloc");
+    }
+    MPID_Segment_init(rreq->dev.user_buf, rreq->dev.user_count, rreq->dev.datatype, rreq->dev.segment_ptr, 0);
+    rreq->dev.segment_first = 0;
+    rreq->dev.segment_size = data_sz;
+    last = rreq->dev.segment_size;
+    iov = MPIU_Malloc(iov_num_ub*sizeof(MPID_IOV));
+    MPID_Segment_unpack_vector(rreq->dev.segment_ptr, rreq->dev.segment_first, &last,iov, &n_iov);
+    MPIU_Assert(last == rreq->dev.segment_size);
+
+    if(n_iov <= NMAD_IOV_MAX_DEPTH) 
+    {
+	for(index=0; index < n_iov ; index++)
+	{
+	    (*newmad_iov)[index].iov_base = iov[index].MPID_IOV_BUF;
+	    (*newmad_iov)[index].iov_len  = iov[index].MPID_IOV_LEN;
+	}
+	rreq->dev.tmpbuf = NULL;
+	*num_iov = n_iov;
+    }
+    else
+    {
+	int packsize = 0;
+	NMPI_Pack_size(rreq->dev.user_count, rreq->dev.datatype, rreq->comm->handle, &packsize);
+	rreq->dev.tmpbuf = MPIU_Malloc((size_t) packsize);
+	MPIU_Assert(rreq->dev.tmpbuf);
+	rreq->dev.tmpbuf_sz = packsize;
+	(*newmad_iov)[0].iov_base = (char *)  rreq->dev.tmpbuf;
+	(*newmad_iov)[0].iov_len  = (uint32_t) packsize;
+	*num_iov = 1 ;
+    }
+    MPIU_Free(iov);
  fn_exit:
+    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_RDTYPE);
     return mpi_errno;
- fn_fail:
+ fn_fail:  ATTRIBUTE((unused))
     goto fn_exit;
 }
 
+
+

Added: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_probe.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_probe.c	                        (rev 0)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_probe.c	2009-03-26 15:16:25 UTC (rev 4198)
@@ -0,0 +1,90 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ *  (C) 2006 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+#include "newmad_impl.h"
+#include "my_papi_defs.h"
+
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_newmad_probe
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_newmad_probe(MPIDI_VC_t *vc,  int source, int tag, MPID_Comm *comm, int context_offset, MPI_Status *status)
+{
+    nm_tag_t  match_info = 0;
+    nm_gate_t out_gate;
+    int mpi_errno = MPI_SUCCESS;
+    int ret;
+
+    NEM_NMAD_DIRECT_MATCH(match_info,0,source,comm->context_id + context_offset);
+    if (tag != MPI_ANY_TAG)
+    {
+        NEM_NMAD_SET_TAG(match_info,tag);
+    }
+    else
+    {
+	MPIU_Assert(0);
+    }
+
+    do {
+	ret = nm_sr_probe(mpid_nem_newmad_pcore,VC_FIELD(vc,p_gate),&out_gate,match_info);        
+    }
+    while (ret != NM_ESUCCESS);
+
+    status->MPI_SOURCE = source;
+    status->MPI_TAG = tag;
+    status->count = 0; /* FIXME */
+
+ fn_exit:
+    return mpi_errno;
+ fn_fail:  ATTRIBUTE((unused))
+    goto fn_exit;
+}
+
+
+
+#undef FUNCNAME
+#define FUNCNAME MPID_nem_newmad_iprobe
+#undef FCNAME
+#define FCNAME MPIDI_QUOTE(FUNCNAME)
+int MPID_nem_newmad_iprobe(MPIDI_VC_t *vc,  int source, int tag, MPID_Comm *comm, int context_offset, int *flag, MPI_Status *status)
+{
+    nm_tag_t  match_info = 0;
+    nm_gate_t out_gate;
+    int mpi_errno = MPI_SUCCESS;
+    int ret;
+
+    NEM_NMAD_DIRECT_MATCH(match_info,0,source,comm->context_id + context_offset);
+    if (tag != MPI_ANY_TAG)
+    {
+        NEM_NMAD_SET_TAG(match_info,tag);
+    }
+    else
+    {
+	MPIU_Assert(0);
+    }
+
+    ret = nm_sr_probe(mpid_nem_newmad_pcore,VC_FIELD(vc,p_gate),&out_gate,match_info);        
+    if (ret == NM_ESUCCESS)
+    {   
+	/*
+	size_t size;
+	nm_sr_get_size(mpid_nem_newmad_pcore, p_out_req, &size);
+	*/
+
+	status->MPI_SOURCE = source;
+	status->MPI_TAG = tag;
+	status->count = 0; /* FIXME */
+	*flag = TRUE;	
+    }
+    else
+	*flag = FALSE;
+ 
+ fn_exit:
+    return mpi_errno;
+ fn_fail:  ATTRIBUTE((unused))
+    goto fn_exit;
+}

Modified: mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_send.c
===================================================================
--- mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_send.c	2009-03-26 15:10:58 UTC (rev 4197)
+++ mpich2/trunk/src/mpid/ch3/channels/nemesis/nemesis/netmod/newmad/newmad_send.c	2009-03-26 15:16:25 UTC (rev 4198)
@@ -22,7 +22,7 @@
     MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_NEWMAD_ISENDCONTIG);    
 
     MPIU_Assert(hdr_sz <= sizeof(MPIDI_CH3_Pkt_t));
-    MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, "mx_iSendContig");
+    MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, "newmad_iSendContig");
     MPIDI_DBG_Print_packet((MPIDI_CH3_Pkt_t *)hdr);
 
     NEM_NMAD_ADI_MATCH(match_info);
@@ -36,15 +36,15 @@
 	num_iov += 1;
     }
 
-    nm_sr_isend_iov(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
-		    mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)));    
+    nm_sr_isend_iov_with_ref(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
+			     mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)),(void *)sreq);    
     mpid_nem_newmad_pending_send_req++;
     sreq->ch.vc = vc;
 
  fn_exit:
     MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_ISENDCONTIG);
     return mpi_errno;
- fn_fail:
+ fn_fail:  ATTRIBUTE((unused))
     goto fn_exit;
 }
 
@@ -63,7 +63,7 @@
     MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_NEWMAD_ISTARTCONTIGMSG);    
     MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_NEWMAD_ISTARTCONTIGMSG);    
     MPIU_Assert(hdr_sz <= sizeof(MPIDI_CH3_Pkt_t));
-    MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, "mx_iSendContig");
+    MPIU_DBG_MSG(CH3_CHANNEL, VERBOSE, "newmad_iSendContig");
     MPIDI_DBG_Print_packet((MPIDI_CH3_Pkt_t *)hdr);
 
     /* create a request */
@@ -84,8 +84,8 @@
 	num_iov += 1;
     }
     
-    nm_sr_isend_iov(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
-		    mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)));    
+    nm_sr_isend_iov_with_ref(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
+			     mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)),(void *)sreq);    
     mpid_nem_newmad_pending_send_req++;
     sreq->ch.vc = vc;
 
@@ -93,7 +93,7 @@
     *sreq_ptr = sreq;
     MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_ISTARTCONTIGMSG);
     return mpi_errno;
- fn_fail:
+ fn_fail:  ATTRIBUTE((unused))
     goto fn_exit;
 }
 
@@ -107,7 +107,7 @@
 {
     int            mpi_errno = MPI_SUCCESS;
     nm_tag_t       match_info = 0;
-    struct iovec  *mad_iov;
+    struct iovec   mad_iov[NMAD_IOV_MAX_DEPTH];
     int            num_iov = 1;
     MPIDI_msg_sz_t data_sz;
     int            dt_contig;
@@ -123,28 +123,23 @@
 
     if(data_sz)
     {
-	MPID_nem_mx_process_sdtype(&sreq,sreq->dev.datatype,dt_ptr,sreq->dev.user_buf,
-				   sreq->dev.user_count,data_sz, &mad_iov,&num_iov,1);
+	struct iovec *mad_iov_ptr = &(mad_iov[0]);
+	MPID_nem_newmad_process_sdtype(&sreq,sreq->dev.datatype,dt_ptr,sreq->dev.user_buf,
+				       sreq->dev.user_count,data_sz, &mad_iov_ptr,&num_iov,1);
     }
-    else
-    {
-	mad_iov = MPIU_Malloc(sizeof(struct iovec));
-    }
-
     NEM_NMAD_ADI_MATCH(match_info);
     memcpy(&(sreq->dev.pending_pkt),(char *)header,sizeof(MPIDI_CH3_PktGeneric_t));
     mad_iov[0].iov_base = (char *)&(sreq->dev.pending_pkt);
     mad_iov[0].iov_len  = sizeof(MPIDI_CH3_PktGeneric_t);
 
-    nm_sr_isend_iov(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
-		    mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)));    
+    nm_sr_isend_iov_with_ref(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
+			     mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)),(void*)sreq);    
+    mpid_nem_newmad_pending_send_req++;    
 
-    MPIU_Free(mad_iov); /* FIXME : is this safe ? */
-
  fn_exit:
     MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_SENDNONCONTIGMSG);
     return mpi_errno;
- fn_fail:
+ fn_fail:  ATTRIBUTE((unused))
     goto fn_exit;
 }
 
@@ -158,7 +153,7 @@
 {
     MPID_Request  *sreq = NULL;
     nm_tag_t       match_info = 0;
-    struct iovec  *mad_iov;
+    struct iovec   mad_iov[NMAD_IOV_MAX_DEPTH];
     int            num_iov = 0;    
     int            mpi_errno = MPI_SUCCESS;
     MPID_Datatype *dt_ptr;
@@ -178,38 +173,37 @@
     MPIDI_Request_set_seqnum(sreq, seqnum);
     sreq->ch.vc = vc;
     sreq->dev.OnDataAvail = NULL;
-
     NEM_NMAD_DIRECT_MATCH(match_info,tag,comm->rank,comm->context_id + context_offset);
 
     if(data_sz)
     {
 	if (dt_contig)
 	{
-	    mad_iov = MPIU_Malloc(sizeof(struct iovec));
 	    mad_iov[0].iov_base = (char*)(buf + dt_true_lb);
 	    mad_iov[0].iov_len  = data_sz;
-	    num_iov += 1;
+	    num_iov = 1;
 	}
 	else
 	{
-	    MPID_nem_mx_process_sdtype(&sreq,datatype,dt_ptr,buf,count,data_sz,&mad_iov,&num_iov,0);	    	    
+	    struct iovec *mad_iov_ptr = &(mad_iov[0]);
+	    MPID_nem_newmad_process_sdtype(&sreq,datatype,dt_ptr,buf,count,data_sz,&mad_iov_ptr,&num_iov,0);	    	    
 	}
-	nm_sr_isend_iov(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
-			mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)));    
+	MPIU_Assert(num_iov <= NMAD_IOV_MAX_DEPTH);
+	nm_sr_isend_iov_with_ref(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
+				 mad_iov, num_iov, &(REQ_FIELD(sreq,newmad_req)),(void*)sreq);    
     }
     else
     {
-	nm_sr_isend(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
-		    NULL, 0, &(REQ_FIELD(sreq,newmad_req)));    
+	nm_sr_isend_with_ref(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
+			     NULL, 0, &(REQ_FIELD(sreq,newmad_req)),(void*)sreq);    
     }
     mpid_nem_newmad_pending_send_req++;
-    MPIU_Free(mad_iov);
 
  fn_exit:
     *sreq_p = sreq;
     MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_DIRECTSEND);
     return mpi_errno;
- fn_fail:
+ fn_fail:  ATTRIBUTE((unused))
     goto fn_exit;
 }
 
@@ -222,7 +216,7 @@
 {
     MPID_Request  *sreq = NULL;
     nm_tag_t       match_info = 0;
-    struct iovec  *mad_iov;
+    struct iovec   mad_iov[NMAD_IOV_MAX_DEPTH];
     int            num_iov = 0;    
     int            mpi_errno = MPI_SUCCESS;
     MPID_Datatype *dt_ptr;
@@ -249,14 +243,14 @@
     {
 	if (dt_contig)
 	{
-	    mad_iov = MPIU_Malloc(sizeof(struct iovec));
 	    mad_iov[0].iov_base = (char*)(buf + dt_true_lb);
 	    mad_iov[0].iov_len  = data_sz;
 	    num_iov += 1;
 	}
 	else
 	{
-	    MPID_nem_mx_process_sdtype(&sreq,datatype,dt_ptr,buf,count,data_sz,&mad_iov,&num_iov,0);	    	    
+	    struct iovec *mad_iov_ptr = &(mad_iov[0]);
+	    MPID_nem_newmad_process_sdtype(&sreq,datatype,dt_ptr,buf,count,data_sz,&mad_iov_ptr,&num_iov,0);	    	    
 	}
 	/* FIXME issend !*/
 	nm_sr_isend_iov(mpid_nem_newmad_pcore, VC_FIELD(vc, p_gate), match_info, 
@@ -269,13 +263,12 @@
 		    NULL, 0, &(REQ_FIELD(sreq,newmad_req)));    
     }
     mpid_nem_newmad_pending_send_req++;
-    MPIU_Free(mad_iov);
 
  fn_exit:
     *sreq_p = sreq;
     MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_DIRECTSSEND);
     return mpi_errno;
- fn_fail:
+ fn_fail:  ATTRIBUTE((unused))
     goto fn_exit;
 }
 
@@ -285,13 +278,16 @@
 #undef FCNAME
 #define FCNAME MPIDI_QUOTE(FUNCNAME)
 int MPID_nem_newmad_process_sdtype(MPID_Request **sreq_p,  MPI_Datatype datatype,  MPID_Datatype * dt_ptr, const void *buf, 
-				   int count, MPIDI_msg_sz_t data_sz, struct iovec **mad_iov, int  *num_iov, int first_taken)
+				   int count, MPIDI_msg_sz_t data_sz, struct iovec *mad_iov[], int  *num_iov, int first_taken)
 {
     MPID_Request  *sreq =*sreq_p;
     MPIDI_msg_sz_t last;
-    int iov_num_ub  = count * dt_ptr->max_contig_blocks;
-    int n_iov       = iov_num_ub;
-    int mpi_errno   = MPI_SUCCESS;
+    int            iov_num_ub  = count * dt_ptr->max_contig_blocks;
+    int            n_iov       = iov_num_ub;
+    MPID_IOV      *iov;
+    int            num_entries = NMAD_IOV_MAX_DEPTH - first_taken;
+    int            mpi_errno   = MPI_SUCCESS;
+    int            index;
 
     MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_SDTYPE);
     MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_SDTYPE);
@@ -302,17 +298,52 @@
     sreq->dev.segment_first = 0;
     sreq->dev.segment_size = data_sz;
     last = sreq->dev.segment_size;
-    (*mad_iov) = MPIU_Malloc((iov_num_ub+first_taken)*sizeof(struct iovec));
-
-    MPID_Segment_pack_vector(sreq->dev.segment_ptr, sreq->dev.segment_first, &last,
-			     (MPID_IOV  *)((*mad_iov)+(first_taken*sizeof(struct iovec))), &n_iov);
+    iov = MPIU_Malloc(iov_num_ub*sizeof(MPID_IOV));
+    MPID_Segment_pack_vector(sreq->dev.segment_ptr, sreq->dev.segment_first, &last,iov, &n_iov);
     MPIU_Assert(last == sreq->dev.segment_size);
-    *num_iov = n_iov + first_taken;
 
+    if(n_iov <= num_entries) 
+    {
+	for(index = 0; index < n_iov ; index++)
+	{
+	    (*mad_iov)[first_taken+index].iov_base = iov[index].MPID_IOV_BUF;
+	    (*mad_iov)[first_taken+index].iov_len  = iov[index].MPID_IOV_LEN;
+	}
+	*num_iov = n_iov + first_taken;
+    }
+    else
+    {
+	int size_to_copy = 0;
+        int offset = 0;
+        int last_entry = num_entries - 1;
+        for(index = 0; index < n_iov ; index++)
+	{
+	    if (index <= (last_entry-1))
+	    {
+		(*mad_iov)[first_taken+index].iov_base = iov[index].MPID_IOV_BUF;
+		(*mad_iov)[first_taken+index].iov_len  = iov[index].MPID_IOV_LEN;
+	    }
+	    else
+	    {
+		size_to_copy += iov[index].MPID_IOV_LEN;
+	    }
+	}
+	sreq->dev.tmpbuf = MPIU_Malloc(size_to_copy);
+        MPIU_Assert(sreq->dev.tmpbuf);
+	for(index = last_entry; index < n_iov; index++)
+	{
+	    memcpy((char *)(sreq->dev.tmpbuf) + offset, iov[index].MPID_IOV_BUF, iov[index].MPID_IOV_LEN);
+	    offset += iov[index].MPID_IOV_LEN;
+	}
+        (*mad_iov)[NMAD_IOV_MAX_DEPTH-1].iov_base = sreq->dev.tmpbuf;
+        (*mad_iov)[NMAD_IOV_MAX_DEPTH-1].iov_len  = size_to_copy;
+        *num_iov = NMAD_IOV_MAX_DEPTH;
+    }
+    MPIU_Free(iov);
  fn_exit:
     MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_NEWMAD_PROCESS_SDTYPE);
     return mpi_errno;
- fn_fail:
+ fn_fail:  ATTRIBUTE((unused))
     goto fn_exit;
 }
 



More information about the mpich2-commits mailing list