Sasha Khapyorsky a écrit :
> Hi Nicolas,
>
> On 09:08 Tue 10 Feb     , Nicolas Morey Chaisemartin wrote:
>   
>> This add a dump_portguid functionnality to openSM console which makes it 
>> really easy to generate cn_guid_file, root_guid_file and such
>> by dumping into a file all port guids whom nodedesc contains at least one 
>> of the provided regexps
>>
>> Signed-off-by: Nicolas Morey-Chaisemartin 
>> <[email protected]>
>> ---
>>
>> Repost without exit_after_run flag, active sleep init loop and indented.
>>
>>  opensm/opensm/osm_console.c |  105 
>> +++++++++++++++++++++++++++++++++++++++++++
>>  1 files changed, 105 insertions(+), 0 deletions(-)
>>
>>
>>     
>
>   
>> diff --git a/opensm/opensm/osm_console.c b/opensm/opensm/osm_console.c
>> index c6e8e59..5fbcd43 100644
>> --- a/opensm/opensm/osm_console.c
>> +++ b/opensm/opensm/osm_console.c
>> @@ -42,6 +42,7 @@
>>  #include <sys/types.h>
>>  #include <sys/socket.h>
>>  #include <netdb.h>
>> +#include <regex.h>
>>  #ifdef ENABLE_OSM_CONSOLE_SOCKET
>>  #include <arpa/inet.h>
>>  #endif
>> @@ -1173,6 +1174,109 @@ static void version_parse(char **p_last, 
>> osm_opensm_t * p_osm, FILE * out)
>>  }
>>  
>>  /* more parse routines go here */
>> +typedef struct _regexp_list {
>> +    regex_t exp;
>> +    struct _regexp_list *next;
>> +} regexp_list_t;
>> +
>> +static void dump_portguid_parse(char **p_last, osm_opensm_t * p_osm, FILE * 
>> out)
>> +{
>> +    cl_qmap_t *p_port_guid_tbl;
>> +    osm_port_t *p_port;
>> +    osm_port_t *p_next_port;
>> +
>> +    regexp_list_t *p_head_regexp = NULL;
>> +    regexp_list_t *p_regexp;
>> +
>> +    /* Option variables */
>> +    char *p_cmd = NULL;
>> +    FILE *output = out;
>> +
>> +    /* Read commande line */
>> +
>> +    while (1) {
>> +            p_cmd = next_token(p_last);
>> +            if (p_cmd) {
>> +                    if (strcmp(p_cmd, "file") == 0) {
>> +                            p_cmd = next_token(p_last);
>> +                            if (p_cmd) {
>> +                                    output = fopen(p_cmd, "w+");
>> +                                    if (output == NULL) {
>> +                                            fprintf(out,
>> +                                                    "Could not open file 
>> %s: %s\n",
>> +                                                    p_cmd, strerror(errno));
>> +                                            output = out;
>> +                                    }
>> +                            } else
>> +                                    fprintf(out, "No file name passed\n");
>> +                    } else {
>> +                            p_regexp = malloc(sizeof(*p_regexp));
>> +                            if (regcomp
>> +                                (&(p_regexp->exp), p_cmd,
>> +                                 REG_NOSUB | REG_EXTENDED) != 0) {
>> +                                    fprintf(out,
>> +                                            "Couldn't parse regular 
>> expression %s. Skipping it.\n",
>> +                                            p_cmd);
>> +                            }
>> +                            p_regexp->next = p_head_regexp;
>> +                            p_head_regexp = p_regexp;
>> +                    }
>> +            } else
>> +                    break;  /* No more tokens */
>> +
>> +    }
>> +
>> +    /* Check we have at least one expression to match */
>> +    if (p_head_regexp == NULL) {
>> +            fprintf(out, "No valid expression provided. Aborting\n");
>> +            return;
>> +    }
>> +
>> +    cl_spinlock_release(&p_osm->sm.state_lock);
>>     
>
> What is this cl_spinlock_release()? Typo?
>
>   
>> +    if (p_osm->sm.p_subn->need_update != 0) {
>> +            fprintf(out, "Subnet is not ready yet. Try again later.\n");
>> +            return;
>> +    }
>> +
>> +    /* Subnet doesn't need to be updated so we can carry on */
>> +
>> +    CL_PLOCK_EXCL_ACQUIRE(p_osm->sm.p_lock);
>> +    p_port_guid_tbl = &(p_osm->sm.p_subn->port_guid_tbl);
>>     
>
> Do we really need exclusive locking here? port_guid_table content is
> rad-only, I guess "read-only" lock (CL_PLOCK_ACQUIRE()) should be enough.
>
> The rest looks fine for me.
>
> Sasha
>
>   

Read only is fine. I didn't know complib provided different kinds of lock.

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

Reply via email to