[mpich-commits] [mpich] MPICH primary repository branch, master, updated. v3.2a2-8-g722d85a
Service Account
noreply at mpich.org
Wed Nov 19 09:45:04 CST 2014
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".
The branch, master has been updated
via 722d85a45740371c88fe7f08471ee7aca504fd6d (commit)
via bc08655f788a7df838591609942b7c582ebdd92f (commit)
via d459c025b795985ca4dcfa492f34e4e3f49b548d (commit)
from b28801ec52a024429e6cf86de7cd9fe4a0b1f4f2 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/722d85a45740371c88fe7f08471ee7aca504fd6d
commit 722d85a45740371c88fe7f08471ee7aca504fd6d
Author: Ken Raffenetti <raffenet at mcs.anl.gov>
Date: Fri Nov 14 15:48:08 2014 -0600
portals4: add macro for safe PtlMEAppend
Signed-off-by: Antonio J. Pena <apenya at mcs.anl.gov>
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h
index 8f39d73..4071f72 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_impl.h
@@ -208,6 +208,26 @@ int MPID_nem_ptl_lmt_handle_cookie(MPIDI_VC_t *vc, MPID_Request *req, MPID_IOV s
int MPID_nem_ptl_lmt_done_send(MPIDI_VC_t *vc, MPID_Request *req);
int MPID_nem_ptl_lmt_done_recv(MPIDI_VC_t *vc, MPID_Request *req);
+/* a safe PtlMEAppend for when there is no space available */
+static inline int MPID_nem_ptl_me_append(ptl_handle_ni_t ni_handle,
+ ptl_pt_index_t pt_index,
+ const ptl_me_t *me,
+ ptl_list_t ptl_list,
+ void *user_ptr,
+ ptl_handle_me_t *me_handle)
+{
+ int ret;
+
+ while (1) {
+ ret = PtlMEAppend(ni_handle, pt_index, me, ptl_list, user_ptr, me_handle);
+ if (ret != PTL_NO_SPACE)
+ break;
+ MPID_nem_ptl_poll(1);
+ }
+
+ return ret;
+}
+
/* packet handlers */
int MPID_nem_ptl_pkt_cancel_send_req_handler(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt,
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_nm.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_nm.c
index 02fcc0b..1780920 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_nm.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_nm.c
@@ -63,8 +63,8 @@ int MPID_nem_ptl_nm_init(void)
mes[i].match_bits = CTL_TAG;
mes[i].ignore_bits = 0;
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_control_pt, &mes[i],
- PTL_PRIORITY_LIST, (void *)(uint64_t)i, &me_handles[i]);
+ ret = MPID_nem_ptl_me_append(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_control_pt, &mes[i],
+ PTL_PRIORITY_LIST, (void *)(uint64_t)i, &me_handles[i]);
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend", "**ptlmeappend %s",
MPID_nem_ptl_strerror(ret));
}
@@ -134,15 +134,8 @@ static inline int meappend_large(ptl_process_t id, MPID_Request *req, ptl_match_
++REQ_PTL(req)->num_gets;
- /* if there is no space to append the entry, process outstanding events and try again */
- while (1) {
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_control_pt, &me, PTL_PRIORITY_LIST, req,
- &foo_me_handle);
- if (ret != PTL_NO_SPACE)
- break;
- MPID_nem_ptl_poll(1);
- }
-
+ ret = MPID_nem_ptl_me_append(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_control_pt, &me, PTL_PRIORITY_LIST, req,
+ &foo_me_handle);
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend", "**ptlmeappend %s",
MPID_nem_ptl_strerror(ret));
MPIU_DBG_MSG_FMT(CH3_CHANNEL, VERBOSE, (MPIU_DBG_FDEST, "PtlMEAppend(req=%p tag=%#lx)", req, tag));
@@ -450,14 +443,8 @@ int MPID_nem_ptl_nm_ctl_event_handler(const ptl_event_t *e)
}
/* Repost the recv buffer */
- /* if there is no space to append the entry, process outstanding events and try again */
- while (1) {
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_control_pt, &mes[buf_idx],
- PTL_PRIORITY_LIST, e->user_ptr /* buf_idx */, &me_handles[buf_idx]);
- if (ret != PTL_NO_SPACE)
- break;
- MPID_nem_ptl_poll(1);
- }
+ ret = MPID_nem_ptl_me_append(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_control_pt, &mes[buf_idx],
+ PTL_PRIORITY_LIST, e->user_ptr /* buf_idx */, &me_handles[buf_idx]);
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend",
"**ptlmeappend %s", MPID_nem_ptl_strerror(ret));
}
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_poll.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_poll.c
index 0a3bf10..3e22556 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_poll.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_poll.c
@@ -106,13 +106,8 @@ static int append_overflow(int i)
me.min_free = PTL_MAX_EAGER;
/* if there is no space to append the entry, process outstanding events and try again */
- while (1) {
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_pt, &me, PTL_OVERFLOW_LIST, (void *)(size_t)i,
- &overflow_me_handle[i]);
- if (ret != PTL_NO_SPACE)
- break;
- MPID_nem_ptl_poll(1);
- }
+ ret = MPID_nem_ptl_me_append(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_pt, &me, PTL_OVERFLOW_LIST, (void *)(size_t)i,
+ &overflow_me_handle[i]);
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend", "**ptlmeappend %s", MPID_nem_ptl_strerror(ret));
fn_exit:
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c
index 3633236..e69e9b1 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c
@@ -543,13 +543,7 @@ int MPID_nem_ptl_recv_posted(MPIDI_VC_t *vc, MPID_Request *rreq)
}
- /* if there is no space to append the entry, process outstanding events and try again */
- while (1) {
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_pt, &me, PTL_PRIORITY_LIST, rreq, &REQ_PTL(rreq)->put_me);
- if (ret != PTL_NO_SPACE)
- break;
- MPID_nem_ptl_poll(1);
- }
+ ret = MPID_nem_ptl_me_append(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_pt, &me, PTL_PRIORITY_LIST, rreq, &REQ_PTL(rreq)->put_me);
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend", "**ptlmeappend %s", MPID_nem_ptl_strerror(ret));
DBG_MSG_MEAPPEND("REG", vc ? vc->pg_rank : MPI_ANY_SOURCE, me, rreq);
MPIU_DBG_MSG_P(CH3_CHANNEL, VERBOSE, " buf=%p", me.start);
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c
index f6402f9..e49546f 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c
@@ -41,13 +41,8 @@ static void big_meappend(void *buf, ptl_size_t left_to_send, MPIDI_VC_t *vc, ptl
else
me.length = left_to_send;
- /* if there is no space to append the entry, process outstanding events and try again */
- while (1) {
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_get_pt, &me, PTL_PRIORITY_LIST, sreq, &REQ_PTL(sreq)->get_me_p[i]);
- if (ret != PTL_NO_SPACE)
- break;
- MPID_nem_ptl_poll(1);
- }
+ ret = MPID_nem_ptl_me_append(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_get_pt, &me, PTL_PRIORITY_LIST, sreq,
+ &REQ_PTL(sreq)->get_me_p[i]);
DBG_MSG_MEAPPEND("CTL", vc->pg_rank, me, sreq);
MPIU_Assert(ret == 0);
@@ -387,14 +382,8 @@ static int send_msg(ptl_hdr_data_t ssend_flag, struct MPIDI_VC *vc, const void *
MPIU_CHKPMEM_MALLOC(REQ_PTL(sreq)->get_me_p, ptl_handle_me_t *, sizeof(ptl_handle_me_t), mpi_errno, "get_me_p");
REQ_PTL(sreq)->num_gets = 1;
- /* if there is no space to append the entry, process outstanding events and try again */
- while (1) {
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_get_pt, &me, PTL_PRIORITY_LIST, sreq,
- &REQ_PTL(sreq)->get_me_p[0]);
- if (ret != PTL_NO_SPACE)
- break;
- MPID_nem_ptl_poll(1);
- }
+ ret = MPID_nem_ptl_me_append(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_get_pt, &me, PTL_PRIORITY_LIST, sreq,
+ &REQ_PTL(sreq)->get_me_p[0]);
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend", "**ptlmeappend %s", MPID_nem_ptl_strerror(ret));
DBG_MSG_MEAPPEND("CTL", vc->pg_rank, me, sreq);
http://git.mpich.org/mpich.git/commitdiff/bc08655f788a7df838591609942b7c582ebdd92f
commit bc08655f788a7df838591609942b7c582ebdd92f
Author: Ken Raffenetti <raffenet at mcs.anl.gov>
Date: Fri Nov 14 10:41:53 2014 -0600
portals4: raise list size limit
Signed-off-by: Antonio J. Pena <apenya at mcs.anl.gov>
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_init.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_init.c
index ffad963..3b0807d 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_init.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_init.c
@@ -14,6 +14,7 @@
#define UNEXPECTED_HDR_COUNT 32768
#define EQ_COUNT 32768
+#define LIST_SIZE 32768
#define NID_KEY "NID"
#define PID_KEY "PID"
#define PTI_KEY "PTI"
@@ -180,6 +181,8 @@ static int ptl_init(MPIDI_PG_t *pg_p, int pg_rank, char **bc_val_p, int *val_max
desired.max_unexpected_headers = UNEXPECTED_HDR_COUNT;
if (desired.max_eqs < EQ_COUNT && getenv("PTL_LIM_MAX_EQS") == NULL)
desired.max_eqs = EQ_COUNT;
+ if (desired.max_list_size < LIST_SIZE && getenv("PTL_LIM_MAX_LIST_SIZE") == NULL)
+ desired.max_list_size = LIST_SIZE;
/* do the real init */
ret = PtlNIInit(PTL_IFACE_DEFAULT, PTL_NI_MATCHING | PTL_NI_PHYSICAL,
http://git.mpich.org/mpich.git/commitdiff/d459c025b795985ca4dcfa492f34e4e3f49b548d
commit d459c025b795985ca4dcfa492f34e4e3f49b548d
Author: Ken Raffenetti <raffenet at mcs.anl.gov>
Date: Thu Nov 13 13:10:20 2014 -0600
portals4: handle PTL_NO_SPACE
It is possible that PtlMEAppend can return a PTL_NO_SPACE error, meaning
there are too many outstanding operations already active. To avoid an abort
we simply retry after processing events that have queued up locally.
Signed-off-by: Antonio J. Pena <apenya at mcs.anl.gov>
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_nm.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_nm.c
index 9a1000e..02fcc0b 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_nm.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_nm.c
@@ -134,8 +134,15 @@ static inline int meappend_large(ptl_process_t id, MPID_Request *req, ptl_match_
++REQ_PTL(req)->num_gets;
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_control_pt, &me, PTL_PRIORITY_LIST, req,
- &foo_me_handle);
+ /* if there is no space to append the entry, process outstanding events and try again */
+ while (1) {
+ ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_control_pt, &me, PTL_PRIORITY_LIST, req,
+ &foo_me_handle);
+ if (ret != PTL_NO_SPACE)
+ break;
+ MPID_nem_ptl_poll(1);
+ }
+
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend", "**ptlmeappend %s",
MPID_nem_ptl_strerror(ret));
MPIU_DBG_MSG_FMT(CH3_CHANNEL, VERBOSE, (MPIU_DBG_FDEST, "PtlMEAppend(req=%p tag=%#lx)", req, tag));
@@ -443,8 +450,14 @@ int MPID_nem_ptl_nm_ctl_event_handler(const ptl_event_t *e)
}
/* Repost the recv buffer */
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_control_pt, &mes[buf_idx],
- PTL_PRIORITY_LIST, e->user_ptr /* buf_idx */, &me_handles[buf_idx]);
+ /* if there is no space to append the entry, process outstanding events and try again */
+ while (1) {
+ ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_control_pt, &mes[buf_idx],
+ PTL_PRIORITY_LIST, e->user_ptr /* buf_idx */, &me_handles[buf_idx]);
+ if (ret != PTL_NO_SPACE)
+ break;
+ MPID_nem_ptl_poll(1);
+ }
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend",
"**ptlmeappend %s", MPID_nem_ptl_strerror(ret));
}
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_poll.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_poll.c
index c016952..0a3bf10 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_poll.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_poll.c
@@ -105,8 +105,14 @@ static int append_overflow(int i)
me.ignore_bits = ~((ptl_match_bits_t)0);
me.min_free = PTL_MAX_EAGER;
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_pt, &me, PTL_OVERFLOW_LIST, (void *)(size_t)i,
- &overflow_me_handle[i]);
+ /* if there is no space to append the entry, process outstanding events and try again */
+ while (1) {
+ ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_pt, &me, PTL_OVERFLOW_LIST, (void *)(size_t)i,
+ &overflow_me_handle[i]);
+ if (ret != PTL_NO_SPACE)
+ break;
+ MPID_nem_ptl_poll(1);
+ }
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend", "**ptlmeappend %s", MPID_nem_ptl_strerror(ret));
fn_exit:
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c
index ec6d90a..3633236 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_recv.c
@@ -543,7 +543,13 @@ int MPID_nem_ptl_recv_posted(MPIDI_VC_t *vc, MPID_Request *rreq)
}
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_pt, &me, PTL_PRIORITY_LIST, rreq, &REQ_PTL(rreq)->put_me);
+ /* if there is no space to append the entry, process outstanding events and try again */
+ while (1) {
+ ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_pt, &me, PTL_PRIORITY_LIST, rreq, &REQ_PTL(rreq)->put_me);
+ if (ret != PTL_NO_SPACE)
+ break;
+ MPID_nem_ptl_poll(1);
+ }
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend", "**ptlmeappend %s", MPID_nem_ptl_strerror(ret));
DBG_MSG_MEAPPEND("REG", vc ? vc->pg_rank : MPI_ANY_SOURCE, me, rreq);
MPIU_DBG_MSG_P(CH3_CHANNEL, VERBOSE, " buf=%p", me.start);
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c
index 34a1b4f..f6402f9 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/ptl_send.c
@@ -41,7 +41,13 @@ static void big_meappend(void *buf, ptl_size_t left_to_send, MPIDI_VC_t *vc, ptl
else
me.length = left_to_send;
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_get_pt, &me, PTL_PRIORITY_LIST, sreq, &REQ_PTL(sreq)->get_me_p[i]);
+ /* if there is no space to append the entry, process outstanding events and try again */
+ while (1) {
+ ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_get_pt, &me, PTL_PRIORITY_LIST, sreq, &REQ_PTL(sreq)->get_me_p[i]);
+ if (ret != PTL_NO_SPACE)
+ break;
+ MPID_nem_ptl_poll(1);
+ }
DBG_MSG_MEAPPEND("CTL", vc->pg_rank, me, sreq);
MPIU_Assert(ret == 0);
@@ -381,8 +387,14 @@ static int send_msg(ptl_hdr_data_t ssend_flag, struct MPIDI_VC *vc, const void *
MPIU_CHKPMEM_MALLOC(REQ_PTL(sreq)->get_me_p, ptl_handle_me_t *, sizeof(ptl_handle_me_t), mpi_errno, "get_me_p");
REQ_PTL(sreq)->num_gets = 1;
- ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_get_pt, &me, PTL_PRIORITY_LIST, sreq,
- &REQ_PTL(sreq)->get_me_p[0]);
+ /* if there is no space to append the entry, process outstanding events and try again */
+ while (1) {
+ ret = PtlMEAppend(MPIDI_nem_ptl_ni, MPIDI_nem_ptl_get_pt, &me, PTL_PRIORITY_LIST, sreq,
+ &REQ_PTL(sreq)->get_me_p[0]);
+ if (ret != PTL_NO_SPACE)
+ break;
+ MPID_nem_ptl_poll(1);
+ }
MPIU_ERR_CHKANDJUMP1(ret, mpi_errno, MPI_ERR_OTHER, "**ptlmeappend", "**ptlmeappend %s", MPID_nem_ptl_strerror(ret));
DBG_MSG_MEAPPEND("CTL", vc->pg_rank, me, sreq);
diff --git a/src/mpid/ch3/channels/nemesis/netmod/portals4/rptl_init.c b/src/mpid/ch3/channels/nemesis/netmod/portals4/rptl_init.c
index 9262c5e..ce6113d 100644
--- a/src/mpid/ch3/channels/nemesis/netmod/portals4/rptl_init.c
+++ b/src/mpid/ch3/channels/nemesis/netmod/portals4/rptl_init.c
@@ -35,7 +35,11 @@ int rptli_post_control_buffer(ptl_handle_ni_t ni_handle, ptl_pt_index_t pt,
me.ignore_bits = 0;
me.min_free = 0;
- ret = PtlMEAppend(ni_handle, pt, &me, PTL_PRIORITY_LIST, NULL, me_handle);
+ while (1) {
+ ret = PtlMEAppend(ni_handle, pt, &me, PTL_PRIORITY_LIST, NULL, me_handle);
+ if (ret != PTL_NO_SPACE)
+ break;
+ }
RPTLU_ERR_POP(ret, "Error appending empty buffer to priority list\n");
fn_exit:
-----------------------------------------------------------------------
Summary of changes:
.../channels/nemesis/netmod/portals4/ptl_impl.h | 20 ++++++++++++++++++++
.../channels/nemesis/netmod/portals4/ptl_init.c | 3 +++
.../ch3/channels/nemesis/netmod/portals4/ptl_nm.c | 12 ++++++------
.../channels/nemesis/netmod/portals4/ptl_poll.c | 5 +++--
.../channels/nemesis/netmod/portals4/ptl_recv.c | 2 +-
.../channels/nemesis/netmod/portals4/ptl_send.c | 7 ++++---
.../channels/nemesis/netmod/portals4/rptl_init.c | 6 +++++-
7 files changed, 42 insertions(+), 13 deletions(-)
hooks/post-receive
--
MPICH primary repository
More information about the commits
mailing list