mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-09 00:46:17 +00:00
gem_stress: Add an option to test handling of signals
As signals cause the syscalls to be interrupted, we often need to clean up partial state before returning to userspace. Often a source of unamusing bugs, so encourage gem_stress to provoke them. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
8908055da6
commit
4227da8c3c
@ -51,6 +51,8 @@
|
|||||||
|
|
||||||
#include "gem_stress.h"
|
#include "gem_stress.h"
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#define CMD_POLY_STIPPLE_OFFSET 0x7906
|
#define CMD_POLY_STIPPLE_OFFSET 0x7906
|
||||||
|
|
||||||
/** TODO:
|
/** TODO:
|
||||||
@ -100,6 +102,29 @@ struct {
|
|||||||
unsigned max_failed_reads;
|
unsigned max_failed_reads;
|
||||||
} stats;
|
} stats;
|
||||||
|
|
||||||
|
static void signal_helper_process(pid_t pid)
|
||||||
|
{
|
||||||
|
/* Interrupt the parent process at 500Hz, just to be annoying */
|
||||||
|
while (1) {
|
||||||
|
usleep(1000 * 1000 / 500);
|
||||||
|
if (kill(pid, SIGUSR1)) /* Parent has died, so must we. */
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static pid_t fork_signal_helper(void)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
if (pid == 0) {
|
||||||
|
signal_helper_process(getppid());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
static void tile2xy(struct scratch_buf *buf, unsigned tile, unsigned *x, unsigned *y)
|
static void tile2xy(struct scratch_buf *buf, unsigned tile, unsigned *x, unsigned *y)
|
||||||
{
|
{
|
||||||
assert(tile < buf->num_tiles);
|
assert(tile < buf->num_tiles);
|
||||||
@ -651,6 +676,7 @@ static void parse_options(int argc, char **argv)
|
|||||||
{"no-hw", 0, 0, 'd'},
|
{"no-hw", 0, 0, 'd'},
|
||||||
{"buf-size", 1, 0, 's'},
|
{"buf-size", 1, 0, 's'},
|
||||||
{"gpu-busy-load", 1, 0, 'g'},
|
{"gpu-busy-load", 1, 0, 'g'},
|
||||||
|
{"no-signals", 0, 0, 'S'},
|
||||||
{"buffer-count", 1, 0, 'c'},
|
{"buffer-count", 1, 0, 'c'},
|
||||||
{"trace-tile", 1, 0, 't'},
|
{"trace-tile", 1, 0, 't'},
|
||||||
{"disable-blt", 0, 0, 'b'},
|
{"disable-blt", 0, 0, 'b'},
|
||||||
@ -671,6 +697,7 @@ static void parse_options(int argc, char **argv)
|
|||||||
|
|
||||||
options.scratch_buf_size = 256*4096;
|
options.scratch_buf_size = 256*4096;
|
||||||
options.no_hw = 0;
|
options.no_hw = 0;
|
||||||
|
options.use_signal_helper = 1;
|
||||||
options.gpu_busy_load = 0;
|
options.gpu_busy_load = 0;
|
||||||
options.num_buffers = 0;
|
options.num_buffers = 0;
|
||||||
options.trace_tile = -1;
|
options.trace_tile = -1;
|
||||||
@ -692,6 +719,10 @@ static void parse_options(int argc, char **argv)
|
|||||||
options.no_hw = 1;
|
options.no_hw = 1;
|
||||||
printf("no-hw debug mode\n");
|
printf("no-hw debug mode\n");
|
||||||
break;
|
break;
|
||||||
|
case 'S':
|
||||||
|
options.use_signal_helper = 0;
|
||||||
|
printf("disabling that pesky nuisance who keeps interrupting us\n");
|
||||||
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
tmp = atoi(optarg);
|
tmp = atoi(optarg);
|
||||||
if (tmp < options.tile_size*8192)
|
if (tmp < options.tile_size*8192)
|
||||||
@ -881,12 +912,18 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
unsigned *current_permutation, *tmp_permutation;
|
unsigned *current_permutation, *tmp_permutation;
|
||||||
|
pid_t signal_helper = -1;
|
||||||
|
|
||||||
drm_fd = drm_open_any();
|
drm_fd = drm_open_any();
|
||||||
devid = intel_get_drm_devid(drm_fd);
|
devid = intel_get_drm_devid(drm_fd);
|
||||||
|
|
||||||
parse_options(argc, argv);
|
parse_options(argc, argv);
|
||||||
|
|
||||||
|
/* start our little helper early before too may allocations occur */
|
||||||
|
signal(SIGUSR1, SIG_IGN);
|
||||||
|
if (options.use_signal_helper)
|
||||||
|
signal_helper = fork_signal_helper();
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
|
||||||
check_render_copyfunc();
|
check_render_copyfunc();
|
||||||
@ -935,5 +972,8 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
close(drm_fd);
|
close(drm_fd);
|
||||||
|
|
||||||
|
if (signal_helper != -1)
|
||||||
|
kill(signal_helper, SIGQUIT);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ struct option_struct {
|
|||||||
int ducttape;
|
int ducttape;
|
||||||
int tile_size;
|
int tile_size;
|
||||||
int check_render_cpyfn;
|
int check_render_cpyfn;
|
||||||
|
int use_signal_helper;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct option_struct options;
|
extern struct option_struct options;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user