On Mon, Apr 13, 2015 at 11:34:37AM -0400, Hal Rosenstock wrote:
> From: Vladimir Koushnir <[email protected]>
> Date: Wed, 8 Apr 2015 12:29:44 +0300
>
> Today, two umad SMP file descriptors are used in libibnetdisc.
> One of them is needed only for retrieving LID of the local port
> for combined routing.
>
> The patch removes the need for 2 files descriptors by retrieving
> LID of the local port in advance.
>
> Signed-off-by: Vladimir Koushnir <[email protected]>
> Signed-off-by: Hal Rosenstock <[email protected]>
Thanks applied,
Ira
> ---
> libibnetdisc/src/ibnetdisc.c | 34 +++++++++++++++++-----------------
> libibnetdisc/src/internal.h | 1 -
> 2 files changed, 17 insertions(+), 18 deletions(-)
>
> diff --git a/libibnetdisc/src/ibnetdisc.c b/libibnetdisc/src/ibnetdisc.c
> index e346905..e0f2d78 100644
> --- a/libibnetdisc/src/ibnetdisc.c
> +++ b/libibnetdisc/src/ibnetdisc.c
> @@ -127,12 +127,6 @@ static int extend_dpath(smp_engine_t * engine,
> ib_portid_t * portid,
>
> if (portid->lid) {
> /* If we were LID routed we need to set up the drslid */
> - if (!scan->selfportid.lid)
> - if (ib_resolve_self_via(&scan->selfportid, NULL, NULL,
> - scan->ibmad_port) < 0) {
> - IBND_ERROR("Failed to resolve self\n");
> - return -1;
> - }
> portid->drpath.drslid = (uint16_t) scan->selfportid.lid;
> portid->drpath.drdlid = 0xFFFF;
> }
> @@ -712,6 +706,7 @@ ibnd_fabric_t *ibnd_discover_fabric(char * ca_name, int
> ca_port,
> ib_portid_t my_portid = { 0 };
> smp_engine_t engine;
> ibnd_scan_t scan;
> + struct ibmad_port *ibmad_port;
> int nc = 2;
> int mc[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
>
> @@ -735,20 +730,27 @@ ibnd_fabric_t *ibnd_discover_fabric(char * ca_name, int
> ca_port,
> scan.cfg = &config;
> scan.initial_hops = from->drpath.cnt;
>
> - if (smp_engine_init(&engine, ca_name, ca_port, &scan, &config)) {
> - free(f_int);
> + ibmad_port = mad_rpc_open_port(ca_name, ca_port, mc, nc);
> + if (!ibmad_port) {
> + IBND_ERROR("can't open MAD port (%s:%d)\n", ca_name, ca_port);
> return (NULL);
> }
> + mad_rpc_set_timeout(ibmad_port, cfg->timeout_ms);
> + mad_rpc_set_retries(ibmad_port, cfg->retries);
> + smp_mkey_set(ibmad_port, cfg->mkey);
>
> - scan.ibmad_port = mad_rpc_open_port(ca_name, ca_port, mc, nc);
> - if (!scan.ibmad_port) {
> - IBND_ERROR("can't open MAD port (%s:%d)\n", ca_name, ca_port);
> - smp_engine_destroy(&engine);
> + if (ib_resolve_self_via(&scan.selfportid,
> + NULL, NULL, ibmad_port) < 0) {
> + IBND_ERROR("Failed to resolve self\n");
> + mad_rpc_close_port(ibmad_port);
> + return NULL;
> + }
> + mad_rpc_close_port(ibmad_port);
> +
> + if (smp_engine_init(&engine, ca_name, ca_port, &scan, &config)) {
> + free(f_int);
> return (NULL);
> }
> - mad_rpc_set_timeout(scan.ibmad_port, cfg->timeout_ms);
> - mad_rpc_set_retries(scan.ibmad_port, cfg->retries);
> - smp_mkey_set(scan.ibmad_port, cfg->mkey);
>
> IBND_DEBUG("from %s\n", portid2str(from));
>
> @@ -763,11 +765,9 @@ ibnd_fabric_t *ibnd_discover_fabric(char * ca_name, int
> ca_port,
> goto error;
>
> smp_engine_destroy(&engine);
> - mad_rpc_close_port(scan.ibmad_port);
> return (ibnd_fabric_t *)f_int;
> error:
> smp_engine_destroy(&engine);
> - mad_rpc_close_port(scan.ibmad_port);
> ibnd_destroy_fabric(&f_int->fabric);
> return NULL;
> }
> diff --git a/libibnetdisc/src/internal.h b/libibnetdisc/src/internal.h
> index 1ccd29c..a50d2d7 100644
> --- a/libibnetdisc/src/internal.h
> +++ b/libibnetdisc/src/internal.h
> @@ -71,7 +71,6 @@ typedef struct ibnd_scan {
> ib_portid_t selfportid;
> f_internal_t *f_int;
> struct ibnd_config *cfg;
> - struct ibmad_port *ibmad_port;
> unsigned initial_hops;
> } ibnd_scan_t;
>
> --
> 1.7.8.2
>
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html