mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-10 01:16:18 +00:00
igt/gem_evict_(alignment|everything): contend with GPU hangs
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
ce79b7aa80
commit
a315476a6b
@ -53,6 +53,7 @@
|
|||||||
#include "intel_chipset.h"
|
#include "intel_chipset.h"
|
||||||
#include "igt_aux.h"
|
#include "igt_aux.h"
|
||||||
#include "igt_debugfs.h"
|
#include "igt_debugfs.h"
|
||||||
|
#include "igt_gt.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "intel_reg.h"
|
#include "intel_reg.h"
|
||||||
#include "ioctl_wrappers.h"
|
#include "ioctl_wrappers.h"
|
||||||
@ -131,6 +132,74 @@ void igt_stop_signal_helper(void)
|
|||||||
sig_stat = 0;
|
sig_stat = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* GPU abusers */
|
||||||
|
static struct igt_helper_process hang_helper;
|
||||||
|
static void __attribute__((noreturn))
|
||||||
|
hang_helper_process(pid_t pid, int fd, int gen)
|
||||||
|
{
|
||||||
|
while (1) {
|
||||||
|
if (kill(pid, 0)) /* Parent has died, so must we. */
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
igt_post_hang_ring(fd,
|
||||||
|
igt_hang_ring(fd, gen, I915_EXEC_DEFAULT));
|
||||||
|
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* igt_fork_hang_helper:
|
||||||
|
*
|
||||||
|
* Fork a child process using #igt_fork_helper to hang the default engine
|
||||||
|
* of the GPU at regular intervals.
|
||||||
|
*
|
||||||
|
* This is useful to exercise slow running code (such as aperture placement)
|
||||||
|
* which needs to be robust against a GPU reset.
|
||||||
|
*
|
||||||
|
* In tests with subtests this function can be called outside of failure
|
||||||
|
* catching code blocks like #igt_fixture or #igt_subtest.
|
||||||
|
*/
|
||||||
|
int igt_fork_hang_helper(void)
|
||||||
|
{
|
||||||
|
int fd, gen;
|
||||||
|
|
||||||
|
if (igt_only_list_subtests())
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
fd = drm_open_any();
|
||||||
|
if (fd == -1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
gen = intel_gen(intel_get_drm_devid(fd));
|
||||||
|
if (gen < 5) {
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
igt_fork_helper(&hang_helper)
|
||||||
|
hang_helper_process(getppid(), fd, gen);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* igt_stop_hang_helper:
|
||||||
|
*
|
||||||
|
* Stops the child process spawned with igt_fork_hang_helper().
|
||||||
|
*
|
||||||
|
* In tests with subtests this function can be called outside of failure
|
||||||
|
* catching code blocks like #igt_fixture or #igt_subtest.
|
||||||
|
*/
|
||||||
|
void igt_stop_hang_helper(void)
|
||||||
|
{
|
||||||
|
if (igt_only_list_subtests())
|
||||||
|
return;
|
||||||
|
|
||||||
|
igt_stop_helper(&hang_helper);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* igt_check_boolean_env_var:
|
* igt_check_boolean_env_var:
|
||||||
* @env_var: environment variable name
|
* @env_var: environment variable name
|
||||||
|
@ -38,6 +38,10 @@ extern int num_trash_bos;
|
|||||||
/* generally useful helpers */
|
/* generally useful helpers */
|
||||||
void igt_fork_signal_helper(void);
|
void igt_fork_signal_helper(void);
|
||||||
void igt_stop_signal_helper(void);
|
void igt_stop_signal_helper(void);
|
||||||
|
|
||||||
|
int igt_fork_hang_helper(void);
|
||||||
|
void igt_stop_hang_helper(void);
|
||||||
|
|
||||||
void igt_exchange_int(void *array, unsigned i, unsigned j);
|
void igt_exchange_int(void *array, unsigned i, unsigned j);
|
||||||
void igt_permute_array(void *array, unsigned size,
|
void igt_permute_array(void *array, unsigned size,
|
||||||
void (*exchange_func)(void *array,
|
void (*exchange_func)(void *array,
|
||||||
|
@ -222,6 +222,21 @@ igt_main
|
|||||||
count = 4;
|
count = 4;
|
||||||
major_evictions(fd, size, count);
|
major_evictions(fd, size, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (igt_fork_hang_helper()) {
|
||||||
|
igt_subtest("minor-hang") {
|
||||||
|
size = 1024 * 1024;
|
||||||
|
count = 3*gem_aperture_size(fd) / size / 4;
|
||||||
|
minor_evictions(fd, size, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
igt_subtest("major-hang") {
|
||||||
|
size = 3*gem_aperture_size(fd) / 4;
|
||||||
|
count = 4;
|
||||||
|
major_evictions(fd, size, count);
|
||||||
|
}
|
||||||
|
igt_stop_hang_helper();
|
||||||
|
}
|
||||||
igt_stop_signal_helper();
|
igt_stop_signal_helper();
|
||||||
|
|
||||||
igt_fixture
|
igt_fixture
|
||||||
|
@ -235,6 +235,21 @@ igt_main
|
|||||||
test_major_evictions(fd, size, count);
|
test_major_evictions(fd, size, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (igt_fork_hang_helper()) {
|
||||||
|
igt_subtest("swapping-hang")
|
||||||
|
test_swapping_evictions(fd, size, count);
|
||||||
|
|
||||||
|
igt_subtest("minor-hang")
|
||||||
|
test_minor_evictions(fd, size, count);
|
||||||
|
|
||||||
|
igt_subtest("major-hang") {
|
||||||
|
size = 3*gem_aperture_size(fd) / 4;
|
||||||
|
count = 4;
|
||||||
|
test_major_evictions(fd, size, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
igt_stop_hang_helper();
|
||||||
|
}
|
||||||
igt_stop_signal_helper();
|
igt_stop_signal_helper();
|
||||||
|
|
||||||
igt_fixture {
|
igt_fixture {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user