From patchwork Wed Aug 30 13:05:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Katarzyna Dec X-Patchwork-Id: 9929577 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 2618B60380 for ; Wed, 30 Aug 2017 13:05:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 10BB92856B for ; Wed, 30 Aug 2017 13:05:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 05A132856F; Wed, 30 Aug 2017 13:05:44 +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.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED 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 653572856B for ; Wed, 30 Aug 2017 13:05:43 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E2EE589C8F; Wed, 30 Aug 2017 13:05:42 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id A869C89C8F for ; Wed, 30 Aug 2017 13:05:42 +0000 (UTC) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Aug 2017 06:05:42 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,448,1498546800"; d="scan'208";a="895521840" Received: from kdec5-desk.igk.intel.com ([172.28.171.39]) by FMSMGA003.fm.intel.com with ESMTP; 30 Aug 2017 06:05:31 -0700 From: Katarzyna Dec To: intel-gfx@lists.freedesktop.org Date: Wed, 30 Aug 2017 15:05:09 +0200 Message-Id: <20170830130509.17309-1-katarzyna.dec@intel.com> X-Mailer: git-send-email 2.13.4 In-Reply-To: <20170829085745.2944-1-katarzyna.dec@intel.com> References: <20170829085745.2944-1-katarzyna.dec@intel.com> Subject: [Intel-gfx] [PATCH i-g-t v6] pm_rps: Changes in waitboost scenario X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP CI is observing sporadical failures in pm_rps subtests. There are a couple of reasons. One of them is the fact that on gen6, gen7 and gen7.5, max frequency (as in the HW limit) is not set to RP0, but the value obtaind from PCODE (which may be different from RP0). Thus the test is operating under wrong assumptions (SOFTMAX == RP0 == BOOST which is simply not the case). Let's compare current frequency with BOOST frequency rather than SOFTMAX to get the test behaviour under control. In boost_freq function I set MAX freq to midium freqency, which ensures that we for sure reach BOOST frequency. This could help with failures with boost frequency failing to drop down. GPU reset needs to be modified so we are not dependent on kernel's low priority retire worker. Reset method was replaced by igt_force_gpu_reset() and in reset testcase we make sure that we can recover from hang. v2: Commit message, simplified waiting for boost to finish, drop noisy whitespace cleanup. v3: Removed reading from i915_rps_boost_info debugfs because it not the same on every kernel. Removed function waiting for boost. Instead of that I made sure we will reach in boost by setting MAX freq to fmid. v4: Moved proposal with making test drm master to other patch v5: Used igt_force_gpu_reset() to reset GPU. Modified "reset" testcase. v6: Comments changes and update. Cc: Chris Wilson Cc: Jeff Mcgee Cc: Petri Latvala Cc: Jani Saarinen Cc: Radoslaw Szwichtenberg Reviewed-by: Radoslaw Szwichtenberg Acked-by: Daniel Vetter Signed-off-by: Katarzyna Dec --- tests/pm_rps.c | 67 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/tests/pm_rps.c b/tests/pm_rps.c index f0455e78..f821c210 100644 --- a/tests/pm_rps.c +++ b/tests/pm_rps.c @@ -50,6 +50,7 @@ enum { RP0, RP1, RPn, + BOOST, NUMFREQ }; @@ -60,7 +61,7 @@ struct junk { const char *mode; FILE *filp; } stuff[] = { - { "cur", "r", NULL }, { "min", "rb+", NULL }, { "max", "rb+", NULL }, { "RP0", "r", NULL }, { "RP1", "r", NULL }, { "RPn", "r", NULL }, { NULL, NULL, NULL } + { "cur", "r", NULL }, { "min", "rb+", NULL }, { "max", "rb+", NULL }, { "RP0", "r", NULL }, { "RP1", "r", NULL }, { "RPn", "r", NULL }, { "boost", "rb+", NULL }, { NULL, NULL, NULL } }; static int readval(FILE *filp) @@ -167,7 +168,7 @@ static void dump(const int *freqs) } enum load { - LOW, + LOW = 0, HIGH }; @@ -185,9 +186,10 @@ static struct load_helper { static void load_helper_signal_handler(int sig) { - if (sig == SIGUSR2) - lh.load = lh.load == LOW ? HIGH : LOW; - else + if (sig == SIGUSR2) { + lh.load = !lh.load; + igt_debug("Switching background load to %s\n", lh.load ? "high" : "low"); + } else lh.exit = true; } @@ -238,6 +240,7 @@ static void load_helper_run(enum load load) return; } + lh.exit = false; lh.load = load; igt_fork_helper(&lh.igt_proc) { @@ -263,6 +266,8 @@ static void load_helper_run(enum load load) if (intel_gen(lh.devid) >= 6) execbuf.flags = I915_EXEC_BLT; + igt_debug("Applying %s load...\n", lh.load ? "high" : "low"); + while (!lh.exit) { memset(&object, 0, sizeof(object)); object.handle = fences[val%3]; @@ -296,6 +301,12 @@ static void load_helper_run(enum load load) gem_close(drm_fd, fences[0]); gem_close(drm_fd, fences[1]); gem_close(drm_fd, fences[2]); + + /* Idle/boost logic is tide with request requirement. + * Speed up detection of idle state and ensure deboost + * after removing load. + */ + igt_drop_caches_set(drm_fd, DROP_RETIRE); } } @@ -553,38 +564,43 @@ static void stabilize_check(int *out) igt_debug("Waited %d msec to stabilize cur\n", wait); } -static void reset_gpu(void) -{ - int fd = drm_open_driver(DRIVER_INTEL); - igt_post_hang_ring(fd, igt_hang_ring(fd, I915_EXEC_DEFAULT)); - close(fd); -} - static void boost_freq(int fd, int *boost_freqs) { int64_t timeout = 1; - int ring = -1; igt_spin_t *load; + unsigned int engine; + int fmid = (origfreqs[RPn] + origfreqs[RP0]) / 2; - load = igt_spin_batch_new(fd, ring, 0); + fmid = get_hw_rounded_freq(fmid); + /* set max freq to less then boost freq */ + writeval(stuff[MAX].filp, fmid); + /* put boost on the same engine as low load */ + engine = I915_EXEC_RENDER; + if (intel_gen(lh.devid) >= 6) + engine = I915_EXEC_BLT; + load = igt_spin_batch_new(fd, engine, 0); /* Waiting will grant us a boost to maximum */ gem_wait(fd, load->handle, &timeout); read_freqs(boost_freqs); dump(boost_freqs); + /* Avoid downlocking till boost request is pending */ + igt_spin_batch_end(load); + gem_sync(fd, load->handle); igt_spin_batch_free(fd, load); + + /* set max freq to original softmax */ + writeval(stuff[MAX].filp, origfreqs[MAX]); } -static void waitboost(bool reset) +static void waitboost(int fd, bool reset) { int pre_freqs[NUMFREQ]; int boost_freqs[NUMFREQ]; int post_freqs[NUMFREQ]; - int fd = drm_open_driver(DRIVER_INTEL); - load_helper_run(LOW); igt_debug("Apply low load...\n"); @@ -593,7 +609,7 @@ static void waitboost(bool reset) if (reset) { igt_debug("Reset gpu...\n"); - reset_gpu(); + igt_force_gpu_reset(fd); sleep(1); } @@ -611,10 +627,9 @@ static void waitboost(bool reset) idle_check(); igt_assert_lt(pre_freqs[CUR], pre_freqs[MAX]); - igt_assert_eq(boost_freqs[CUR], boost_freqs[MAX]); + igt_assert_eq(boost_freqs[CUR], boost_freqs[BOOST]); igt_assert_lt(post_freqs[CUR], post_freqs[MAX]); - close(fd); } static void pm_rps_exit_handler(int sig) @@ -657,7 +672,7 @@ igt_main val = readval(junk->filp); igt_assert(val >= 0); junk++; - } while(junk->name != NULL); + } while (junk->name != NULL); read_freqs(origfreqs); @@ -679,9 +694,11 @@ igt_main } igt_subtest("waitboost") - waitboost(false); - - igt_subtest("reset") - waitboost(true); + waitboost(drm_fd, false); + igt_subtest("reset") { + igt_hang_t hang = igt_allow_hang(drm_fd, 0, 0); + waitboost(drm_fd, true); + igt_disallow_hang(drm_fd, hang); + } }