On 10:23 Fri 15 Jan     , Al Chu wrote:
> Hi Sasha,
> 
> This adds the --load-cache options to iblinkinfo and ibqueryerrors.
> 
> Al
> 
> -- 
> Albert Chu
> [email protected]
> Computer Scientist
> High Performance Systems Division
> Lawrence Livermore National Laboratory

> From: Albert Chu <[email protected]>
> Date: Thu, 10 Dec 2009 11:22:50 -0800
> Subject: [PATCH] support --load-cache in iblinkinfo and ibqueryerrors
> 
> 
> Signed-off-by: Albert Chu <[email protected]>
> ---
>  infiniband-diags/man/iblinkinfo.8    |   11 ++++++-
>  infiniband-diags/man/ibqueryerrors.8 |   10 ++++++-
>  infiniband-diags/src/iblinkinfo.c    |   52 +++++++++++++++++++++++++-------
>  infiniband-diags/src/ibqueryerrors.c |   53 ++++++++++++++++++++++++++-------
>  4 files changed, 99 insertions(+), 27 deletions(-)
> 
> diff --git a/infiniband-diags/man/iblinkinfo.8 
> b/infiniband-diags/man/iblinkinfo.8
> index 0f53b00..f184edf 100644
> --- a/infiniband-diags/man/iblinkinfo.8
> +++ b/infiniband-diags/man/iblinkinfo.8
> @@ -6,7 +6,7 @@ iblinkinfo \- report link info for all links in the fabric
>  .SH SYNOPSIS
>  .B iblinkinfo
>     [-hcdl -C <ca_name> -P <ca_port> -v <lt,hoq,vlstall> -S <guid>
> --D <direct_route>]
> +-D <direct_route> \-\-load\-cache <filename>]
>  
>  .SH DESCRIPTION
>  .PP
> @@ -42,7 +42,14 @@ Print port capabilities (enabled and supported values)
>  \fB\-P <ca_port>\fR    use the specified ca_port for the search.
>  .TP
>  \fB\-R\fR (This option is obsolete and does nothing)
> -
> +.TP
> +\fB\-\-load\-cache\fR <filename>
> +Load and use the cached ibnetdiscover data stored in the specified
> +filename.  May be useful for outputting and learning about other
> +fabrics or a previous state of a fabric.  Cannot be used if user
> +specifies a directo route path.  See
> +.B ibnetdiscover
> +for information on caching ibnetdiscover output.
>  
>  .SH AUTHOR
>  .TP
> diff --git a/infiniband-diags/man/ibqueryerrors.8 
> b/infiniband-diags/man/ibqueryerrors.8
> index 83a2b5a..56a0d67 100644
> --- a/infiniband-diags/man/ibqueryerrors.8
> +++ b/infiniband-diags/man/ibqueryerrors.8
> @@ -6,7 +6,7 @@ ibqueryerrors \- query and report non-zero IB port counters
>  .SH SYNOPSIS
>  .B ibqueryerrors
>  [-s <err1,err2,...> -c -r -C <ca_name> -P <ca_port> -G <node_guid>
> --D <direct_route> -d -k -K]
> +-D <direct_route> -d -k -K \-\-load\-cache <filename>]
>  
>  .SH DESCRIPTION
>  .PP
> @@ -60,6 +60,14 @@ specified the data counters will be cleared without any 
> printed output.
>  .TP
>  \fB\-\-details\fR include transmit discard details
>  .TP
> +\fB\-\-load\-cache\fR <filename>
> +Load and use the cached ibnetdiscover data stored in the specified
> +filename.  May be useful for outputting and learning about other
> +fabrics or a previous state of a fabric.  Cannot be used if user
> +specifies a directo route path.  See
> +.B ibnetdiscover
> +for information on caching ibnetdiscover output.
> +.TP
>  \fB\-R\fR  (This option is obsolete and does nothing)
>  
>  .SH COMMON OPTIONS
> diff --git a/infiniband-diags/src/iblinkinfo.c 
> b/infiniband-diags/src/iblinkinfo.c
> index 21b31bb..10e3ad5 100644
> --- a/infiniband-diags/src/iblinkinfo.c
> +++ b/infiniband-diags/src/iblinkinfo.c
> @@ -55,6 +55,7 @@
>  
>  static char *node_name_map_file = NULL;
>  static nn_map_t *node_name_map = NULL;
> +static char *load_cache_file = NULL;
>  
>  static uint64_t guid = 0;
>  static char *guid_str = NULL;
> @@ -230,6 +231,9 @@ static int process_opt(void *context, int ch, char 
> *optarg)
>       case 1:
>               node_name_map_file = strdup(optarg);
>               break;
> +     case 2:
> +             load_cache_file = strdup(optarg);
> +             break;
>       case 'S':
>               guid_str = optarg;
>               guid = (uint64_t) strtoull(guid_str, 0, 0);
> @@ -291,6 +295,7 @@ int main(int argc, char **argv)
>                "print additional switch settings (PktLifeTime, HoqLife, 
> VLStallCount)"},
>               {"portguids", 'g', 0, NULL,
>                "print port guids instead of node guids"},
> +             {"load-cache", 2, 1, "<file>", "filename of ibnetdiscover cache 
> to load"},
>               {"GNDN", 'R', 0, NULL,
>                "(This option is obsolete and does nothing)"},
>               {0}
> @@ -317,6 +322,11 @@ int main(int argc, char **argv)
>               mad_rpc_set_timeout(ibmad_port, ibd_timeout);
>  
>       node_name_map = open_node_name_map(node_name_map_file);
> +     
> +     if (dr_path && load_cache_file) {
> +             fprintf(stderr, "Cannot specify cache and direct route path\n");
> +             exit(1);
> +     }

Why is this limitation needed really?

>  
>       if (dr_path) {
>               /* only scan part of the fabric */
> @@ -334,19 +344,37 @@ int main(int argc, char **argv)
>                              guid_str);
>       }
>  
> -     if (resolved >= 0)
> -             if ((fabric = ibnd_discover_fabric(ibmad_port, &port_id,
> -                                                hops)) == NULL)
> -                     IBWARN
> -                         ("Single node discover failed; attempting full 
> scan\n");
> -
> -     if (!fabric)
> -             if ((fabric =
> -                  ibnd_discover_fabric(ibmad_port, NULL, -1)) == NULL) {
> -                     fprintf(stderr, "discover failed\n");
> -                     rc = 1;
> -                     goto close_port;
> +     if (resolved >= 0) {
> +             if (load_cache_file) {
> +                     if ((fabric = ibnd_load_fabric(load_cache_file, 0)) == 
> NULL) {
> +                             fprintf(stderr, "loading cached fabric 
> failed\n");
> +                             exit(1);
> +                     }
> +             }
> +             else {
> +                     if ((fabric = ibnd_discover_fabric(ibmad_port, &port_id,
> +                                                        hops)) == NULL)
> +                             IBWARN
> +                                 ("Single node discover failed; attempting 
> full scan\n");
> +             }
> +     }
> +
> +     if (!fabric) {
> +             if (load_cache_file) {
> +                     if ((fabric = ibnd_load_fabric(load_cache_file, 0)) == 
> NULL) {
> +                             fprintf(stderr, "loading cached fabric 
> failed\n");
> +                             exit(1);
> +                     }
>               }
> +             else {
> +                     if ((fabric =
> +                             ibnd_discover_fabric(ibmad_port, NULL, -1)) == 
> NULL) {
> +                                     fprintf(stderr, "discover failed\n");
> +                                     rc = 1;
> +                                     goto close_port;
> +                     }
> +             }
> +     }

It doesn't look so simple for me. In case when '-S' or '-D' are used the
information is requested for only specific node. So the flow of initial
discovery (above) would likely look as:

        if (load_cache_file)
                load_fabric_from_cache();
        else {
                if (resloved)
                        fabric = single_node_discovery();
                if (!fabric)
                        fabric = full_fabric_discovery();
        }

        ....

Correct?

>  
>       if (!all && guid_str) {
>               ibnd_node_t *sw = ibnd_find_node_guid(fabric, guid);
> diff --git a/infiniband-diags/src/ibqueryerrors.c 
> b/infiniband-diags/src/ibqueryerrors.c
> index 47bd2af..3ed0ed1 100644
> --- a/infiniband-diags/src/ibqueryerrors.c
> +++ b/infiniband-diags/src/ibqueryerrors.c
> @@ -58,6 +58,8 @@
>  struct ibmad_port *ibmad_port;
>  static char *node_name_map_file = NULL;
>  static nn_map_t *node_name_map = NULL;
> +static char *load_cache_file = NULL;
> +
>  int data_counters = 0;
>  int port_config = 0;
>  uint64_t node_guid = 0;
> @@ -481,6 +483,9 @@ static int process_opt(void *context, int ch, char 
> *optarg)
>       case 6:
>               details = 1;
>               break;
> +     case 7:
> +             load_cache_file = strdup(optarg);
> +             break;
>       case 'G':
>       case 'S':
>               node_guid_str = optarg;
> @@ -542,6 +547,7 @@ int main(int argc, char **argv)
>                "Clear error counters after read"},
>               {"clear-counts", 'K', 0, NULL,
>                "Clear data counters after read"},
> +             {"load-cache", 7, 1, "<file>", "filename of ibnetdiscover cache 
> to load"},
>               {0}
>       };
>       char usage_args[] = "";
> @@ -568,6 +574,11 @@ int main(int argc, char **argv)
>  
>       node_name_map = open_node_name_map(node_name_map_file);
>  
> +     if (dr_path && load_cache_file) {
> +             fprintf(stderr, "Cannot specify cache and direct route path\n");
> +             exit(1);
> +     }
> +
>       /* limit the scan the fabric around the target */
>       if (dr_path) {
>               if ((resolved =
> @@ -584,19 +595,37 @@ int main(int argc, char **argv)
>                              node_guid_str);
>       }
>  
> -     if (resolved >= 0)
> -             if ((fabric = ibnd_discover_fabric(ibmad_port, &portid,
> -                                                0)) == NULL)
> -                     IBWARN
> -                         ("Single node discover failed; attempting full 
> scan");
> -
> -     if (!fabric)            /* do a full scan */
> -             if ((fabric =
> -                  ibnd_discover_fabric(ibmad_port, NULL, -1)) == NULL) {
> -                     fprintf(stderr, "discover failed\n");
> -                     rc = 1;
> -                     goto close_port;
> +     if (resolved >= 0) {
> +             if (load_cache_file) {
> +                     if ((fabric = ibnd_load_fabric(load_cache_file, 0)) == 
> NULL) {
> +                             fprintf(stderr, "loading cached fabric 
> failed\n");
> +                             exit(1);
> +                     }
> +             }
> +             else {
> +                     if ((fabric = ibnd_discover_fabric(ibmad_port, &portid,
> +                                                        0)) == NULL)
> +                             IBWARN
> +                                 ("Single node discover failed; attempting 
> full scan");
>               }
> +     }
> +
> +     if (!fabric) {          /* do a full scan */
> +             if (load_cache_file) {
> +                     if ((fabric = ibnd_load_fabric(load_cache_file, 0)) == 
> NULL) {
> +                             fprintf(stderr, "loading cached fabric 
> failed\n");
> +                             exit(1);
> +                     }
> +             }
> +             else {
> +                     if ((fabric =
> +                          ibnd_discover_fabric(ibmad_port, NULL, -1)) == 
> NULL) {
> +                             fprintf(stderr, "discover failed\n");
> +                             rc = 1;
> +                             goto close_port;
> +                     }
> +             }
> +     }

Ditto.

Sasha

>  
>       report_suppressed();
>  
> -- 
> 1.5.4.5
> 

--
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

Reply via email to