/* * 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; } rf-buildid-cache.txt?id=566cf877a1fcb6d6dc0126b076aad062054c2637'>diff
text:
AgeCommit message (Expand)AuthorFilesLines
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2017-01-12 17:15:56 +0100
committerDaniel Vetter <daniel.vetter@ffwll.ch>2017-01-30 10:17:32 +0100
commite6e7b48b295afa5a5ab440de0a94d9ad8b3ce2d0 (patch)
tree77cadb6d8aad1b52c34e4afa8c9deef603bbe2ed /tools/perf/arch/x86/util/header.c
parent4e5b54f127426c82dc2816340c26d951a5bb3429 (diff)
drm: Don't race connector registration
I was under the misconception that the sysfs dev stuff can be fully set up, and then registered all in one step with device_add. That's true for properties and property groups, but not for parents and child devices. Those must be fully registered before you can register a child. Add a bit of tracking to make sure that asynchronous mst connector hotplugging gets this right. For consistency we rely upon the implicit barriers of the connector->mutex, which is taken anyway, to ensure that at least either the connector or device registration call will work out. Mildly tested since I can't reliably reproduce this on my mst box here. Reported-by: Dave Hansen <dave.hansen@intel.com> Cc: Dave Hansen <dave.hansen@intel.com> Acked-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1484237756-2720-1-git-send-email-daniel.vetter@ffwll.ch
Diffstat (limited to 'tools/perf/arch/x86/util/header.c')