[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC] libxl: support for using 'MmGg' as memory size suffix
Modify lexer to special-case memory size string. Introduce xlu_cfg_get_memsize to parse memroy size strings. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> --- tools/libxl/libxlu_cfg.c | 46 ++++++++++++ tools/libxl/libxlu_cfg_l.c | 176 ++++++++++++++++++++++++-------------------- tools/libxl/libxlu_cfg_l.h | 8 +- tools/libxl/libxlu_cfg_l.l | 4 + tools/libxl/libxlutil.h | 2 + tools/libxl/xl_cmdimpl.c | 8 +- 6 files changed, 158 insertions(+), 86 deletions(-) diff --git a/tools/libxl/libxlu_cfg.c b/tools/libxl/libxlu_cfg.c index 22adcb0..4f53418 100644 --- a/tools/libxl/libxlu_cfg.c +++ b/tools/libxl/libxlu_cfg.c @@ -237,6 +237,52 @@ int xlu_cfg_get_long(const XLU_Config *cfg, const char *n, return 0; } +int xlu_cfg_get_memsize(const XLU_Config *cfg, const char *n, + long *value_r, int dont_warn) { + long l; + XLU_ConfigSetting *set; + int e; + char *ep; + + e= find_atom(cfg,n,&set,dont_warn); if (e) return e; + errno= 0; l= strtol(set->values[0], &ep, 0); + e= errno; + if (errno) { + e= errno; + assert(e==EINVAL || e==ERANGE); + if (!dont_warn) + fprintf(cfg->report, + "%s:%d: warning: parameter `%s' could not be parsed" + " as memory size: %s\n", + cfg->config_source, set->lineno, n, strerror(e)); + return e; + } + if ((*ep!='M' && *ep!='m' && *ep!='G' && *ep!='g') || + ep==set->values[0]) { + if (!dont_warn) + fprintf(cfg->report, + "%s:%d: warning: parameter `%s' is not a valid" + " memory size *ep=%c\n", + cfg->config_source, set->lineno, n, *ep); + return EINVAL; + } + + /* Nothing to do if the suffix is [Mm]. */ + + if (*ep=='G' || *ep=='g') { + if (l >= INT_MAX / 1024 && !dont_warn) { + fprintf(cfg->report, + "%s:%d: warning: parameter `%s' overflows\n", + cfg->config_source, set->lineno, n); + return ERANGE; + } else + l*= 1024; + } + + *value_r= l; + return 0; +} + int xlu_cfg_get_defbool(const XLU_Config *cfg, const char *n, libxl_defbool *b, int dont_warn) { diff --git a/tools/libxl/libxlu_cfg_l.c b/tools/libxl/libxlu_cfg_l.c index df352aa..191b816 100644 --- a/tools/libxl/libxlu_cfg_l.c +++ b/tools/libxl/libxlu_cfg_l.c @@ -370,8 +370,8 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 16 -#define YY_END_OF_BUFFER 17 +#define YY_NUM_RULES 17 +#define YY_END_OF_BUFFER 18 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -379,12 +379,12 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[35] = +static yyconst flex_int16_t yy_accept[36] = { 0, - 0, 0, 14, 14, 17, 13, 3, 9, 13, 13, - 13, 12, 4, 2, 8, 7, 5, 6, 1, 14, - 14, 15, 0, 11, 0, 0, 9, 0, 10, 0, - 2, 1, 14, 0 + 0, 0, 15, 15, 18, 14, 4, 10, 14, 14, + 14, 13, 5, 2, 9, 8, 6, 7, 1, 15, + 15, 16, 0, 12, 0, 0, 10, 0, 11, 0, + 2, 3, 1, 15, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -396,13 +396,13 @@ static yyconst flex_int32_t yy_ec[256] = 7, 1, 7, 8, 7, 9, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 11, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 13, 1, 1, 1, 1, 1, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 13, 14, 15, 1, 16, 1, 17, 17, 17, 17, + 14, 15, 16, 1, 17, 1, 18, 18, 18, 18, - 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, - 18, 18, 1, 1, 1, 1, 1, 1, 1, 1, + 18, 18, 19, 20, 20, 20, 20, 20, 19, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 18, + 20, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -419,56 +419,60 @@ static yyconst flex_int32_t yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst flex_int32_t yy_meta[19] = +static yyconst flex_int32_t yy_meta[21] = { 0, 1, 2, 3, 1, 1, 1, 1, 1, 4, 4, - 1, 1, 1, 1, 1, 4, 4, 4 + 1, 1, 1, 1, 1, 1, 4, 4, 4, 4 } ; -static yyconst flex_int16_t yy_base[41] = +static yyconst flex_int16_t yy_base[42] = { 0, - 0, 0, 17, 19, 44, 58, 58, 58, 19, 28, - 18, 58, 58, 17, 58, 58, 58, 58, 0, 0, - 58, 58, 21, 58, 0, 26, 58, 22, 58, 0, - 20, 0, 0, 58, 37, 41, 45, 49, 22, 53 + 0, 0, 19, 21, 32, 67, 67, 67, 21, 28, + 20, 67, 67, 27, 67, 67, 67, 67, 0, 0, + 67, 67, 23, 67, 0, 26, 67, 24, 67, 0, + 0, 67, 0, 0, 67, 46, 50, 54, 58, 24, + 62 } ; -static yyconst flex_int16_t yy_def[41] = +static yyconst flex_int16_t yy_def[42] = { 0, - 34, 1, 35, 35, 34, 34, 34, 34, 36, 37, - 38, 34, 34, 34, 34, 34, 34, 34, 39, 40, - 34, 34, 36, 34, 36, 37, 34, 38, 34, 38, - 34, 39, 40, 0, 34, 34, 34, 34, 34, 34 + 35, 1, 36, 36, 35, 35, 35, 35, 37, 38, + 39, 35, 35, 35, 35, 35, 35, 35, 40, 41, + 35, 35, 37, 35, 37, 38, 35, 39, 35, 39, + 14, 35, 40, 41, 0, 35, 35, 35, 35, 35, + 35 } ; -static yyconst flex_int16_t yy_nxt[77] = +static yyconst flex_int16_t yy_nxt[88] = { 0, 6, 7, 8, 9, 10, 11, 12, 13, 12, 14, - 15, 16, 17, 6, 18, 6, 19, 19, 21, 22, - 21, 22, 24, 29, 24, 32, 31, 29, 27, 31, - 27, 30, 25, 31, 25, 30, 31, 20, 20, 20, - 20, 23, 23, 34, 23, 26, 26, 26, 26, 28, - 28, 34, 28, 33, 34, 34, 33, 5, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34 + 15, 16, 6, 17, 6, 18, 6, 19, 19, 19, + 21, 22, 21, 22, 24, 29, 24, 33, 27, 29, + 27, 35, 35, 35, 30, 25, 31, 25, 30, 32, + 35, 35, 35, 35, 31, 32, 20, 20, 20, 20, + 23, 23, 35, 23, 26, 26, 26, 26, 28, 28, + 35, 28, 34, 35, 35, 34, 5, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35 } ; -static yyconst flex_int16_t yy_chk[77] = +static yyconst flex_int16_t yy_chk[88] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, - 4, 4, 9, 11, 23, 39, 14, 28, 26, 31, - 10, 11, 9, 14, 23, 28, 31, 35, 35, 35, - 35, 36, 36, 5, 36, 37, 37, 37, 37, 38, - 38, 0, 38, 40, 0, 0, 40, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 4, 4, 9, 11, 23, 40, 26, 28, + 10, 5, 0, 0, 11, 9, 14, 23, 28, 14, + 0, 0, 0, 0, 14, 14, 36, 36, 36, 36, + 37, 37, 0, 37, 38, 38, 38, 38, 39, 39, + 0, 39, 41, 0, 0, 41, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35 } ; /* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[17] = +static yyconst flex_int32_t yy_rule_can_match_eol[18] = { 0, -0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, }; +0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, }; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. @@ -514,7 +518,7 @@ int xlu__cfg_yyget_column(yyscan_t yyscanner); void xlu__cfg_yyset_column(int column_no, yyscan_t yyscanner); -#line 518 "libxlu_cfg_l.c" +#line 522 "libxlu_cfg_l.c" #define INITIAL 0 #define lexerr 1 @@ -610,6 +614,10 @@ int xlu__cfg_yyget_lineno (yyscan_t yyscanner ); void xlu__cfg_yyset_lineno (int line_number ,yyscan_t yyscanner ); +int xlu__cfg_yyget_column (yyscan_t yyscanner ); + +void xlu__cfg_yyset_column (int column_no ,yyscan_t yyscanner ); + YYSTYPE * xlu__cfg_yyget_lval (yyscan_t yyscanner ); void xlu__cfg_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); @@ -762,7 +770,7 @@ YY_DECL #line 53 "libxlu_cfg_l.l" -#line 766 "libxlu_cfg_l.c" +#line 774 "libxlu_cfg_l.c" yylval = yylval_param; @@ -825,13 +833,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 35 ) + if ( yy_current_state >= 36 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_current_state != 34 ); + while ( yy_current_state != 35 ); yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; @@ -881,97 +889,105 @@ YY_RULE_SETUP YY_BREAK case 3: YY_RULE_SETUP -#line 64 "libxlu_cfg_l.l" - +#line 63 "libxlu_cfg_l.l" +{ + yylval->string= xlu__cfgl_strdup(ctx,yytext); + GOT(STRING); + } YY_BREAK case 4: YY_RULE_SETUP -#line 66 "libxlu_cfg_l.l" -{ GOT(','); } +#line 68 "libxlu_cfg_l.l" + YY_BREAK case 5: YY_RULE_SETUP -#line 67 "libxlu_cfg_l.l" -{ GOT('['); } +#line 70 "libxlu_cfg_l.l" +{ GOT(','); } YY_BREAK case 6: YY_RULE_SETUP -#line 68 "libxlu_cfg_l.l" -{ GOT(']'); } +#line 71 "libxlu_cfg_l.l" +{ GOT('['); } YY_BREAK case 7: YY_RULE_SETUP -#line 69 "libxlu_cfg_l.l" -{ GOT('='); } +#line 72 "libxlu_cfg_l.l" +{ GOT(']'); } YY_BREAK case 8: YY_RULE_SETUP -#line 70 "libxlu_cfg_l.l" -{ GOT(';'); } +#line 73 "libxlu_cfg_l.l" +{ GOT('='); } YY_BREAK case 9: -/* rule 9 can match eol */ YY_RULE_SETUP -#line 72 "libxlu_cfg_l.l" -{ yylloc->first_line= yylineno-1; return NEWLINE; } +#line 74 "libxlu_cfg_l.l" +{ GOT(';'); } YY_BREAK case 10: +/* rule 10 can match eol */ YY_RULE_SETUP -#line 74 "libxlu_cfg_l.l" +#line 76 "libxlu_cfg_l.l" +{ yylloc->first_line= yylineno-1; return NEWLINE; } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 78 "libxlu_cfg_l.l" { yylval->string= xlu__cfgl_dequote(ctx,yytext); GOT(STRING); } YY_BREAK -case 11: +case 12: YY_RULE_SETUP -#line 78 "libxlu_cfg_l.l" +#line 82 "libxlu_cfg_l.l" { yylval->string= xlu__cfgl_dequote(ctx,yytext); GOT(STRING); } YY_BREAK -case 12: +case 13: YY_RULE_SETUP -#line 83 "libxlu_cfg_l.l" +#line 87 "libxlu_cfg_l.l" { ctx->likely_python= 1; BEGIN(lexerr); yymore(); } YY_BREAK -case 13: +case 14: YY_RULE_SETUP -#line 89 "libxlu_cfg_l.l" +#line 93 "libxlu_cfg_l.l" { BEGIN(lexerr); yymore(); } YY_BREAK -case 14: +case 15: YY_RULE_SETUP -#line 94 "libxlu_cfg_l.l" +#line 98 "libxlu_cfg_l.l" { xlu__cfgl_lexicalerror(ctx,"lexical error"); BEGIN(0); } YY_BREAK -case 15: -/* rule 15 can match eol */ +case 16: +/* rule 16 can match eol */ YY_RULE_SETUP -#line 99 "libxlu_cfg_l.l" +#line 103 "libxlu_cfg_l.l" { xlu__cfgl_lexicalerror(ctx,"lexical error"); BEGIN(0); GOT(NEWLINE); } YY_BREAK -case 16: +case 17: YY_RULE_SETUP -#line 104 "libxlu_cfg_l.l" +#line 108 "libxlu_cfg_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 975 "libxlu_cfg_l.c" +#line 991 "libxlu_cfg_l.c" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(lexerr): yyterminate(); @@ -1267,7 +1283,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 35 ) + if ( yy_current_state >= 36 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -1296,11 +1312,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 35 ) + if ( yy_current_state >= 36 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 34); + yy_is_jam = (yy_current_state == 35); return yy_is_jam ? 0 : yy_current_state; } @@ -2121,4 +2137,4 @@ void xlu__cfg_yyfree (void * ptr , yyscan_t yyscanner) #define YYTABLES_NAME "yytables" -#line 104 "libxlu_cfg_l.l" +#line 108 "libxlu_cfg_l.l" diff --git a/tools/libxl/libxlu_cfg_l.h b/tools/libxl/libxlu_cfg_l.h index 4078302..c104172 100644 --- a/tools/libxl/libxlu_cfg_l.h +++ b/tools/libxl/libxlu_cfg_l.h @@ -276,6 +276,10 @@ int xlu__cfg_yyget_lineno (yyscan_t yyscanner ); void xlu__cfg_yyset_lineno (int line_number ,yyscan_t yyscanner ); +int xlu__cfg_yyget_column (yyscan_t yyscanner ); + +void xlu__cfg_yyset_column (int column_no ,yyscan_t yyscanner ); + YYSTYPE * xlu__cfg_yyget_lval (yyscan_t yyscanner ); void xlu__cfg_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); @@ -350,8 +354,8 @@ extern int xlu__cfg_yylex \ #undef YY_DECL #endif -#line 104 "libxlu_cfg_l.l" +#line 108 "libxlu_cfg_l.l" -#line 356 "libxlu_cfg_l.h" +#line 360 "libxlu_cfg_l.h" #undef xlu__cfg_yyIN_HEADER #endif /* xlu__cfg_yyHEADER_H */ diff --git a/tools/libxl/libxlu_cfg_l.l b/tools/libxl/libxlu_cfg_l.l index e0ea8cf..0b1f299 100644 --- a/tools/libxl/libxlu_cfg_l.l +++ b/tools/libxl/libxlu_cfg_l.l @@ -60,6 +60,10 @@ void xlu__cfg_yyset_column(int column_no, yyscan_t yyscanner); yylval->string= xlu__cfgl_strdup(ctx,yytext); GOT(NUMBER); } +[0-9][0-9a-fx]*[MmGg] { + yylval->string= xlu__cfgl_strdup(ctx,yytext); + GOT(STRING); + } [ \t] diff --git a/tools/libxl/libxlutil.h b/tools/libxl/libxlutil.h index 0333e55..7531016 100644 --- a/tools/libxl/libxlutil.h +++ b/tools/libxl/libxlutil.h @@ -54,6 +54,8 @@ int xlu_cfg_get_long(const XLU_Config*, const char *n, long *value_r, int dont_warn); int xlu_cfg_get_defbool(const XLU_Config*, const char *n, libxl_defbool *b, int dont_warn); +int xlu_cfg_get_memsize(const XLU_Config*, const char *n, long *value_r, + int dont_warn); int xlu_cfg_get_list(const XLU_Config*, const char *n, XLU_ConfigList **list_r /* may be 0 */, diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 3d7eaad..4e53ac5 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -726,12 +726,12 @@ static void parse_config_data(const char *config_source, libxl_defbool_set(&b_info->numa_placement, false); } - if (!xlu_cfg_get_long (config, "memory", &l, 0)) { + if (!xlu_cfg_get_memsize (config, "memory", &l, 0)) { b_info->max_memkb = l * 1024; b_info->target_memkb = b_info->max_memkb; } - if (!xlu_cfg_get_long (config, "maxmem", &l, 0)) + if (!xlu_cfg_get_memsize (config, "maxmem", &l, 0)) b_info->max_memkb = l * 1024; libxl_defbool_set(&b_info->claim_mode, claim_mode); @@ -768,7 +768,7 @@ static void parse_config_data(const char *config_source, /* libxl_get_required_shadow_memory() must be called after final values * (default or specified) for vcpus and memory are set, because the * calculation depends on those values. */ - b_info->shadow_memkb = !xlu_cfg_get_long(config, "shadow_memory", &l, 0) + b_info->shadow_memkb = !xlu_cfg_get_memsize(config, "shadow_memory", &l, 0) ? l * 1024 : libxl_get_required_shadow_memory(b_info->max_memkb, b_info->max_vcpus); @@ -810,7 +810,7 @@ static void parse_config_data(const char *config_source, xlu_cfg_get_defbool(config, "localtime", &b_info->localtime, 0); - if (!xlu_cfg_get_long (config, "videoram", &l, 0)) + if (!xlu_cfg_get_memsize (config, "videoram", &l, 0)) b_info->video_memkb = l * 1024; switch(b_info->type) { -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |