[igt-dev] [RFC i-g-t 1/4] runner: Introduce --resolution to igt_runner

Petri Latvala petri.latvala at intel.com
Fri Jun 10 11:31:45 UTC 2022


On Fri, May 27, 2022 at 03:39:22PM +0300, Petri Latvala wrote:
> On Fri, May 27, 2022 at 01:43:50PM +0530, Bhanuprakash Modem wrote:
> > Allow finer control of taking default DRM display mode for subtests
> > instead of taking the preferred mode exposed by the Kernel.
> > 
> > Example:
> > Eventhough we have an 8K panel, Kernel may expose 4K or lesser mode
> > as a preferred mode. So all subtests will take this mode as a default
> > may cause losing the coverage.
> > 
> > This patch will set the environment variable based on the user request,
> > and IGT will parse this environment variable and take the decision to
> > choose the mode from the available list.
> > 
> > The default is still to take the preferred mode exposed by the Kernel.
> > Other options are:
> > * highest: Choose the mode with highest possible resolution.
> > * lowest:  Choose the mode with lowest possible resolution.
> > 
> > Cc: Petri Latvala <petri.latvala at intel.com>
> > Cc: Swati Sharma <swati2.sharma at intel.com>
> > Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
> > ---
> >  runner/executor.c |  3 +++
> >  runner/settings.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
> >  runner/settings.h |  7 +++++++
> >  3 files changed, 57 insertions(+)
> > 
> > diff --git a/runner/executor.c b/runner/executor.c
> > index 6e6ca9cc..fc805c30 100644
> > --- a/runner/executor.c
> > +++ b/runner/executor.c
> > @@ -2056,6 +2056,9 @@ bool execute(struct execute_state *state,
> >  	}
> >  
> >   end:
> > +	if (getenv("IGT_KMS_RESOLUTION"))
> > +		unsetenv("IGT_KMS_RESOLUTION");
> > +
> >  	if (settings->enable_code_coverage && !settings->cov_results_per_test) {
> >  		char *reason = NULL;
> >  
> > diff --git a/runner/settings.c b/runner/settings.c
> > index bb63a9f4..a20bcd01 100644
> > --- a/runner/settings.c
> > +++ b/runner/settings.c
> > @@ -30,6 +30,7 @@ enum {
> >  	OPT_COV_RESULTS_PER_TEST,
> >  	OPT_VERSION,
> >  	OPT_PRUNE_MODE,
> > +	OPT_RESOLUTION,
> >  	OPT_HELP = 'h',
> >  	OPT_NAME = 'n',
> >  	OPT_DRY_RUN = 'd',
> > @@ -78,6 +79,16 @@ static struct {
> >  	{ 0, 0 },
> >  };
> >  
> > +static struct {
> > +	int value;
> > +	const char *name;
> > +} resolution_modes[] = {
> > +	{ RESOLUTION_DEFAULT, "default" },
> > +	{ RESOLUTION_HIGHEST, "highest" },
> > +	{ RESOLUTION_LOWEST, "lowest" },
> > +	{ 0, 0 },
> > +};
> > +
> >  static bool set_log_level(struct settings* settings, const char *level)
> >  {
> >  	typeof(*log_levels) *it;
> > @@ -130,6 +141,26 @@ static bool set_prune_mode(struct settings* settings, const char *mode)
> >  	return false;
> >  }
> >  
> > +static bool set_resolution_mode(struct settings *settings, const char *mode)
> > +{
> > +	typeof(*resolution_modes) *it;
> > +	char res[2];
> > +
> > +	for (it = resolution_modes; it->name; it++) {
> > +		if (!strcmp(mode, it->name)) {
> > +			settings->resolution = it->value;
> > +
> > +			sprintf(res, "%d", it->value);
> > +			setenv("IGT_KMS_RESOLUTION", res, 1);
> > +
> > +			return true;
> > +		}
> > +	}
> > +	setenv("IGT_KMS_RESOLUTION", "0", 1);
> > +
> > +	return false;
> > +}
> > +
> >  static bool parse_abort_conditions(struct settings *settings, const char *optarg)
> >  {
> >  	char *dup, *origdup, *p;
> > @@ -279,6 +310,12 @@ static const char *usage_str =
> >  	"                                                  not in the requested test set.\n"
> >  	"                                                  Useful when you have a hand-written\n"
> >  	"                                                  testlist.\n"
> > +	"  --resolution <mode>   Control of taking default DRM display mode for subtests\n"
> > +	"                        instead of taking the preferred mode exposed by the Kernel.\n"
> > +	"                        Possible options:\n"
> > +	"                         default  - Use preferred mode. (default)\n"
> > +	"                         highest  - Use the mode with highest possible resolution.\n"
> > +	"                         lowest   - Use the mode with lowest possible resolution.\n"
> >  	"  -b, --blacklist FILENAME\n"
> >  	"                        Exclude all test matching to regexes from FILENAME\n"
> >  	"                        (can be used more than once)\n"
> > @@ -532,6 +569,7 @@ bool parse_options(int argc, char **argv,
> >  		{"dmesg-warn-level", required_argument, NULL, OPT_DMESG_WARN_LEVEL},
> >  		{"prune-mode", required_argument, NULL, OPT_PRUNE_MODE},
> >  		{"blacklist", required_argument, NULL, OPT_BLACKLIST},
> > +		{"resolution", optional_argument, NULL, OPT_RESOLUTION},
> >  		{"list-all", no_argument, NULL, OPT_LIST_ALL},
> >  		{ 0, 0, 0, 0},
> >  	};
> > @@ -640,6 +678,12 @@ bool parse_options(int argc, char **argv,
> >  					     absolute_path(optarg)))
> >  				goto error;
> >  			break;
> > +		case OPT_RESOLUTION:
> > +			if (!set_resolution_mode(settings, optarg)) {
> > +				usage("Cannot parse resolution mode", stderr);
> > +				goto error;
> > +			}
> > +			break;
> 
> If you only set the env var here, it won't be set on resumes.
> 
> >  		case OPT_LIST_ALL:
> >  			settings->list_all = true;
> >  			break;
> > @@ -854,6 +898,7 @@ bool serialize_settings(struct settings *settings)
> >  	SERIALIZE_LINE(f, settings, piglit_style_dmesg, "%d");
> >  	SERIALIZE_LINE(f, settings, dmesg_warn_level, "%d");
> >  	SERIALIZE_LINE(f, settings, prune_mode, "%d");
> > +	SERIALIZE_LINE(f, settings, resolution, "%d");
> >  	SERIALIZE_LINE(f, settings, test_root, "%s");
> >  	SERIALIZE_LINE(f, settings, results_path, "%s");
> >  	SERIALIZE_LINE(f, settings, enable_code_coverage, "%d");
> > @@ -886,6 +931,7 @@ bool read_settings_from_file(struct settings *settings, FILE *f)
> >  	char *name = NULL, *val = NULL;
> >  
> >  	settings->dmesg_warn_level = -1;
> > +	settings->resolution = 0;
> 
> If a zero val is the default, you don't need to set it here
> explicitly. Anything calling this function has called init_settings
> which memsets the whole object to 0.
> 
> 
> 
> I'll look into this in more detail next week. I need to form an actual
> opinion on a few subjects, such as whether this is needed in runner at
> all (one can set environment variables when executing and let runner
> just pass them through, it doesn't clean the environment), whether
> --resolution is a good name for the switch, and whether I want a more
> generic environment storing/handling in the runner instead now or
> later.

Alright, my opinion is that it's better to have a generic --env flag
on igt_runner instead. It's useful to have the support for making sure
other env vars also get correctly set on resumes, notably IGT_DEVICE.

In short, we need --environment=key=value, and also --environment=key
(gets the var from the current environment, stores the
value). Repeated flags store more values.

If you don't have the bandwidth to work on that change yourself, I
suppose Ryszard might be able to pick this up. Ryszard, what do you
think?


-- 
Petri Latvala


More information about the igt-dev mailing list