[Intel-gfx] [PATCH i-g-t 2/3] tests/drv_module_reload_basic: Convert sh script to C version.

Marius Vlad marius.c.vlad at intel.com
Mon Oct 24 18:05:28 UTC 2016


On Thu, Oct 20, 2016 at 08:52:23PM +0100, Chris Wilson wrote:
> On Thu, Oct 20, 2016 at 10:36:48PM +0300, Marius Vlad wrote:
> > +static const char *tests[] = {
> > +	"gem_alive", "gem_exec_store"
> > +};
> 
> gem_alive is just a single ioctl query, simpler and move obvious to do
> it inline. Then remove tests/gem_alive.c, but it may live on as
> tools/gem_alive.c (or better yet tools/gem_info.c).
> 
> gem_exec_store is a couple of ioctls...
Initially I tried embeddeding them directly. Problem is the at exit drm
fd handler:

if (is_i915_device(fd)) {
	if (__sync_fetch_and_add(&open_count, 1) == 0) {
		gem_quiescent_gpu(fd);

		at_exit_drm_fd = __drm_open_driver(chipset); <-- leaked until igt_exit, at_exit(), exit.
		igt_install_exit_handler(quiescent_gpu_at_exit);
	}
}

A drm_open_driver() w/o that opened fd allows reloading the driver after
running those basic tests/subtests.

> 
> A rewritten C test should not be i915 specific if we can help it. The
> core of it can be driver agnostic (same steps required to unbind from
> console and reload after all).
> 
> > +
> > +static int
> > +reload(const char *opts_i915)
> > +{
> > +	kick_fbcon(0);
> > +
> > +	if (opts_i915)
> > +		igt_info("Reloading i915 with %s\n\n", opts_i915);
> > +
> > +	if (igt_lsmod_has_module("snd_hda_intel")) {
> > +		if (igt_pkill(SIGTERM, "alsactl") == -1) {
> > +			return IGT_EXIT_FAILURE;
> > +		}
> > +		if (igt_rmmod("snd_hda_intel", false) == -1)
> > +			return IGT_EXIT_FAILURE;
> > +	}
> > +
> > +	/* gen5 */
> > +	if (igt_lsmod_has_module("intel_ips")) {
> > +		igt_rmmod("intel_ips", false);
> > +	}
> > +
> > +	if (igt_rmmod("i915", false) == -1) {
> > +		return IGT_EXIT_SKIP;
> > +	}
> 
> Ugh. These names leave much to be desired.
> 
> igt_kmod_load()
> igt_kmod_unload()
> igt_kmod_is_loaded() (can return refcnt >= 0 and -1 for unloaded)
> 
> > +
> > +	igt_info("i915.ko has been unloaded!\n");
> > +
> > +	if (igt_lsmod_has_module("intel-gtt")) {
> > +		igt_rmmod("intel-gtt", false);
> > +	}
> > +
> > +	igt_rmmod("drm_kms_helper", false);
> > +	igt_rmmod("drm", false);
> > +
> > +	if (igt_lsmod_has_module("i915")) {
> > +		igt_info("WARNING: i915.ko still loaded!\n");
> > +		return IGT_EXIT_FAILURE;
> > +	} else {
> > +		igt_info("module successfully unloaded\n");
> > +	}
> > +
> > +	/* we do not have automatic loading of dependencies */
> > +	igt_insmod("drm", NULL);
> > +	igt_insmod("drm_kms_helper", NULL);
> > +
> > +	if (igt_insmod("i915", opts_i915) == -1) {
> > +		igt_info("Could not load i915\n");
> > +		return IGT_EXIT_FAILURE;
> > +	}
> > +
> > +	kick_fbcon(1);
> > +
> > +	if (igt_insmod("snd_hda_intel", NULL) == -1)
> > +		return IGT_EXIT_FAILURE;
> > +
> > +	return IGT_EXIT_SUCCESS;
> > +}
> > +
> > +static void
> > +igt_execv(char **argv)
> > +{
> > +	igt_fork(child, 1) {
> > +		if (execv(argv[0], argv) < 0) {
> > +			igt_info("Failed to exec %s\n",
> > +					argv[0]);
> > +			exit(IGT_EXIT_FAILURE);
> > +		}
> > +	}
> > +	igt_waitchildren();
> > +}
> > +
> > +static void
> > +finish_load(char *dirname)
> > +{
> > +	char buf[PATH_MAX];
> > +	char *__argv[2] = { buf, NULL };
> > +
> > +	memset(buf, 0, PATH_MAX);
> > +	snprintf(buf, sizeof(buf), "%s/%s", dirname, tests[0]);
> > +
> > +	igt_execv(__argv);
> > +
> > +	memset(buf, 0, sizeof(buf));
> > +	snprintf(buf, sizeof(buf), "%s/%s", dirname, tests[1]);
> > +
> > +	igt_execv(__argv);
> > +}
> > +
> > +int main(int argc, char *argv[])
> 
> igt_main
> {
> 
> -- 
> Chris Wilson, Intel Open Source Technology Centre
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 455 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gfx/attachments/20161024/e6428210/attachment.sig>


More information about the Intel-gfx mailing list