From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CC63DC7EE23 for ; Sat, 27 May 2023 06:05:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231631AbjE0GFp (ORCPT ); Sat, 27 May 2023 02:05:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49254 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231582AbjE0GFn (ORCPT ); Sat, 27 May 2023 02:05:43 -0400 Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 61EAC189 for ; Fri, 26 May 2023 23:05:40 -0700 (PDT) Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-3f600a6a890so25575e9.0 for ; Fri, 26 May 2023 23:05:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1685167539; x=1687759539; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=h+VqRQExtTrH9S+FZIicKy2SoxXeKIv5Pl5YKkb8yOU=; b=0aX8fI0SmbVTXsAjji1whY6LJ8jtL5lF0rCQz0h+106ZDqNGnd+zznZFBoRES0Gavs 19AHNoWNmevaE1bGaGvFnOfqKtdKMDylrVGDzT02lgzOYNBsX/tCWC5cjd7UmfS9XW5/ m/d/zhxUaZTF5O/q/J3xsJMYglPWxfHm9lMbT5pfZf/MMwBL77VusnKCo4oGQYgXNml0 3HCAaPVnsA1d9lGFqtThfmAuQuPDGGa86NZcSG4KHBxXynESFjyyNj/h/bgrGKZPtjx7 REcfiMtIBLbN1+9L4goesoiVv4LagFQAfmCizxmij273EoGT/ceuXq2igv1A0nMijdIX kz1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685167539; x=1687759539; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=h+VqRQExtTrH9S+FZIicKy2SoxXeKIv5Pl5YKkb8yOU=; b=ZSBXzM1JCBEnq+DbnWS4htGoQmUhUpRoNc+9uHF4jufpDdUACHhOT2DHt35sKBJ8Ro Tdj+RfxKWGa60yx0mi+dmEumEirShHy4ECA1CdPrS1yNNyHpXvkN6+rTr+eNdRv3bcG7 ZQy7CNG/V9GZqpy1Meo6TTZO8VzC41EBWQmoeF/Mx0uhSig0nvKqVy9zN8xhvxdHbeQK TXm/Ra0FC8oyxFHb+YFuVoVmWJGTuuhkjgtCbXIsL3yiKKJi3SLgM+8dYElnxAZ1YKAf ELQTcFCiLySoMbk5lcg/CdtiUEa4wioWafHP4i87urPQxTozAhlk+8j0yhx4RtaQ7mfx FUsQ== X-Gm-Message-State: AC+VfDzTVPzAQM66zjVYjeGygfo7M4BjAUPtGyiKmKWc7XeU7vZzDJwB LY8rHfnYnifoDebyh+cAFX4cE31Id6t4La8NZ7ZbIg== X-Google-Smtp-Source: ACHHUZ6H+Busoinm6NiPQ0cJPOPkyYSQt0m+kJyVmjqmN3/IvUGJzwl1XDEwh9hZej5CuP36g4gCGAeED2POqCRVRTY= X-Received: by 2002:a1c:5408:0:b0:3f1:758c:dd23 with SMTP id i8-20020a1c5408000000b003f1758cdd23mr63579wmb.7.1685167538607; Fri, 26 May 2023 23:05:38 -0700 (PDT) MIME-Version: 1.0 References: <20230526215410.2435674-1-irogers@google.com> <20230526215410.2435674-4-irogers@google.com> In-Reply-To: From: Ian Rogers Date: Fri, 26 May 2023 23:05:25 -0700 Message-ID: Subject: Re: [PATCH v4 03/35] perf cpumap: Add equal function To: Arnaldo Carvalho de Melo Cc: Suzuki K Poulose , Mike Leach , Leo Yan , John Garry , Will Deacon , James Clark , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Adrian Hunter , Kajol Jain , Jing Zhang , Kan Liang , Zhengjun Xing , Ravi Bangoria , Madhavan Srinivasan , Athira Rajeev , Ming Wang , Huacai Chen , Sandipan Das , Dmitrii Dolgov <9erthalion6@gmail.com>, Sean Christopherson , Ali Saidi , Rob Herring , Thomas Richter , Kang Minchul , linux-kernel@vger.kernel.org, coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, linux-perf-users@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, May 26, 2023 at 6:40=E2=80=AFPM Arnaldo Carvalho de Melo wrote: > > Em Fri, May 26, 2023 at 10:32:12PM -0300, Arnaldo Carvalho de Melo escrev= eu: > > Em Fri, May 26, 2023 at 02:53:38PM -0700, Ian Rogers escreveu: > > > Equality is a useful property to compare after merging and > > > intersecting maps. > > > > > > Signed-off-by: Ian Rogers > > > Reviewed-by: Kan Liang > > > --- > > > tools/lib/perf/cpumap.c | 21 ++++++++++++++++ > > > tools/lib/perf/include/perf/cpumap.h | 2 ++ > > > tools/perf/tests/cpumap.c | 37 ++++++++++++++++++++++++++= ++ > > > 3 files changed, 60 insertions(+) > > > > > > diff --git a/tools/lib/perf/cpumap.c b/tools/lib/perf/cpumap.c > > > index d4f3a1a12522..48595a3ad69c 100644 > > > --- a/tools/lib/perf/cpumap.c > > > +++ b/tools/lib/perf/cpumap.c > > > @@ -321,6 +321,27 @@ bool perf_cpu_map__has(const struct perf_cpu_map= *cpus, struct perf_cpu cpu) > > > return perf_cpu_map__idx(cpus, cpu) !=3D -1; > > > } > > > > > > +bool perf_cpu_map__equal(const struct perf_cpu_map *lhs, const struc= t perf_cpu_map *rhs) > > > +{ > > > + int nr; > > > + > > > + if (lhs =3D=3D rhs) > > > + return true; > > > + > > > + if (!lhs || !rhs) > > > + return false; > > > + > > > + nr =3D perf_cpu_map__nr(lhs); > > > + if (nr !=3D perf_cpu_map__nr(rhs)) > > > + return false; > > > + > > > + for (int idx =3D 0; idx < nr; idx++) { > > > + if (RC_CHK_ACCESS(lhs)->map[idx].cpu !=3D RC_CHK_ACCESS(r= hs)->map[idx].cpu) > > > + return false; > > > > Don't we have an accessor to avoid this RC_CHK_ACCESS()-> access? > > In the following patch you use it: > > +bool perf_cpu_map__has_any_cpu(const struct perf_cpu_map *map) > +{ > + return map && perf_cpu_map__cpu(map, 0).cpu =3D=3D -1; > +} > > But it does extra checks you did already: > > struct perf_cpu perf_cpu_map__cpu(const struct perf_cpu_map *cpus, int id= x) > { > struct perf_cpu result =3D { > .cpu =3D -1 > }; > > if (cpus && idx < RC_CHK_ACCESS(cpus)->nr) > return RC_CHK_ACCESS(cpus)->map[idx]; > > return result; > } > > Usually we have: > > struct perf_cpu __perf_cpu_map__cpu(const struct perf_cpu_map *cpus, int = idx) > { > return RC_CHK_ACCESS(cpus)->map[idx]; > } > > struct perf_cpu perf_cpu_map__cpu(const struct perf_cpu_map *cpus, int id= x) > { > struct perf_cpu result =3D { > .cpu =3D -1 > }; > > if (cpus && idx < __perf_cpu_map__nr(cpus)) > return __perf_cpu_map__cpu(cpus, idx); > > return result; > } > > Then you would have: > > bool perf_cpu_map__equal(const struct perf_cpu_map *lhs, const struct per= f_cpu_map *rhs) > { > int nr; > > if (lhs =3D=3D rhs) > return true; > > if (!lhs || !rhs) > return false; > > nr =3D __perf_cpu_map__nr(lhs); // no need to check lhs again fo= r NULL > if (nr !=3D __perf_cpu_map__nr(rhs)) // ditto for rhs > return false; > > for (int idx =3D 0; idx < nr; idx++) { > if (__perf_cpu_map__cpu(lhs, idx)->cpu !=3D __perf_cpu_ma= p__cpu(rhs, idx)->cpu) > return false; > Thanks, I'll update for v5. Fwiw, on intersect, I keep forgetting to mention that this was sent previously as: https://lore.kernel.org/lkml/20220408035616.1356953-4-irogers@google.com/ Ian > > > + } > > > + return true; > > > +} > > > + > > > struct perf_cpu perf_cpu_map__max(const struct perf_cpu_map *map) > > > { > > > struct perf_cpu result =3D { > > > diff --git a/tools/lib/perf/include/perf/cpumap.h b/tools/lib/perf/in= clude/perf/cpumap.h > > > index 0466c4216fbb..d0ae9552f8e2 100644 > > > --- a/tools/lib/perf/include/perf/cpumap.h > > > +++ b/tools/lib/perf/include/perf/cpumap.h > > > @@ -28,6 +28,8 @@ LIBPERF_API int perf_cpu_map__nr(const struct perf_= cpu_map *cpus); > > > LIBPERF_API bool perf_cpu_map__empty(const struct perf_cpu_map *map)= ; > > > LIBPERF_API struct perf_cpu perf_cpu_map__max(const struct perf_cpu_= map *map); > > > LIBPERF_API bool perf_cpu_map__has(const struct perf_cpu_map *map, s= truct perf_cpu cpu); > > > +LIBPERF_API bool perf_cpu_map__equal(const struct perf_cpu_map *lhs, > > > + const struct perf_cpu_map *rhs); > > > > > > #define perf_cpu_map__for_each_cpu(cpu, idx, cpus) \ > > > for ((idx) =3D 0, (cpu) =3D perf_cpu_map__cpu(cpus, idx); \ > > > diff --git a/tools/perf/tests/cpumap.c b/tools/perf/tests/cpumap.c > > > index 83805690c209..7730fc2ab40b 100644 > > > --- a/tools/perf/tests/cpumap.c > > > +++ b/tools/perf/tests/cpumap.c > > > @@ -211,11 +211,48 @@ static int test__cpu_map_intersect(struct test_= suite *test __maybe_unused, > > > return ret; > > > } > > > > > > +static int test__cpu_map_equal(struct test_suite *test __maybe_unuse= d, int subtest __maybe_unused) > > > +{ > > > + struct perf_cpu_map *any =3D perf_cpu_map__dummy_new(); > > > + struct perf_cpu_map *one =3D perf_cpu_map__new("1"); > > > + struct perf_cpu_map *two =3D perf_cpu_map__new("2"); > > > + struct perf_cpu_map *empty =3D perf_cpu_map__intersect(one, two); > > > + struct perf_cpu_map *pair =3D perf_cpu_map__new("1-2"); > > > + struct perf_cpu_map *tmp; > > > + struct perf_cpu_map *maps[] =3D {empty, any, one, two, pair}; > > > + > > > + for (size_t i =3D 0; i < ARRAY_SIZE(maps); i++) { > > > + /* Maps equal themself. */ > > > + TEST_ASSERT_VAL("equal", perf_cpu_map__equal(maps[i], map= s[i])); > > > + for (size_t j =3D 0; j < ARRAY_SIZE(maps); j++) { > > > + /* Maps dont't equal each other. */ > > > + if (i =3D=3D j) > > > + continue; > > > + TEST_ASSERT_VAL("not equal", !perf_cpu_map__equal= (maps[i], maps[j])); > > > + } > > > + } > > > + > > > + /* Maps equal made maps. */ > > > + tmp =3D perf_cpu_map__merge(perf_cpu_map__get(one), two); > > > + TEST_ASSERT_VAL("pair", perf_cpu_map__equal(pair, tmp)); > > > + perf_cpu_map__put(tmp); > > > + > > > + tmp =3D perf_cpu_map__intersect(pair, one); > > > + TEST_ASSERT_VAL("one", perf_cpu_map__equal(one, tmp)); > > > + perf_cpu_map__put(tmp); > > > + > > > + for (size_t i =3D 0; i < ARRAY_SIZE(maps); i++) > > > + perf_cpu_map__put(maps[i]); > > > + > > > + return TEST_OK; > > > +} > > > + > > > static struct test_case tests__cpu_map[] =3D { > > > TEST_CASE("Synthesize cpu map", cpu_map_synthesize), > > > TEST_CASE("Print cpu map", cpu_map_print), > > > TEST_CASE("Merge cpu map", cpu_map_merge), > > > TEST_CASE("Intersect cpu map", cpu_map_intersect), > > > + TEST_CASE("Equal cpu map", cpu_map_equal), > > > { .name =3D NULL, } > > > }; > > > > > > -- > > > 2.41.0.rc0.172.g3f132b7071-goog > > > > > > > -- > > > > - Arnaldo > > -- > > - Arnaldo From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 84624C77B73 for ; Sat, 27 May 2023 06:06:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=b2+4OA4WgrhvHgXfjH7ibuqoQf3VBq27D2iUns3/ydo=; b=JnoAY5spJ0hVn5 smDkAYtkTK6BjsbNc70/Wl41RCifrZKXdhHy16nEofLbR4bP6WOSpWxg+ZkCA86ta/ve230VruS6L GfT/7ZVGxHaBKud7N9UJUchGJ7oGCjROgqWoqoKDS+wy9IIG6G9gCJG7sZ8/bb6xw2+ZZfTL2QXA/ jEeKAXfsFqjXA9tOpe7O3ZskqtX1PzP6zb0t6naVv557aZJ4WUmQKc0GZ8Gde7bHFXhYYFD5AB52F Rq6nuMU5iPvQwfMQijp5a6Tu0K9ZGcjAQtBBiWdjqY3OYbKcGi3ZcwvRw6YEdbL+hkEPFF58fNAAv t4exZXN0YmXJ7xjKr9eQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q2n3j-004zqi-0c; Sat, 27 May 2023 06:05:47 +0000 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1q2n3e-004zpO-1e for linux-arm-kernel@lists.infradead.org; Sat, 27 May 2023 06:05:44 +0000 Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-3f5dbd8f677so13065e9.1 for ; Fri, 26 May 2023 23:05:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1685167539; x=1687759539; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=h+VqRQExtTrH9S+FZIicKy2SoxXeKIv5Pl5YKkb8yOU=; b=0aX8fI0SmbVTXsAjji1whY6LJ8jtL5lF0rCQz0h+106ZDqNGnd+zznZFBoRES0Gavs 19AHNoWNmevaE1bGaGvFnOfqKtdKMDylrVGDzT02lgzOYNBsX/tCWC5cjd7UmfS9XW5/ m/d/zhxUaZTF5O/q/J3xsJMYglPWxfHm9lMbT5pfZf/MMwBL77VusnKCo4oGQYgXNml0 3HCAaPVnsA1d9lGFqtThfmAuQuPDGGa86NZcSG4KHBxXynESFjyyNj/h/bgrGKZPtjx7 REcfiMtIBLbN1+9L4goesoiVv4LagFQAfmCizxmij273EoGT/ceuXq2igv1A0nMijdIX kz1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685167539; x=1687759539; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=h+VqRQExtTrH9S+FZIicKy2SoxXeKIv5Pl5YKkb8yOU=; b=HyOVRN2ibUZ74TTvgDmx4+4OFiZh4C+NBy4ZdcXGGLjb6Wvqk3QtBD+1P2sm51X7g1 TtA9A31w4D3+0x4I8jsk20RuawxUxkFgaPS25QtGxT+S77ofq0XMpesoXEz5ZpUGi62t 7hmKdQ4CN0iLlEY/ffUFBnvrdya5xUkx8UYjgVuqL7I57qX4l25QuWYjasFhO8oZ1igt HEbjCHvA9E+GjL3+cMcudMMurd94SCguCB+WLUbEDnrNaiF8fxBdH4O2nsBNjN2iGljW lE3G2hO7zosijN2JbPwoBST0Fu7P+ZZkSPsyBitV4F9tFPC9xF4aqAYpLkUjuQOKQm1M 6O+A== X-Gm-Message-State: AC+VfDyV3tkTA1OgjAYi4OVQ7HFYZGfODSts9N4uk0P20xx6OoqCJ6u+ G28R5Dmk91H6GsFM0qHHBE3uFyYsMR0788OeXfS+nA== X-Google-Smtp-Source: ACHHUZ6H+Busoinm6NiPQ0cJPOPkyYSQt0m+kJyVmjqmN3/IvUGJzwl1XDEwh9hZej5CuP36g4gCGAeED2POqCRVRTY= X-Received: by 2002:a1c:5408:0:b0:3f1:758c:dd23 with SMTP id i8-20020a1c5408000000b003f1758cdd23mr63579wmb.7.1685167538607; Fri, 26 May 2023 23:05:38 -0700 (PDT) MIME-Version: 1.0 References: <20230526215410.2435674-1-irogers@google.com> <20230526215410.2435674-4-irogers@google.com> In-Reply-To: From: Ian Rogers Date: Fri, 26 May 2023 23:05:25 -0700 Message-ID: Subject: Re: [PATCH v4 03/35] perf cpumap: Add equal function To: Arnaldo Carvalho de Melo Cc: Suzuki K Poulose , Mike Leach , Leo Yan , John Garry , Will Deacon , James Clark , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Adrian Hunter , Kajol Jain , Jing Zhang , Kan Liang , Zhengjun Xing , Ravi Bangoria , Madhavan Srinivasan , Athira Rajeev , Ming Wang , Huacai Chen , Sandipan Das , Dmitrii Dolgov <9erthalion6@gmail.com>, Sean Christopherson , Ali Saidi , Rob Herring , Thomas Richter , Kang Minchul , linux-kernel@vger.kernel.org, coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, linux-perf-users@vger.kernel.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230526_230542_594015_553F9CD9 X-CRM114-Status: GOOD ( 29.17 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gRnJpLCBNYXkgMjYsIDIwMjMgYXQgNjo0MOKAr1BNIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVs bwo8YWNtZUBrZXJuZWwub3JnPiB3cm90ZToKPgo+IEVtIEZyaSwgTWF5IDI2LCAyMDIzIGF0IDEw OjMyOjEyUE0gLTAzMDAsIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyBlc2NyZXZldToKPiA+IEVt IEZyaSwgTWF5IDI2LCAyMDIzIGF0IDAyOjUzOjM4UE0gLTA3MDAsIElhbiBSb2dlcnMgZXNjcmV2 ZXU6Cj4gPiA+IEVxdWFsaXR5IGlzIGEgdXNlZnVsIHByb3BlcnR5IHRvIGNvbXBhcmUgYWZ0ZXIg bWVyZ2luZyBhbmQKPiA+ID4gaW50ZXJzZWN0aW5nIG1hcHMuCj4gPiA+Cj4gPiA+IFNpZ25lZC1v ZmYtYnk6IElhbiBSb2dlcnMgPGlyb2dlcnNAZ29vZ2xlLmNvbT4KPiA+ID4gUmV2aWV3ZWQtYnk6 IEthbiBMaWFuZyA8a2FuLmxpYW5nQGxpbnV4LmludGVsLmNvbT4KPiA+ID4gLS0tCj4gPiA+ICB0 b29scy9saWIvcGVyZi9jcHVtYXAuYyAgICAgICAgICAgICAgfCAyMSArKysrKysrKysrKysrKysr Cj4gPiA+ICB0b29scy9saWIvcGVyZi9pbmNsdWRlL3BlcmYvY3B1bWFwLmggfCAgMiArKwo+ID4g PiAgdG9vbHMvcGVyZi90ZXN0cy9jcHVtYXAuYyAgICAgICAgICAgIHwgMzcgKysrKysrKysrKysr KysrKysrKysrKysrKysrKwo+ID4gPiAgMyBmaWxlcyBjaGFuZ2VkLCA2MCBpbnNlcnRpb25zKCsp Cj4gPiA+Cj4gPiA+IGRpZmYgLS1naXQgYS90b29scy9saWIvcGVyZi9jcHVtYXAuYyBiL3Rvb2xz L2xpYi9wZXJmL2NwdW1hcC5jCj4gPiA+IGluZGV4IGQ0ZjNhMWExMjUyMi4uNDg1OTVhM2FkNjlj IDEwMDY0NAo+ID4gPiAtLS0gYS90b29scy9saWIvcGVyZi9jcHVtYXAuYwo+ID4gPiArKysgYi90 b29scy9saWIvcGVyZi9jcHVtYXAuYwo+ID4gPiBAQCAtMzIxLDYgKzMyMSwyNyBAQCBib29sIHBl cmZfY3B1X21hcF9faGFzKGNvbnN0IHN0cnVjdCBwZXJmX2NwdV9tYXAgKmNwdXMsIHN0cnVjdCBw ZXJmX2NwdSBjcHUpCj4gPiA+ICAgICByZXR1cm4gcGVyZl9jcHVfbWFwX19pZHgoY3B1cywgY3B1 KSAhPSAtMTsKPiA+ID4gIH0KPiA+ID4KPiA+ID4gK2Jvb2wgcGVyZl9jcHVfbWFwX19lcXVhbChj b25zdCBzdHJ1Y3QgcGVyZl9jcHVfbWFwICpsaHMsIGNvbnN0IHN0cnVjdCBwZXJmX2NwdV9tYXAg KnJocykKPiA+ID4gK3sKPiA+ID4gKyAgIGludCBucjsKPiA+ID4gKwo+ID4gPiArICAgaWYgKGxo cyA9PSByaHMpCj4gPiA+ICsgICAgICAgICAgIHJldHVybiB0cnVlOwo+ID4gPiArCj4gPiA+ICsg ICBpZiAoIWxocyB8fCAhcmhzKQo+ID4gPiArICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiA+ ICsKPiA+ID4gKyAgIG5yID0gcGVyZl9jcHVfbWFwX19ucihsaHMpOwo+ID4gPiArICAgaWYgKG5y ICE9IHBlcmZfY3B1X21hcF9fbnIocmhzKSkKPiA+ID4gKyAgICAgICAgICAgcmV0dXJuIGZhbHNl Owo+ID4gPiArCj4gPiA+ICsgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBucjsgaWR4KyspIHsK PiA+ID4gKyAgICAgICAgICAgaWYgKFJDX0NIS19BQ0NFU1MobGhzKS0+bWFwW2lkeF0uY3B1ICE9 IFJDX0NIS19BQ0NFU1MocmhzKS0+bWFwW2lkeF0uY3B1KQo+ID4gPiArICAgICAgICAgICAgICAg ICAgIHJldHVybiBmYWxzZTsKPiA+Cj4gPiBEb24ndCB3ZSBoYXZlIGFuIGFjY2Vzc29yIHRvIGF2 b2lkIHRoaXMgUkNfQ0hLX0FDQ0VTUygpLT4gYWNjZXNzPwo+Cj4gIEluIHRoZSBmb2xsb3dpbmcg cGF0Y2ggeW91IHVzZSBpdDoKPgo+ICtib29sIHBlcmZfY3B1X21hcF9faGFzX2FueV9jcHUoY29u c3Qgc3RydWN0IHBlcmZfY3B1X21hcCAqbWFwKQo+ICt7Cj4gKyAgICAgICByZXR1cm4gbWFwICYm IHBlcmZfY3B1X21hcF9fY3B1KG1hcCwgMCkuY3B1ID09IC0xOwo+ICt9Cj4KPiBCdXQgaXQgZG9l cyBleHRyYSBjaGVja3MgeW91IGRpZCBhbHJlYWR5Ogo+Cj4gc3RydWN0IHBlcmZfY3B1IHBlcmZf Y3B1X21hcF9fY3B1KGNvbnN0IHN0cnVjdCBwZXJmX2NwdV9tYXAgKmNwdXMsIGludCBpZHgpCj4g ewo+ICAgICAgICAgc3RydWN0IHBlcmZfY3B1IHJlc3VsdCA9IHsKPiAgICAgICAgICAgICAgICAg LmNwdSA9IC0xCj4gICAgICAgICB9Owo+Cj4gICAgICAgICBpZiAoY3B1cyAmJiBpZHggPCBSQ19D SEtfQUNDRVNTKGNwdXMpLT5ucikKPiAgICAgICAgICAgICAgICAgcmV0dXJuIFJDX0NIS19BQ0NF U1MoY3B1cyktPm1hcFtpZHhdOwo+Cj4gICAgICAgICByZXR1cm4gcmVzdWx0Owo+IH0KPgo+IFVz dWFsbHkgd2UgaGF2ZToKPgo+IHN0cnVjdCBwZXJmX2NwdSBfX3BlcmZfY3B1X21hcF9fY3B1KGNv bnN0IHN0cnVjdCBwZXJmX2NwdV9tYXAgKmNwdXMsIGludCBpZHgpCj4gewo+ICAgICAgICAgcmV0 dXJuIFJDX0NIS19BQ0NFU1MoY3B1cyktPm1hcFtpZHhdOwo+IH0KPgo+IHN0cnVjdCBwZXJmX2Nw dSBwZXJmX2NwdV9tYXBfX2NwdShjb25zdCBzdHJ1Y3QgcGVyZl9jcHVfbWFwICpjcHVzLCBpbnQg aWR4KQo+IHsKPiAgICAgICAgIHN0cnVjdCBwZXJmX2NwdSByZXN1bHQgPSB7Cj4gICAgICAgICAg ICAgICAgIC5jcHUgPSAtMQo+ICAgICAgICAgfTsKPgo+ICAgICAgICAgaWYgKGNwdXMgJiYgaWR4 IDwgX19wZXJmX2NwdV9tYXBfX25yKGNwdXMpKQo+ICAgICAgICAgICAgICAgICByZXR1cm4gX19w ZXJmX2NwdV9tYXBfX2NwdShjcHVzLCBpZHgpOwo+Cj4gICAgICAgICByZXR1cm4gcmVzdWx0Owo+ IH0KPgo+IFRoZW4geW91IHdvdWxkIGhhdmU6Cj4KPiBib29sIHBlcmZfY3B1X21hcF9fZXF1YWwo Y29uc3Qgc3RydWN0IHBlcmZfY3B1X21hcCAqbGhzLCBjb25zdCBzdHJ1Y3QgcGVyZl9jcHVfbWFw ICpyaHMpCj4gewo+ICAgICAgICAgaW50IG5yOwo+Cj4gICAgICAgICBpZiAobGhzID09IHJocykK PiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Cj4KPiAgICAgICAgIGlmICghbGhzIHx8ICFy aHMpCj4gICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPgo+ICAgICAgICAgbnIgPSBfX3Bl cmZfY3B1X21hcF9fbnIobGhzKTsgIC8vIG5vIG5lZWQgdG8gY2hlY2sgbGhzIGFnYWluIGZvciBO VUxMCj4gICAgICAgICBpZiAobnIgIT0gX19wZXJmX2NwdV9tYXBfX25yKHJocykpIC8vIGRpdHRv IGZvciByaHMKPiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+Cj4gICAgICAgICBmb3Ig KGludCBpZHggPSAwOyBpZHggPCBucjsgaWR4KyspIHsKPiAgICAgICAgICAgICAgICAgaWYgKF9f cGVyZl9jcHVfbWFwX19jcHUobGhzLCBpZHgpLT5jcHUgIT0gX19wZXJmX2NwdV9tYXBfX2NwdShy aHMsIGlkeCktPmNwdSkKPiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4K ClRoYW5rcywgSSdsbCB1cGRhdGUgZm9yIHY1LiBGd2l3LCBvbiBpbnRlcnNlY3QsIEkga2VlcCBm b3JnZXR0aW5nIHRvCm1lbnRpb24gdGhhdCB0aGlzIHdhcyBzZW50IHByZXZpb3VzbHkgYXM6Cmh0 dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMjA0MDgwMzU2MTYuMTM1Njk1My00LWlyb2dl cnNAZ29vZ2xlLmNvbS8KCklhbgoKPiA+ID4gKyAgIH0KPiA+ID4gKyAgIHJldHVybiB0cnVlOwo+ ID4gPiArfQo+ID4gPiArCj4gPiA+ICBzdHJ1Y3QgcGVyZl9jcHUgcGVyZl9jcHVfbWFwX19tYXgo Y29uc3Qgc3RydWN0IHBlcmZfY3B1X21hcCAqbWFwKQo+ID4gPiAgewo+ID4gPiAgICAgc3RydWN0 IHBlcmZfY3B1IHJlc3VsdCA9IHsKPiA+ID4gZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9wZXJmL2lu Y2x1ZGUvcGVyZi9jcHVtYXAuaCBiL3Rvb2xzL2xpYi9wZXJmL2luY2x1ZGUvcGVyZi9jcHVtYXAu aAo+ID4gPiBpbmRleCAwNDY2YzQyMTZmYmIuLmQwYWU5NTUyZjhlMiAxMDA2NDQKPiA+ID4gLS0t IGEvdG9vbHMvbGliL3BlcmYvaW5jbHVkZS9wZXJmL2NwdW1hcC5oCj4gPiA+ICsrKyBiL3Rvb2xz L2xpYi9wZXJmL2luY2x1ZGUvcGVyZi9jcHVtYXAuaAo+ID4gPiBAQCAtMjgsNiArMjgsOCBAQCBM SUJQRVJGX0FQSSBpbnQgcGVyZl9jcHVfbWFwX19ucihjb25zdCBzdHJ1Y3QgcGVyZl9jcHVfbWFw ICpjcHVzKTsKPiA+ID4gIExJQlBFUkZfQVBJIGJvb2wgcGVyZl9jcHVfbWFwX19lbXB0eShjb25z dCBzdHJ1Y3QgcGVyZl9jcHVfbWFwICptYXApOwo+ID4gPiAgTElCUEVSRl9BUEkgc3RydWN0IHBl cmZfY3B1IHBlcmZfY3B1X21hcF9fbWF4KGNvbnN0IHN0cnVjdCBwZXJmX2NwdV9tYXAgKm1hcCk7 Cj4gPiA+ICBMSUJQRVJGX0FQSSBib29sIHBlcmZfY3B1X21hcF9faGFzKGNvbnN0IHN0cnVjdCBw ZXJmX2NwdV9tYXAgKm1hcCwgc3RydWN0IHBlcmZfY3B1IGNwdSk7Cj4gPiA+ICtMSUJQRVJGX0FQ SSBib29sIHBlcmZfY3B1X21hcF9fZXF1YWwoY29uc3Qgc3RydWN0IHBlcmZfY3B1X21hcCAqbGhz LAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGVy Zl9jcHVfbWFwICpyaHMpOwo+ID4gPgo+ID4gPiAgI2RlZmluZSBwZXJmX2NwdV9tYXBfX2Zvcl9l YWNoX2NwdShjcHUsIGlkeCwgY3B1cykgICAgICAgICBcCj4gPiA+ICAgICBmb3IgKChpZHgpID0g MCwgKGNwdSkgPSBwZXJmX2NwdV9tYXBfX2NwdShjcHVzLCBpZHgpOyAgIFwKPiA+ID4gZGlmZiAt LWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvY3B1bWFwLmMgYi90b29scy9wZXJmL3Rlc3RzL2NwdW1h cC5jCj4gPiA+IGluZGV4IDgzODA1NjkwYzIwOS4uNzczMGZjMmFiNDBiIDEwMDY0NAo+ID4gPiAt LS0gYS90b29scy9wZXJmL3Rlc3RzL2NwdW1hcC5jCj4gPiA+ICsrKyBiL3Rvb2xzL3BlcmYvdGVz dHMvY3B1bWFwLmMKPiA+ID4gQEAgLTIxMSwxMSArMjExLDQ4IEBAIHN0YXRpYyBpbnQgdGVzdF9f Y3B1X21hcF9pbnRlcnNlY3Qoc3RydWN0IHRlc3Rfc3VpdGUgKnRlc3QgX19tYXliZV91bnVzZWQs Cj4gPiA+ICAgICByZXR1cm4gcmV0Owo+ID4gPiAgfQo+ID4gPgo+ID4gPiArc3RhdGljIGludCB0 ZXN0X19jcHVfbWFwX2VxdWFsKHN0cnVjdCB0ZXN0X3N1aXRlICp0ZXN0IF9fbWF5YmVfdW51c2Vk LCBpbnQgc3VidGVzdCBfX21heWJlX3VudXNlZCkKPiA+ID4gK3sKPiA+ID4gKyAgIHN0cnVjdCBw ZXJmX2NwdV9tYXAgKmFueSA9IHBlcmZfY3B1X21hcF9fZHVtbXlfbmV3KCk7Cj4gPiA+ICsgICBz dHJ1Y3QgcGVyZl9jcHVfbWFwICpvbmUgPSBwZXJmX2NwdV9tYXBfX25ldygiMSIpOwo+ID4gPiAr ICAgc3RydWN0IHBlcmZfY3B1X21hcCAqdHdvID0gcGVyZl9jcHVfbWFwX19uZXcoIjIiKTsKPiA+ ID4gKyAgIHN0cnVjdCBwZXJmX2NwdV9tYXAgKmVtcHR5ID0gcGVyZl9jcHVfbWFwX19pbnRlcnNl Y3Qob25lLCB0d28pOwo+ID4gPiArICAgc3RydWN0IHBlcmZfY3B1X21hcCAqcGFpciA9IHBlcmZf Y3B1X21hcF9fbmV3KCIxLTIiKTsKPiA+ID4gKyAgIHN0cnVjdCBwZXJmX2NwdV9tYXAgKnRtcDsK PiA+ID4gKyAgIHN0cnVjdCBwZXJmX2NwdV9tYXAgKm1hcHNbXSA9IHtlbXB0eSwgYW55LCBvbmUs IHR3bywgcGFpcn07Cj4gPiA+ICsKPiA+ID4gKyAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJS QVlfU0laRShtYXBzKTsgaSsrKSB7Cj4gPiA+ICsgICAgICAgICAgIC8qIE1hcHMgZXF1YWwgdGhl bXNlbGYuICovCj4gPiA+ICsgICAgICAgICAgIFRFU1RfQVNTRVJUX1ZBTCgiZXF1YWwiLCBwZXJm X2NwdV9tYXBfX2VxdWFsKG1hcHNbaV0sIG1hcHNbaV0pKTsKPiA+ID4gKyAgICAgICAgICAgZm9y IChzaXplX3QgaiA9IDA7IGogPCBBUlJBWV9TSVpFKG1hcHMpOyBqKyspIHsKPiA+ID4gKyAgICAg ICAgICAgICAgICAgICAvKiBNYXBzIGRvbnQndCBlcXVhbCBlYWNoIG90aGVyLiAqLwo+ID4gPiAr ICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopCj4gPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb250aW51ZTsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICBURVNUX0FTU0VSVF9W QUwoIm5vdCBlcXVhbCIsICFwZXJmX2NwdV9tYXBfX2VxdWFsKG1hcHNbaV0sIG1hcHNbal0pKTsK PiA+ID4gKyAgICAgICAgICAgfQo+ID4gPiArICAgfQo+ID4gPiArCj4gPiA+ICsgICAvKiBNYXBz IGVxdWFsIG1hZGUgbWFwcy4gKi8KPiA+ID4gKyAgIHRtcCA9IHBlcmZfY3B1X21hcF9fbWVyZ2Uo cGVyZl9jcHVfbWFwX19nZXQob25lKSwgdHdvKTsKPiA+ID4gKyAgIFRFU1RfQVNTRVJUX1ZBTCgi cGFpciIsIHBlcmZfY3B1X21hcF9fZXF1YWwocGFpciwgdG1wKSk7Cj4gPiA+ICsgICBwZXJmX2Nw dV9tYXBfX3B1dCh0bXApOwo+ID4gPiArCj4gPiA+ICsgICB0bXAgPSBwZXJmX2NwdV9tYXBfX2lu dGVyc2VjdChwYWlyLCBvbmUpOwo+ID4gPiArICAgVEVTVF9BU1NFUlRfVkFMKCJvbmUiLCBwZXJm X2NwdV9tYXBfX2VxdWFsKG9uZSwgdG1wKSk7Cj4gPiA+ICsgICBwZXJmX2NwdV9tYXBfX3B1dCh0 bXApOwo+ID4gPiArCj4gPiA+ICsgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUo bWFwcyk7IGkrKykKPiA+ID4gKyAgICAgICAgICAgcGVyZl9jcHVfbWFwX19wdXQobWFwc1tpXSk7 Cj4gPiA+ICsKPiA+ID4gKyAgIHJldHVybiBURVNUX09LOwo+ID4gPiArfQo+ID4gPiArCj4gPiA+ ICBzdGF0aWMgc3RydWN0IHRlc3RfY2FzZSB0ZXN0c19fY3B1X21hcFtdID0gewo+ID4gPiAgICAg VEVTVF9DQVNFKCJTeW50aGVzaXplIGNwdSBtYXAiLCBjcHVfbWFwX3N5bnRoZXNpemUpLAo+ID4g PiAgICAgVEVTVF9DQVNFKCJQcmludCBjcHUgbWFwIiwgY3B1X21hcF9wcmludCksCj4gPiA+ICAg ICBURVNUX0NBU0UoIk1lcmdlIGNwdSBtYXAiLCBjcHVfbWFwX21lcmdlKSwKPiA+ID4gICAgIFRF U1RfQ0FTRSgiSW50ZXJzZWN0IGNwdSBtYXAiLCBjcHVfbWFwX2ludGVyc2VjdCksCj4gPiA+ICsg ICBURVNUX0NBU0UoIkVxdWFsIGNwdSBtYXAiLCBjcHVfbWFwX2VxdWFsKSwKPiA+ID4gICAgIHsg ICAgICAgLm5hbWUgPSBOVUxMLCB9Cj4gPiA+ICB9Owo+ID4gPgo+ID4gPiAtLQo+ID4gPiAyLjQx LjAucmMwLjE3Mi5nM2YxMzJiNzA3MS1nb29nCj4gPiA+Cj4gPgo+ID4gLS0KPiA+Cj4gPiAtIEFy bmFsZG8KPgo+IC0tCj4KPiAtIEFybmFsZG8KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFy bS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK