From patchwork Mon Apr 23 09:52:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tvrtko Ursulin X-Patchwork-Id: 10356531 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 5C2C460225 for ; Mon, 23 Apr 2018 09:53:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4C88028A03 for ; Mon, 23 Apr 2018 09:53:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 411F228A09; Mon, 23 Apr 2018 09:53:21 +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=-5.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,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 89E9828A03 for ; Mon, 23 Apr 2018 09:53:20 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 4CE426E1A7; Mon, 23 Apr 2018 09:53:19 +0000 (UTC) X-Original-To: Intel-gfx@lists.freedesktop.org Delivered-To: Intel-gfx@lists.freedesktop.org Received: from mail-wr0-x235.google.com (mail-wr0-x235.google.com [IPv6:2a00:1450:400c:c0c::235]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7FC806E193 for ; Mon, 23 Apr 2018 09:53:10 +0000 (UTC) Received: by mail-wr0-x235.google.com with SMTP id v60-v6so39418169wrc.7 for ; Mon, 23 Apr 2018 02:53:10 -0700 (PDT) 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:in-reply-to:references; bh=qLZot030UlFFE6Arm61gEHFVmIlHm6tQO2HOomHTTgU=; b=Qvsn5+LGRs13LShs+iXXgVC29GzeHVBFWY2J5b6rFSkUxTBirrjzLzawNyMwwxxh/O sE7pwhkqV8/Hu8AsQOxoEKbt+/dyMy2gLfW2xUPQJx49ERuYhgybRugzAOq9MUOzEB60 ejGO4TgTkZ0sbGx9tIDosqmuim4loNhuutP/qZpAFRhQ1YNvCoRAM/Yo6z8p+frDXAKB RYUPbz0JhBHh7DjCEE1eAJKdNSZavzWEaUg3Cq0cc2GjURA9zHSFcl9RX3ynPRAsL40q 21lOLrzGqqX2MQMPl3ukmPar5Zexx2l7B18aU7fPc3riVWyIdcBPjVr0Je47ctQnlllf fSaQ== 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:in-reply-to :references; bh=qLZot030UlFFE6Arm61gEHFVmIlHm6tQO2HOomHTTgU=; b=WrtR/h2D5oK97QfueCFtVHPC5EkbmwWZK/R6eJkDwcNMny7Ytb0t8o23jmvTgd4Uuz a1q4px8OBwwRIX/6R9N03kn5L1G/GIO+9A91ZADklrL8hLbK72foCTXXc9Yw7xEGbstd +q0IM4fMmvnj3Tv4IGDgJN9c27FlasrXAAsu+N6zmoe2Iyefco9HUcGYISk9OsFCuDNY YBgszvY0isktQmQfnXeKbVcvGboN70bx2ZAcNmiMWujmO57W+lsUXEkVkhdf6q+ts2H1 XqAAkKbUMYyr+uirR4oysOUSdcF4q9amNeIZDybKVMEXV+fB8abRzqjJFmj6O+1BzBOT HAEQ== X-Gm-Message-State: ALQs6tC1H8sJbyZ1L/8b+0E514s/An7gnHssykNKgdnrWq97v0CEkoUa b5y+heTMhofnxdjLjlaWAOlRlA== X-Google-Smtp-Source: AIpwx4+Apnl88oA/LFipvZzHraaAanyYF2GnOJ5y01/pCx6gnzAC4KfwfwP5y6KJCQF9aZXt+grVUg== X-Received: by 10.28.111.136 with SMTP id c8mr7751701wmi.9.1524477189128; Mon, 23 Apr 2018 02:53:09 -0700 (PDT) Received: from localhost.localdomain ([95.146.151.144]) by smtp.gmail.com with ESMTPSA id j76sm20918590wmf.33.2018.04.23.02.53.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 23 Apr 2018 02:53:08 -0700 (PDT) From: Tvrtko Ursulin X-Google-Original-From: Tvrtko Ursulin To: igt-dev@lists.freedesktop.org Date: Mon, 23 Apr 2018 10:52:38 +0100 Message-Id: <20180423095238.29238-5-tvrtko.ursulin@linux.intel.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180423095238.29238-1-tvrtko.ursulin@linux.intel.com> References: <20180423095238.29238-1-tvrtko.ursulin@linux.intel.com> Subject: [Intel-gfx] [PATCH i-g-t 4/4] trace.pl: Fix request split mode 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 MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP From: Tvrtko Ursulin Request split mode had several bugs, both in the original version and also after the recent refactorings. One big one was that it wasn't considering different submit ports as a reason to split execution, and also that it was too time based instead of looking at relevant timelines. In this refactoring we address the former by using the engine timelines introduced in the previous patch. Secondary port submissions are moved to follow the preceding submission as a first step in the correction process. In the second step, we add context timelines and use then in a similar fashion to separate start and end time of coalesced requests. For each coalesced request we know its boundaries by looking at the engine timeline (via global seqnos), and we know the previous request it should only start after, by looking at the context timeline. v2: * Remove some dead code. * Fix !port0 shifting logic. Signed-off-by: Tvrtko Ursulin Cc: John Harrison --- scripts/trace.pl | 121 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 95 insertions(+), 26 deletions(-) diff --git a/scripts/trace.pl b/scripts/trace.pl index b48f43225fc1..88aa667df2d4 100755 --- a/scripts/trace.pl +++ b/scripts/trace.pl @@ -601,41 +601,110 @@ sub sortStart { return $val; } -my @sorted_keys = sort sortStart keys %db; -my $re_sort = 0; +my $re_sort = 1; +my @sorted_keys; -die "Database changed size?!" unless scalar(@sorted_keys) == $key_count; +sub maybe_sort_keys +{ + if ($re_sort) { + @sorted_keys = sort sortStart keys %db; + $re_sort = 0; + die "Database changed size?!" unless scalar(@sorted_keys) == + $key_count; + } +} -foreach my $key (@sorted_keys) { - my $ring = $db{$key}->{'ring'}; - my $end = $db{$key}->{'end'}; +maybe_sort_keys(); + +my %ctx_timelines; + +sub sortContext { + my $as = $db{$a}->{'seqno'}; + my $bs = $db{$b}->{'seqno'}; + my $val; + + $val = $as <=> $bs; + + die if $val == 0; + + return $val; +} + +sub get_ctx_timeline { + my ($ctx, $ring, $key) = @_; + my @timeline; - # correct duration of merged batches - if ($correct_durations and exists $db{$key}->{'no-end'}) { + return $ctx_timelines{$key} if exists $ctx_timelines{$key}; + + @timeline = grep { $db{$_}->{'ring'} == $ring and + $db{$_}->{'ctx'} == $ctx } @sorted_keys; + # FIXME seqno restart + @timeline = sort sortContext @timeline; + + $ctx_timelines{$key} = \@timeline; + + return \@timeline; +} + +# Split out merged batches if requested. +if ($correct_durations) { + my @port1; + my @no_end; + + # Shift !port0 requests start time to after the previous context on the + # same timeline has finished. + @port1 = grep { $db{$_}->{'port'} != 0 } @sorted_keys; + foreach my $key (@port1) { + my $timeline = get_engine_timeline($db{$key}->{'ring'}); + my $i = List::Util::first { ${$timeline}[$_] eq $key } 0..$#{$timeline}; + my $prev_key; + my $start; + + while ($i > 0) { + my $prev; + + $i = $i - 1; + $prev = ${$timeline}[$i]; + + next if exists $db{$prev}->{'no-end'}; + + $prev_key = $prev; + last; + } + + $start = $db{$prev_key}->{'end'}; + $db{$key}->{'start'} = $start; + die if $start > $db{$key}->{'end'}; + + $re_sort = 1; + } + + maybe_sort_keys(); + + # Batch with no-end (no request_out) means it was submitted as part of + # colaesced context. This means it's start time should be set to the end + # time of a precedeing request on this timeline. + @no_end = grep { exists $db{$_}->{'no-end'} } @sorted_keys; + foreach my $key (@no_end) { my $ctx = $db{$key}->{'ctx'}; - my $seqno = $db{$key}->{'seqno'}; - my $start = $db{$key}->{'start'}; - my $next_key; - my $i = 1; - - do { - $next_key = db_key($ring, $ctx, $seqno + $i); - $i++; - } until (exists $db{$next_key} or $i > $key_count); # ugly stop hack - - # 20us tolerance - if (exists $db{$next_key} and $db{$next_key}->{'start'} < $start + 20) { - my $notify = $db{$key}->{'notify'}; + my $ring = $db{$key}->{'ring'}; + my $tkey = $ctx . '/' . $ring; + my $timeline = get_ctx_timeline($ctx, $ring, $tkey); + my $i; + + $i = List::Util::first { ${$timeline}[$_] eq $key } 0..$#{$timeline}; + + # Shift following request to start after the current one. + if ($i < $#{$timeline}) { + my $next_key = ${$timeline}[$i + 1]; + + $db{$next_key}->{'start'} = $db{$key}->{'notify'}; $re_sort = 1; - $db{$next_key}->{'start'} = $notify; - $db{$next_key}->{'start'} = $db{$next_key}->{'end'} if $db{$next_key}->{'start'} > $db{$next_key}->{'end'}; - die if $db{$next_key}->{'start'} > $db{$next_key}->{'end'}; } - die if $start > $end; } } -@sorted_keys = sort sortStart keys %db if $re_sort; +maybe_sort_keys(); # GPU time accounting my (%running, %runnable, %queued, %batch_avg, %batch_total_avg, %batch_count);