From patchwork Fri Feb 23 11:34:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tvrtko Ursulin X-Patchwork-Id: 10237457 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 9AC9960209 for ; Fri, 23 Feb 2018 11:35:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 89D2D29524 for ; Fri, 23 Feb 2018 11:35:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7DF9A29533; Fri, 23 Feb 2018 11:35:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C5B1329524 for ; Fri, 23 Feb 2018 11:35:07 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6AB716F0BB; Fri, 23 Feb 2018 11:35:06 +0000 (UTC) X-Original-To: Intel-gfx@lists.freedesktop.org Delivered-To: Intel-gfx@lists.freedesktop.org Received: from mail-wm0-x244.google.com (mail-wm0-x244.google.com [IPv6:2a00:1450:400c:c09::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id A907B6F0BB for ; Fri, 23 Feb 2018 11:35:03 +0000 (UTC) Received: by mail-wm0-x244.google.com with SMTP id k87so4087232wmi.0 for ; Fri, 23 Feb 2018 03:35:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ursulin-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=xsgiuakh1H+PWA2z++AOOJm4iz7JqEVikLtFTeMVFGA=; b=nicApGNU+JdV/MJM25zm5joHSpml5NNMf4R6O9I14MYcJB83lpUGsSs64PWifyVTmH A7Kw+hXFePNpKtVOsWhAyteGVn7CdTsPo4pnNXCmR70ThG5JyKavqps6ENiSAdLVsA8Z gTu0nWs4fsyDrD97Hm7rqE6KNtK0I9obdkI5yIS4VGTx0cwfwjJSFw5hZVt+p4eOqixO wBLZenp96w50wchWES1wVaoOecnKuRqmLPhKiEYZCGu5scDlrhFw4ABlR0p2cbsQheB+ zQIzqLEpnwHoIeYvDcly+hio4YRW30cGZmupVeUH3SHOHVe2Kd0SC3Iplqs+3NQpAPXN Lyeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=xsgiuakh1H+PWA2z++AOOJm4iz7JqEVikLtFTeMVFGA=; b=T69cbmGuXZVwv6nA+4lGB9i7AsQJO9Ewg8CoWmcr0MgC6d+3oujh9LvCLDHolS2tJh YulJQYwoh4ri7+Ig/Zqu5L7hFvdSu1km8X/rNkKQFgjtpbvQOZx7ct+6PrVUQ++kj6fv o0JeVDUUNMxFf4t9mSQhDRDZdsIWV6rrc9aso9FIPWpzCaM2yAnp43NiNqcd8rMQj0Op H7I/P7rYsUjo5BLssQgjcWiLw8InqFeRdcfqHXdT96SKpsdrfAkasonox03Gz9JlfsCM OBXYcBiGNv2JMaA9hkgks1ESmQ70fNTatu6ogl1CT8tRg8I+xZ5pSYOg3AmlsSz7PrkV 8UXA== X-Gm-Message-State: APf1xPDOn/fTGFM80ad2d511iOn624GRl2uOt5BGksKCpabeTCthXOwJ xSME3mKfUl0wJHkRD+cb6vqyRA== X-Google-Smtp-Source: AG47ELtjS0Wkvp7ADOGRAhS1aARuHveaGpG6egJVFfVnWcaXFgbMleWBlyPoDPwxRmqYshkOvWFnGw== X-Received: by 10.28.23.205 with SMTP id 196mr1374537wmx.132.1519385702142; Fri, 23 Feb 2018 03:35:02 -0800 (PST) Received: from localhost.localdomain ([95.146.144.186]) by smtp.gmail.com with ESMTPSA id u79sm1503602wma.10.2018.02.23.03.35.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 23 Feb 2018 03:35:01 -0800 (PST) From: Tvrtko Ursulin X-Google-Original-From: Tvrtko Ursulin To: igt-dev@lists.freedesktop.org Date: Fri, 23 Feb 2018 11:34:53 +0000 Message-Id: <20180223113453.5473-1-tvrtko.ursulin@linux.intel.com> X-Mailer: git-send-email 2.14.1 MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH i-g-t] tests/perf_pmu: Handle CPU hotplug failures better X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Intel-gfx@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP From: Chris Wilson CPU hotplug, especially CPU0, can be flaky on commodity hardware. To improve test reliability and reponse times when testing larger runs we need to handle those cases better. Handle failures to off-line a CPU by immediately skipping the test, and failures to on-line a CPU by immediately rebooting the machine. This patch includes igt_sysrq_reboot implementation from Chris Wilson. Signed-off-by: Tvrtko Ursulin Cc: Chris Wilson --- lib/Makefile.sources | 2 ++ lib/igt_sysrq.c | 22 ++++++++++++++++++++++ lib/igt_sysrq.h | 30 ++++++++++++++++++++++++++++++ lib/meson.build | 2 ++ tests/perf_pmu.c | 42 ++++++++++++++++++++++++++++++++++-------- 5 files changed, 90 insertions(+), 8 deletions(-) create mode 100644 lib/igt_sysrq.c create mode 100644 lib/igt_sysrq.h diff --git a/lib/Makefile.sources b/lib/Makefile.sources index 5b13ef8896c0..3d37ef1d1984 100644 --- a/lib/Makefile.sources +++ b/lib/Makefile.sources @@ -35,6 +35,8 @@ lib_source_list = \ igt_stats.h \ igt_sysfs.c \ igt_sysfs.h \ + igt_sysrq.c \ + igt_sysrq.h \ igt_x86.h \ igt_x86.c \ igt_vgem.c \ diff --git a/lib/igt_sysrq.c b/lib/igt_sysrq.c new file mode 100644 index 000000000000..fe3d2e344ff1 --- /dev/null +++ b/lib/igt_sysrq.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +#include "igt_core.h" + +#include "igt_sysrq.h" + +void igt_sysrq_reboot(void) +{ + sync(); + + /* Try to be nice at first, and if that fails pull the trigger */ + if (reboot(RB_AUTOBOOT)) { + int fd = open("/proc/sysrq-trigger", O_WRONLY); + igt_ignore_warn(write(fd, "b", 2)); + close(fd); + } + + abort(); +} diff --git a/lib/igt_sysrq.h b/lib/igt_sysrq.h new file mode 100644 index 000000000000..422473d2a480 --- /dev/null +++ b/lib/igt_sysrq.h @@ -0,0 +1,30 @@ +/* + * Copyright © 2018 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + */ + +#ifndef __IGT_SYSRQ_H__ +#define __IGT_SYSRQ_H__ + +void igt_sysrq_reboot(void) __attribute__((noreturn)); + +#endif /* __IGT_SYSRQ_H__ */ diff --git a/lib/meson.build b/lib/meson.build index 8f14f6320ecf..63afd3ddb535 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -22,6 +22,7 @@ lib_headers = [ 'igt_stats.h', 'igt_syncobj.h', 'igt_sysfs.h', + 'igt_sysrq.h', 'igt_x86.h', 'igt_vgem.h', 'instdone.h', @@ -69,6 +70,7 @@ lib_sources = [ 'igt_stats.c', 'igt_syncobj.c', 'igt_sysfs.c', + 'igt_sysrq.c', 'igt_vgem.c', 'igt_x86.c', 'instdone.c', diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c index 3bbb18d2f216..658d0976137f 100644 --- a/tests/perf_pmu.c +++ b/tests/perf_pmu.c @@ -41,6 +41,7 @@ #include "igt_core.h" #include "igt_perf.h" #include "igt_sysfs.h" +#include "igt_sysrq.h" #include "igt_pm.h" #include "sw_sync.h" @@ -965,6 +966,7 @@ static void cpu_hotplug(int gem_fd) int link[2]; int fd, ret; int cur = 0; + char buf; igt_skip_on(IS_BROXTON(intel_get_drm_devid(gem_fd))); igt_require(cpu0_hotplug_support()); @@ -994,7 +996,7 @@ static void cpu_hotplug(int gem_fd) for (;;) { char name[128]; - int cpufd; + int cpufd, ret; igt_assert_lt(snprintf(name, sizeof(name), "/sys/devices/system/cpu/cpu%d/online", @@ -1011,9 +1013,33 @@ static void cpu_hotplug(int gem_fd) } /* Offline followed by online a CPU. */ - igt_assert_eq(write(cpufd, "0", 2), 2); + + ret = write(cpufd, "0", 2); + if (ret < 0) { + /* + * If we failed to offline a CPU we don't want + * to proceed. + */ + igt_warn("Failed to offline cpu%u! (%d)\n", + cpu, errno); + igt_assert_eq(write(link[1], "s", 1), 1); + break; + } + usleep(1e6); - igt_assert_eq(write(cpufd, "1", 2), 2); + + ret = write(cpufd, "1", 2); + if (ret < 0) { + /* + * Failed to bring a CPU back online is fatal + * for the sanity of a test run so reboot + * immediately. + */ + igt_warn("Failed to online cpu%u! (%d)\n", + cpu, errno); + igt_sysrq_reboot(); + igt_assert(0); + } close(cpufd); cpu++; @@ -1027,15 +1053,12 @@ static void cpu_hotplug(int gem_fd) * until the CPU core shuffler finishes one loop. */ for (;;) { - char buf; - int ret2; - usleep(500e3); end_spin(gem_fd, spin[cur], 0); /* Check if the child is signaling completion. */ - ret2 = read(link[0], &buf, 1); - if ( ret2 == 1 || (ret2 < 0 && errno != EAGAIN)) + ret = read(link[0], &buf, 1); + if ( ret == 1 || (ret < 0 && errno != EAGAIN)) break; igt_spin_batch_free(gem_fd, spin[cur]); @@ -1054,6 +1077,9 @@ static void cpu_hotplug(int gem_fd) close(fd); close(link[0]); + /* Skip if child signals a problem with offlining a CPU. */ + igt_skip_on(buf == 's'); + assert_within_epsilon(val, ts[1] - ts[0], tolerance); }