From patchwork Tue Mar 6 12:43:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tvrtko Ursulin X-Patchwork-Id: 10261587 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 1A70D602C8 for ; Tue, 6 Mar 2018 12:43:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0ADFA28A57 for ; Tue, 6 Mar 2018 12:43:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F3EA028E43; Tue, 6 Mar 2018 12:43:41 +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 4D90128A57 for ; Tue, 6 Mar 2018 12:43:41 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 595AD6E6B2; Tue, 6 Mar 2018 12:43:40 +0000 (UTC) X-Original-To: Intel-gfx@lists.freedesktop.org Delivered-To: Intel-gfx@lists.freedesktop.org Received: from mail-wm0-x234.google.com (mail-wm0-x234.google.com [IPv6:2a00:1450:400c:c09::234]) by gabe.freedesktop.org (Postfix) with ESMTPS id 006936E6B9 for ; Tue, 6 Mar 2018 12:43:35 +0000 (UTC) Received: by mail-wm0-x234.google.com with SMTP id h21so22456200wmd.1 for ; Tue, 06 Mar 2018 04:43:35 -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:in-reply-to:references; bh=mwG7Px+m/ul6ra0tC6jJRexjxh6yEjfOWjxzw+/2ar0=; b=DzcT9xZB610BNhVi4bOGlrkQiTq32pDZkc7TqEABdya0dWPnLWRiMyYNW4IYeCTZgG 4JRYeua+/kP1LrNWsim1kzxDROQNuUjqNB7Pl/PKyrlfsXLQkw3bqsvNJuPwg0wPUJZH 0NkUQzLxpg6U4TZSoRwunrqugfKEDzMb4KcN2OjNQjWt2R7L0FWTTM+7id/Yn4XTDAHI CyWpDajAZhvUQvXRnmKgQ4sFvocvibHVjCfa75Wb/gVHMPeMp3/+OrUKUfsY7JfSJSOx dDUXp/CI58B67I3HCeMhMeaHhGZs0XvkBAsBjlTKqtGjBn1Wx4rKNrWvxef8HTNdI+ZJ WB4w== 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=mwG7Px+m/ul6ra0tC6jJRexjxh6yEjfOWjxzw+/2ar0=; b=mpNkpH4z4NWMnthxsDpsMu/27rawqvGpshERTqAuJ8F8Fm+7aiDK8RKPmRAmBPVK8c 7lwq2LbpmQPIBZkCeqVHCorgOIsw/1F93bCWceeACyc+uiOav7qRMUlauRDJPhrSV27Z Ent0tGci1zJpiN0qPyWEXq4WMkXHr4W/+ubzoH8KBv8t0LZvxz3SxmxGlG+dvKt76KWD ELv0BxkSVDK3lPVCvxssTDvw+081Wm5t65asNdtZSVuRZNdZ05+jeQfxanlPaDpsxSq4 lcrD+se/bK5onDrQldNxewUIo2DjdhnQHU6p3FPoUvxtnYH6JKNr6XJjZGjOsgK4HBRE GcdA== X-Gm-Message-State: AElRT7GmKIehD6q6mcYYlYYOzbiQjaYw9ntDgb0bMztvLaXSA9e0NhsB jYjXfvR3hlLdJkvNOg2bMDsdJA== X-Google-Smtp-Source: AG47ELt4mCSQl4IkEiVp8f1aHKQgJxdqGDqSH/VYt5r1092W+3Vo/MMu0UWUbuTVJCG7c8xquNx2ww== X-Received: by 10.28.159.68 with SMTP id i65mr12017096wme.27.1520340214569; Tue, 06 Mar 2018 04:43:34 -0800 (PST) Received: from localhost.localdomain ([95.146.144.186]) by smtp.gmail.com with ESMTPSA id v8sm3646560wmh.25.2018.03.06.04.43.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 06 Mar 2018 04:43:34 -0800 (PST) From: Tvrtko Ursulin X-Google-Original-From: Tvrtko Ursulin To: igt-dev@lists.freedesktop.org Date: Tue, 6 Mar 2018 12:43:15 +0000 Message-Id: <20180306124315.30208-12-tvrtko.ursulin@linux.intel.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180306124315.30208-1-tvrtko.ursulin@linux.intel.com> References: <20180306124315.30208-1-tvrtko.ursulin@linux.intel.com> Subject: [Intel-gfx] [PATCH i-g-t 11/11] 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 4d1da98daa0d..de02bb1018f2 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);