diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-12-01 21:49:43 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-12-01 21:49:43 +0000 |
commit | 7a06e13ba1e3b2ac79699e835fde9652eac6f71f (patch) | |
tree | 37e2657c7efa25b883efcdb2af3a8ad3646ea68f | |
parent | f4361523cb35b95417eda3a0957d312127204c34 (diff) |
lib/igt_kmod: Adopt igt_kselftests()
Extract the automagic kselftest runner from tests/drm_mm.c to the new
lib/igt_kmod.c
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | lib/igt_kmod.c | 95 | ||||
-rw-r--r-- | lib/igt_kmod.h | 1 | ||||
-rw-r--r-- | tests/drm_mm.c | 97 |
3 files changed, 97 insertions, 96 deletions
diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c index 9fb66919..6f0a5910 100644 --- a/lib/igt_kmod.c +++ b/lib/igt_kmod.c @@ -326,3 +326,98 @@ igt_i915_driver_unload(void) return IGT_EXIT_SUCCESS; } + +static void squelch(void *data, int priority, + const char *file, int line, const char *fn, + const char *format, va_list args) +{ +} + +static void kmsg_dump(int fd) +{ + FILE *file; + + file = NULL; + if (fd != -1) + file = fdopen(fd, "r"); + if (file) { + size_t len = 0; + char *line = NULL; + + while (getline(&line, &len, file) != -1) { + char *start = strchr(line, ':'); + if (start) + igt_warn("%s", start + 2); + } + + free(line); + fclose(file); + } else { + igt_warn("Unable to retrieve kernel log (from /dev/kmsg)\n"); + } +} + +void igt_kselftests(const char *module_name) +{ + struct kmod_ctx *ctx; + struct kmod_module *kmod; + struct kmod_list *d, *pre; + int err, kmsg = -1; + + ctx = kmod_new(NULL, NULL); + igt_assert(ctx != NULL); + + kmod_set_log_fn(ctx, squelch, NULL); + + igt_require(kmod_module_new_from_name(ctx, module_name, &kmod) == 0); + igt_fixture { + err = kmod_module_remove_module(kmod, KMOD_REMOVE_FORCE); + igt_require(err == 0 || err == -ENOENT); + + kmsg = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); + } + + pre = NULL; + if (kmod_module_get_info(kmod, &pre)) { + kmod_list_foreach(d, pre) { + const char *key, *val; + char *option, *colon; + + key = kmod_module_info_get_key(d); + if (strcmp(key, "parmtype")) + continue; + + val = kmod_module_info_get_value(d); + if (!val || strncmp(val, "subtest__", 9)) + continue; + + option = strdup(val); + colon = strchr(option, ':'); + *colon = '\0'; + + igt_subtest_f("%s", option + 9) { + lseek(kmsg, 0, SEEK_END); + strcpy(colon, "=1"); + + err = 0; + if (kmod_module_insert_module(kmod, 0, option)) + err = -errno; + kmod_module_remove_module(kmod, 0); + if (err) + kmsg_dump(kmsg); + + errno = 0; + igt_assert_f(err == 0, + "kselftest \"%s %s\" failed: %s [%d]\n", + module_name, option, + strerror(-err), -err); + } + } + kmod_module_info_free_list(pre); + } + + igt_fixture { + close(kmsg); + kmod_module_remove_module(kmod, KMOD_REMOVE_FORCE); + } +} diff --git a/lib/igt_kmod.h b/lib/igt_kmod.h index dcf8f67a..44b47c84 100644 --- a/lib/igt_kmod.h +++ b/lib/igt_kmod.h @@ -35,5 +35,6 @@ int igt_kmod_unload(const char *mod_name, unsigned int flags); int igt_i915_driver_load(const char *opts); int igt_i915_driver_unload(void); +void igt_kselftests(const char *module_name); #endif /* IGT_KMOD_H */ diff --git a/tests/drm_mm.c b/tests/drm_mm.c index b95fcb34..dbd0cc28 100644 --- a/tests/drm_mm.c +++ b/tests/drm_mm.c @@ -22,105 +22,10 @@ */ #include "igt.h" -#include <libkmod.h> +#include "igt_kmod.h" IGT_TEST_DESCRIPTION("Basic sanity check of DRM's range manager (struct drm_mm)"); -static void squelch(void *data, int priority, - const char *file, int line, const char *fn, - const char *format, va_list args) -{ -} - -static void kmsg_dump(int fd) -{ - FILE *file; - - file = NULL; - if (fd != -1) - file = fdopen(fd, "r"); - if (file) { - size_t len = 0; - char *line = NULL; - - while (getline(&line, &len, file) != -1) { - char *start = strchr(line, ':'); - if (start) - igt_warn("%s", start + 2); - } - - free(line); - fclose(file); - } else { - igt_warn("Unable to retrieve kernel log (from /dev/kmsg)\n"); - } -} - -static void igt_kselftests(const char *module_name) -{ - struct kmod_ctx *ctx; - struct kmod_module *kmod; - struct kmod_list *d, *pre; - int err, kmsg = -1; - - ctx = kmod_new(NULL, NULL); - igt_assert(ctx != NULL); - - kmod_set_log_fn(ctx, squelch, NULL); - - igt_require(kmod_module_new_from_name(ctx, module_name, &kmod) == 0); - igt_fixture { - err = kmod_module_remove_module(kmod, KMOD_REMOVE_FORCE); - igt_require(err == 0 || err == -ENOENT); - - kmsg = open("/dev/kmsg", O_RDONLY | O_NONBLOCK); - } - - pre = NULL; - if (kmod_module_get_info(kmod, &pre)) { - kmod_list_foreach(d, pre) { - const char *key, *val; - char *option, *colon; - - key = kmod_module_info_get_key(d); - if (strcmp(key, "parmtype")) - continue; - - val = kmod_module_info_get_value(d); - if (!val || strncmp(val, "subtest__", 9)) - continue; - - option = strdup(val); - colon = strchr(option, ':'); - *colon = '\0'; - - igt_subtest_f("%s", option + 9) { - lseek(kmsg, 0, SEEK_END); - strcpy(colon, "=1"); - - err = 0; - if (kmod_module_insert_module(kmod, 0, option)) - err = -errno; - kmod_module_remove_module(kmod, 0); - if (err) - kmsg_dump(kmsg); - - errno = 0; - igt_assert_f(err == 0, - "kselftest \"%s %s\" failed: %s [%d]\n", - module_name, option, - strerror(-err), -err); - } - } - kmod_module_info_free_list(pre); - } - - igt_fixture { - close(kmsg); - kmod_module_remove_module(kmod, KMOD_REMOVE_FORCE); - } -} - igt_main { igt_kselftests("test-drm_mm"); |