[igt-dev] [PATCH i-g-t] [RFC] Add support to force specific module load
Petri Latvala
petri.latvala at intel.com
Wed Jun 13 13:05:39 UTC 2018
On Tue, May 29, 2018 at 09:45:20PM -0300, Rodrigo Siqueira wrote:
> This patch adds a new option to force the use of a module specified from
> the command line. The force command expects a module name which will be
> used on the target test (changing the standard behavior). This feature
> can be useful for developers that have to create a new module since it
> is possible to use some of the tests already provided by IGT (e.g.,
> kms_color, core, etc.) as a start point. Additionally, it can
> also be useful for someone that wants to implement a new set of tests
> for a specific driver because the developer can first check the behavior
> of any test in the target module. It is important to highlight, that a
> force option can produce unexpected results and developers should be
> aware of that.
Is this meant for testing replacement drivers for hardware with
already existing drivers? If not, I'm not sure what the goal is here.
Setting a forced module target in this patch changes which module is
loaded by the kernel, but the driver that's opened by IGT is
unchanged. Force-loading my-fancy-driver.ko still makes
drm_open_driver(DRIVER_INTEL) open the one driven by i915.ko, and
drm_open_driver(DRIVER_ANY) still opens the first one that is
recognized.
If this is for testing new drivers for not-already-supported devices,
you need to instead force what drm_open_driver(DRIVER_ANY) will open,
and not reject unknown devices.
Some additional drive-by feedback below.
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index fae6f86f..1d2ba178 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -258,6 +258,7 @@ static int __open_device(const char *base, int offset, unsigned int chipset)
> static int __open_driver(const char *base, int offset, unsigned int chipset)
> {
> static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
> + const char* target;
> static const struct module {
> unsigned int bit;
> const char *module;
> @@ -276,13 +277,19 @@ static int __open_driver(const char *base, int offset, unsigned int chipset)
> if (fd != -1)
> return fd;
>
> + target = get_target_module();
> +
> pthread_mutex_lock(&mutex);
> - for (const struct module *m = modules; m->module; m++) {
> - if (chipset & m->bit) {
> - if (m->modprobe)
> - m->modprobe(m->module);
> - else
> - modprobe(m->module);
> + if (target) {
> + modprobe(target);
> + } else {
> + for (const struct module *m = modules; m->module; m++) {
> + if (chipset & m->bit) {
> + if (m->modprobe)
> + m->modprobe(m->module);
> + else
> + modprobe(m->module);
> + }
> }
> }
> pthread_mutex_unlock(&mutex);
> diff --git a/lib/igt_core.c b/lib/igt_core.c
> index 5092a3f0..ed66eae1 100644
> --- a/lib/igt_core.c
> +++ b/lib/igt_core.c
> @@ -286,6 +286,7 @@ enum {
> OPT_DESCRIPTION,
> OPT_DEBUG,
> OPT_INTERACTIVE_DEBUG,
> + OPT_FORCE_MODULE,
> OPT_HELP = 'h'
> };
>
> @@ -303,6 +304,20 @@ static pthread_mutex_t log_buffer_mutex = PTHREAD_MUTEX_INITIALIZER;
> GKeyFile *igt_key_file;
> #endif
>
> +char *target_module;
> +
> +void set_target_module(char *target)
> +{
> + if (!target)
> + igt_warn("No module specified, keep default behaviour");
> + target_module = target;
> +}
> +
> +const char *get_target_module(void)
> +{
> + return target_module;
> +}
> +
> char *igt_frame_dump_path;
>
> const char *igt_test_name(void)
> @@ -555,6 +570,7 @@ static void print_usage(const char *help_str, bool output_on_stderr)
> " --debug[=log-domain]\n"
> " --interactive-debug[=domain]\n"
> " --help-description\n"
> + " --force-module <module>\n"
> " --help\n");
> if (help_str)
> fprintf(f, "%s\n", help_str);
> @@ -666,6 +682,7 @@ static int common_init(int *argc, char **argv,
> {"debug", optional_argument, 0, OPT_DEBUG},
> {"interactive-debug", optional_argument, 0, OPT_INTERACTIVE_DEBUG},
> {"help", 0, 0, OPT_HELP},
> + {"force-module", required_argument, 0, OPT_FORCE_MODULE},
> {0, 0, 0, 0}
> };
> char *short_opts;
> @@ -763,6 +780,9 @@ static int common_init(int *argc, char **argv,
> print_test_description();
> ret = -1;
> goto out;
> + case OPT_FORCE_MODULE:
> + set_target_module(strdup(optarg));
> + break;
> case OPT_HELP:
> print_usage(help_str, false);
> ret = -1;
> diff --git a/lib/igt_core.h b/lib/igt_core.h
> index bf8cd66c..6d635ebd 100644
> --- a/lib/igt_core.h
> +++ b/lib/igt_core.h
> @@ -50,6 +50,10 @@ extern const char* __igt_test_description __attribute__((weak));
> extern bool __igt_plain_output;
> extern char *igt_frame_dump_path;
>
> +extern char *target_module;
> +void set_target_module(char *target);
> +const char *get_target_module(void);
> +
> /**
> * IGT_TEST_DESCRIPTION:
> * @str: description string
> diff --git a/scripts/run-tests.sh b/scripts/run-tests.sh
> index 4209dd8c..c810a8dd 100755
> --- a/scripts/run-tests.sh
> +++ b/scripts/run-tests.sh
> @@ -80,6 +80,7 @@ function print_help {
> echo " (can be used more than once)"
> echo " -T <filename> run tests listed in testlist"
> echo " (overrides -t and -x)"
> + echo " -m <module> force load a specific module"
> echo " -v enable verbose mode"
> echo " -x <regex> exclude tests that match the regular expression"
> echo " (can be used more than once)"
> @@ -91,7 +92,7 @@ function print_help {
> echo "Useful patterns for test filtering are described in the API documentation."
> }
>
> -while getopts ":dhlr:st:T:vx:Rn" opt; do
> +while getopts ":dhlr:st:T:m:vx:Rn" opt; do
> case $opt in
> d) download_piglit; exit ;;
> h) print_help; exit ;;
> @@ -100,6 +101,7 @@ while getopts ":dhlr:st:T:vx:Rn" opt; do
> s) SUMMARY="html" ;;
> t) FILTER="$FILTER -t $OPTARG" ;;
> T) FILTER="$FILTER --test-list $OPTARG" ;;
> + m) FILTER="$FILTER -m $OPTARG" ;;
This will change what is passed to _piglit_ command line, not the test
command line. Above, you added --force-module long option, but didn't
add the -m short option, so this wouldn't do anything anyway.
Consider if passing the force option through the environment would be
easier instead.
--
Petri Latvala
More information about the igt-dev
mailing list