On Wed, 11 Mar 2009 12:29:41 +0200 Sasha Khapyorsky <[email protected]> wrote:
> On 16:34 Tue 10 Mar , Ira Weiny wrote: > > > > I will look at documenting the above as technically it is possible to change > > the timeout on various ports by setting the parameters appropriately on each > > call. I don't like this going forward but I guess it is doable without > > changing the interface. > > And what do you say about the patch below? It doesn't change the current > diags behavior and provides per port timeout/retries setup. The global > parameters and rpc's fields remain to be same, and we don;t need to > deprecate madrpc_set_timeout/retires(). OK! I miss-understood you. I thought you did not want to add another set of timeout/retry values. The below is just fine with me. Do you ever see getting rid of the global default? Ira > > Sasha > > > >From 25060f5a7243a1bae6a7e7e9b2b79051ab0473d9 Mon Sep 17 00:00:00 2001 > From: Sasha Khapyorsky <[email protected]> > Date: Wed, 11 Mar 2009 12:15:54 +0200 > Subject: [PATCH] libibmad: per port timeout and retires setup > > This adds functions mad_rpc_set_timeout() and mad_rpc_set_retries() > which provides possibility to specify timeout and retries for mad rpc > processing per port. This doesn't change the default behavior. > > Signed-off-by: Sasha Khapyorsky <[email protected]> > --- > libibmad/include/infiniband/mad.h | 2 ++ > libibmad/src/libibmad.map | 2 ++ > libibmad/src/mad_internal.h | 1 + > libibmad/src/rpc.c | 37 > +++++++++++++++++++++++++++---------- > 4 files changed, 32 insertions(+), 10 deletions(-) > > diff --git a/libibmad/include/infiniband/mad.h > b/libibmad/include/infiniband/mad.h > index 064cbb7..9b398fa 100644 > --- a/libibmad/include/infiniband/mad.h > +++ b/libibmad/include/infiniband/mad.h > @@ -742,6 +742,8 @@ MAD_EXPORT void *mad_rpc(const struct ibmad_port > *srcport, ib_rpc_t * rpc, ib_po > MAD_EXPORT void *mad_rpc_rmpp(const struct ibmad_port *srcport, ib_rpc_t * > rpc, ib_portid_t * dport, > ib_rmpp_hdr_t * rmpp, void *data); > MAD_EXPORT int mad_rpc_portid(struct ibmad_port *srcport); > +MAD_EXPORT void mad_rpc_set_retries(struct ibmad_port *port, int retries); > +MAD_EXPORT void mad_rpc_set_timeout(struct ibmad_port *port, int timeout); > > /* register.c */ > MAD_EXPORT int mad_register_port_client(int port_id, int mgmt, > diff --git a/libibmad/src/libibmad.map b/libibmad/src/libibmad.map > index 0be7a92..10c7cd0 100644 > --- a/libibmad/src/libibmad.map > +++ b/libibmad/src/libibmad.map > @@ -68,6 +68,8 @@ IBMAD_1.3 { > mad_rpc; > mad_rpc_rmpp; > mad_rpc_portid; > + mad_rpc_set_retries; > + mad_rpc_set_timeout; > madrpc; > madrpc_def_timeout; > madrpc_init; > diff --git a/libibmad/src/mad_internal.h b/libibmad/src/mad_internal.h > index e948540..24418cc 100644 > --- a/libibmad/src/mad_internal.h > +++ b/libibmad/src/mad_internal.h > @@ -39,6 +39,7 @@ > struct ibmad_port { > int port_id; /* file descriptor returned by umad_open() */ > int class_agents[MAX_CLASS]; /* class2agent mapper */ > + int timeout, retries; > }; > > extern struct ibmad_port *ibmp; > diff --git a/libibmad/src/rpc.c b/libibmad/src/rpc.c > index 8c68cf9..3f3b7a2 100644 > --- a/libibmad/src/rpc.c > +++ b/libibmad/src/rpc.c > @@ -53,7 +53,7 @@ struct ibmad_port *ibmp = &mad_port; > static int iberrs; > > static int madrpc_retries = MAD_DEF_RETRIES; > -static int def_madrpc_timeout = MAD_DEF_TIMEOUT_MS; > +static int madrpc_timeout = MAD_DEF_TIMEOUT_MS; > static void *save_mad; > static int save_mad_len = 256; > > @@ -83,13 +83,23 @@ int madrpc_set_retries(int retries) > > int madrpc_set_timeout(int timeout) > { > - def_madrpc_timeout = timeout; > + madrpc_timeout = timeout; > return 0; > } > > +void mad_rpc_set_retries(struct ibmad_port *port, int retries) > +{ > + port->retries = retries; > +} > + > +void mad_rpc_set_timeout(struct ibmad_port *port, int timeout) > +{ > + port->timeout = timeout; > +} > + > int madrpc_def_timeout(void) > { > - return def_madrpc_timeout; > + return madrpc_timeout; > } > > int madrpc_portid(void) > @@ -104,15 +114,12 @@ int mad_rpc_portid(struct ibmad_port *srcport) > > static int > _do_madrpc(int port_id, void *sndbuf, void *rcvbuf, int agentid, int len, > - int timeout) > + int timeout, int max_retries) > { > uint32_t trid; /* only low 32 bits */ > int retries; > int length, status; > > - if (!timeout) > - timeout = def_madrpc_timeout; > - > if (ibdebug > 1) { > IBWARN(">>> sending: len %d pktsz %zu", len, umad_size() + len); > xdump(stderr, "send buf\n", sndbuf, umad_size() + len); > @@ -127,7 +134,7 @@ _do_madrpc(int port_id, void *sndbuf, void *rcvbuf, int > agentid, int len, > trid = > (uint32_t) mad_get_field64(umad_get_mad(sndbuf), 0, IB_MAD_TRID_F); > > - for (retries = 0; retries < madrpc_retries; retries++) { > + for (retries = 0; retries < max_retries; retries++) { > if (retries) { > ERRS("retry %d (timeout %d ms)", retries, timeout); > } > @@ -171,6 +178,7 @@ void *mad_rpc(const struct ibmad_port *port, ib_rpc_t * > rpc, ib_portid_t * dport > { > int status, len; > uint8_t sndbuf[1024], rcvbuf[1024], *mad; > + int timeout, retries; > > len = 0; > memset(sndbuf, 0, umad_size() + IB_MAD_SIZE); > @@ -178,9 +186,13 @@ void *mad_rpc(const struct ibmad_port *port, ib_rpc_t * > rpc, ib_portid_t * dport > if ((len = mad_build_pkt(sndbuf, rpc, dport, 0, payload)) < 0) > return 0; > > + timeout = rpc->timeout ? rpc->timeout : > + port->timeout ? port->timeout : madrpc_timeout; > + retries = port->retries ? port->retries : madrpc_retries; > + > if ((len = _do_madrpc(port->port_id, sndbuf, rcvbuf, > port->class_agents[rpc->mgtclass], > - len, rpc->timeout)) < 0) { > + len, timeout, retries)) < 0) { > IBWARN("_do_madrpc failed; dport (%s)", portid2str(dport)); > return 0; > } > @@ -209,6 +221,7 @@ void *mad_rpc_rmpp(const struct ibmad_port *port, > ib_rpc_t * rpc, ib_portid_t * > { > int status, len; > uint8_t sndbuf[1024], rcvbuf[1024], *mad; > + int timeout, retries; > > memset(sndbuf, 0, umad_size() + IB_MAD_SIZE); > > @@ -217,9 +230,13 @@ void *mad_rpc_rmpp(const struct ibmad_port *port, > ib_rpc_t * rpc, ib_portid_t * > if ((len = mad_build_pkt(sndbuf, rpc, dport, rmpp, data)) < 0) > return 0; > > + timeout = rpc->timeout ? rpc->timeout : > + port->timeout ? port->timeout : madrpc_timeout; > + retries = port->retries ? port->retries : madrpc_retries; > + > if ((len = _do_madrpc(port->port_id, sndbuf, rcvbuf, > port->class_agents[rpc->mgtclass], > - len, rpc->timeout)) < 0) { > + len, rpc->timeout, retries)) < 0) { > IBWARN("_do_madrpc failed; dport (%s)", portid2str(dport)); > return 0; > } > -- > 1.6.1.2.319.gbd9e > -- Ira Weiny Math Programer/Computer Scientist Larence Livermore National Lab [email protected] _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
