diff --git a/src/mpid/ch3/include/mpidimpl.h b/src/mpid/ch3/include/mpidimpl.h
index 6a9db2d..1b0ae17 100644
--- a/src/mpid/ch3/include/mpidimpl.h
+++ b/src/mpid/ch3/include/mpidimpl.h
@@ -1222,6 +1222,19 @@ int MPIDI_Win_sync(MPID_Win *win);
 void *MPIDI_Alloc_mem(size_t size, MPID_Info *info_ptr);
 int MPIDI_Free_mem(void *ptr);
 
+#ifdef MPIDI_CH3_HAS_ALLOC_MEM
+void* MPIDI_CH3_Alloc_mem(size_t size, MPID_Info *info_ptr);
+/* fallback to MPIU_Malloc if channel does not have its own RMA memory allocator */
+#else
+#define MPIDI_CH3_Alloc_mem(size, info_ptr)    MPIU_Malloc(size)
+#endif
+
+#ifdef MPIDI_CH3_HAS_FREE_MEM
+int MPIDI_Free_mem(void *ptr);
+#else
+#define MPIDI_CH3_Free_mem(ptr)    MPIU_Free(ptr);
+#endif
+
 /* Pvars */
 void MPIDI_CH3_RMA_Init_Pvars(void);
 
diff --git a/src/mpid/ch3/src/ch3u_rma_ops.c b/src/mpid/ch3/src/ch3u_rma_ops.c
index f30c464..7a3e22b 100644
--- a/src/mpid/ch3/src/ch3u_rma_ops.c
+++ b/src/mpid/ch3/src/ch3u_rma_ops.c
@@ -472,7 +472,7 @@ void *MPIDI_Alloc_mem( size_t size, MPID_Info *info_ptr )
 
     MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_ALLOC_MEM);
 
-    ap = MPIU_Malloc(size);
+    ap = MPIDI_CH3_Alloc_mem(size, info_ptr);
     
     MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_ALLOC_MEM);
     return ap;
@@ -490,7 +490,7 @@ int MPIDI_Free_mem( void *ptr )
 
     MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_FREE_MEM);
 
-    MPIU_Free(ptr);
+    MPIDI_CH3_Free_mem(ptr);
     
     MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_FREE_MEM);
     return mpi_errno;
