/* * Copyright 2013, Michael Ellerman, IBM Corp. * Licensed under GPLv2. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "subunit.h" #include "utils.h" #define KILL_TIMEOUT 5 static uint64_t timeout = 120; int run_test(int (test_function)(void), char *name) { bool terminated; int rc, status; pid_t pid; /* Make sure output is flushed before forking */ fflush(stdout); pid = fork(); if (pid == 0) { setpgid(0, 0); exit(test_function()); } else if (pid == -1) { perror("fork"); return 1; } setpgid(pid, pid); /* Wake us up in timeout seconds */ alarm(timeout); terminated = false; wait: rc = waitpid(pid, &status, 0); if (rc == -1) { if (errno != EINTR) { printf("unknown error from waitpid\n"); return 1; } if (terminated) { printf("!! force killing %s\n", name); kill(-pid, SIGKILL); return 1; } else { printf("!! killing %s\n", name); kill(-pid, SIGTERM); terminated = true; alarm(KILL_TIMEOUT); goto wait; } } /* Kill anything else in the process group that is still running */ kill(-pid, SIGTERM); if (WIFEXITED(status)) status = WEXITSTATUS(status); else { if (WIFSIGNALED(status)) printf("!! child died by signal %d\n", WTERMSIG(status)); else printf("!! child died by unknown cause\n"); status = 1; /* Signal or other */ } return status; } static void alarm_handler(int signum) { /* Jut wake us up from waitpid */ } static struct sigaction alarm_action = { .sa_handler = alarm_handler, }; void test_harness_set_timeout(uint64_t time) { timeout = time; } int test_harness(int (test_function)(void), char *name) { int rc; test_start(name); test_set_git_version(GIT_VERSION); if (sigaction(SIGALRM, &alarm_action, NULL)) { perror("sigaction"); test_error(name); return 1; } rc = run_test(test_function, name); if (rc == MAGIC_SKIP_RETURN_VALUE) test_skip(name); else test_finish(name, rc); return rc; }
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2017-01-30 11:26:38 +0100
committerJiri Kosina <jkosina@suse.cz>2017-01-31 12:59:32 +0100
commit7a7b5df84b6b4e5d599c7289526eed96541a0654 (patch)
treecf7514c7ddf4410fe37ca9099a2785e1cf08fa7d /include/xen/interface/nmi.h
parent877a021e08ccb6434718c0cc781fdf943c884cc0 (diff)
HID: cp2112: fix sleep-while-atomic
A recent commit fixing DMA-buffers on stack added a shared transfer buffer protected by a spinlock. This is broken as the USB HID request callbacks can sleep. Fix this up by replacing the spinlock with a mutex. Fixes: 1ffb3c40ffb5 ("HID: cp2112: make transfer buffers DMA capable") Cc: stable <stable@vger.kernel.org> # 4.9 Signed-off-by: Johan Hovold <johan@kernel.org> Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'include/xen/interface/nmi.h')