From patchwork Wed May 9 15:32:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tvrtko Ursulin X-Patchwork-Id: 10389797 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 7481060170 for ; Wed, 9 May 2018 15:33:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5FD9720121 for ; Wed, 9 May 2018 15:33:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5D381205AB; Wed, 9 May 2018 15:33:35 +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 EA78020121 for ; Wed, 9 May 2018 15:33:09 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1476C6E8ED; Wed, 9 May 2018 15:33:09 +0000 (UTC) X-Original-To: Intel-gfx@lists.freedesktop.org Delivered-To: Intel-gfx@lists.freedesktop.org Received: from mail-wr0-x22f.google.com (mail-wr0-x22f.google.com [IPv6:2a00:1450:400c:c0c::22f]) by gabe.freedesktop.org (Postfix) with ESMTPS id A99D36E8D5 for ; Wed, 9 May 2018 15:33:06 +0000 (UTC) Received: by mail-wr0-x22f.google.com with SMTP id v15-v6so36013745wrm.10 for ; Wed, 09 May 2018 08:33:06 -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=d5DES2olBXNqVMzw9IZq0pkFysqfhWknCJ41+Wfqno8=; b=QKoPQK+BC2d/hOCrILh58apugG/+DhA3P+18bdbV6cyfF+xKQrRNvoU09s9YDKXIv2 u4tRxOggjdmOFHfRaNUVzO1GtTeDWwBZeMN0s6/Fql48lE0d8OFNPD2CkcIJWv911Z8I cTHFczP4YqP0ksm0236Akmmaj8ExA6EwyY1D34UC/pvTIXx7AI8oQgerH/QyxbeFEEBK KqoUVdNdwgx9rQu5vfkx89DPPDJ4jw5s0rVPaLoy5ANfrj4ypA1rcI595SVZelPekZpC r7DcXefo1lb2rDWtlhHXSZmYmsOWPMfS9Hs7fYK2pRHQyHbT7Aw/plQBGXLFJh8ydlm3 JW4w== 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=d5DES2olBXNqVMzw9IZq0pkFysqfhWknCJ41+Wfqno8=; b=boPEaSH6gYitGnew9DYybHqzIUdq+0CCM++mEk+3WSRHh5rDe0p7X1YSk1Rzr2DDWl qBAZ0O/PX8S+D0E7erSNK4zBSgPh6q0xISBvdkwudiMXNM41UMu/uVyWaGQ4kLnqd/pV mfpiAGywRoqc2p2wOKPGQjEGCBdt3pk8fGKv6dG1g2hxvzanCI3sVd/CraFSYj4MGzai UlK88COE430HEBxwaHO0FyFY0wkPPaqsZ0Y6QbpzOqTeJKFTAKEOQorzncnE0Q683R6u rGXk3/+0Wd7n0CJRzlpczUppqM6X8K6d20ghSMWLYXbF2lLtXbyDz9iJcGH4uU9rp1Go 48Zw== X-Gm-Message-State: ALQs6tC/bdm4TLnbrRxuQueqmI857br3lJ10KGE/9ws5j8QRwE3iA1k1 OBAdX821mZ3l7IjCZtdLEALVvA== X-Google-Smtp-Source: AB8JxZo1a+1VMmvSriGhR2CildFys1JAaMjjHhxaeW23Vmu9+qvouLFcvpP/YJNc6o6MU9WG0pB1tg== X-Received: by 2002:adf:b3d7:: with SMTP id x23-v6mr29393756wrd.142.1525879985190; Wed, 09 May 2018 08:33:05 -0700 (PDT) Received: from localhost.localdomain ([95.146.151.144]) by smtp.gmail.com with ESMTPSA id y9-v6sm27614432wrh.63.2018.05.09.08.33.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 09 May 2018 08:33:04 -0700 (PDT) From: Tvrtko Ursulin X-Google-Original-From: Tvrtko Ursulin To: igt-dev@lists.freedesktop.org Date: Wed, 9 May 2018 16:32:39 +0100 Message-Id: <20180509153239.18449-1-tvrtko.ursulin@linux.intel.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180508173115.24550-7-tvrtko.ursulin@linux.intel.com> References: <20180508173115.24550-7-tvrtko.ursulin@linux.intel.com> Subject: [Intel-gfx] [PATCH i-g-t v4 7/7] 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. v3: * Refactor for less list walking as with incomplete handling. v4: * Database of context timelines should not contain duplicates! (Converted from array into a hash.) Signed-off-by: Tvrtko Ursulin Cc: John Harrison --- scripts/trace.pl | 126 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 98 insertions(+), 28 deletions(-) diff --git a/scripts/trace.pl b/scripts/trace.pl index 935f57117a37..936e4fe6b885 100755 --- a/scripts/trace.pl +++ b/scripts/trace.pl @@ -27,7 +27,7 @@ use warnings; use 5.010; my $gid = 0; -my (%db, %queue, %submit, %notify, %rings, %ctxdb, %ringmap, %reqwait); +my (%db, %queue, %submit, %notify, %rings, %ctxdb, %ringmap, %reqwait, %ctxtimelines); my @freqs; my $max_items = 3000; @@ -435,6 +435,7 @@ while (<>) { $req{'ring'} = $ring; $req{'seqno'} = $seqno; $req{'ctx'} = $ctx; + $ctxtimelines{$ctx . '/' . $ring} = 1; $req{'name'} = $ctx . '/' . $seqno; $req{'global'} = $tp{'global'}; $req{'port'} = $tp{'port'}; @@ -589,41 +590,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; + + 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) { + # Shift !port0 requests start time to after the previous context on the + # same timeline has finished. + foreach my $gid (sort keys %rings) { + my $ring = $ringmap{$rings{$gid}}; + my $timeline = get_engine_timeline($ring); + my $complete; + + foreach my $pos (0..$#{$timeline}) { + my $key = @{$timeline}[$pos]; + my $prev = $complete; + my $pkey; + + $complete = $key unless exists $db{$key}->{'no-end'}; + $pkey = $complete; + + next if $db{$key}->{'port'} == 0; + + $pkey = $prev if $complete eq $key; + + die unless defined $pkey; + + $db{$key}->{'start'} = $db{$pkey}->{'end'}; + $db{$key}->{'start'} = $db{$pkey}->{'notify'} if $db{$key}->{'start'} > $db{$key}->{'end'}; + + die if $db{$key}->{'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 end + # time of a following request on this timeline. + foreach my $tkey (sort keys %ctxtimelines) { + my ($ctx, $ring) = split '/', $tkey; + my $timeline = get_ctx_timeline($ctx, $ring, $tkey); + my $last_complete = -1; + my $complete; + + foreach my $pos (0..$#{$timeline}) { + my $key = @{$timeline}[$pos]; + my $next_key; + + next unless exists $db{$key}->{'no-end'}; + last if $pos == $#{$timeline}; - # correct duration of merged batches - if ($correct_durations and exists $db{$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'}; + # Shift following request to start after the current one + $next_key = ${$timeline}[$pos + 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);