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 C6AF1C433F5 for ; Mon, 10 Jan 2022 21:03:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343713AbiAJVDK (ORCPT ); Mon, 10 Jan 2022 16:03:10 -0500 Received: from ams.source.kernel.org ([145.40.68.75]:51258 "EHLO ams.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239741AbiAJVDJ (ORCPT ); Mon, 10 Jan 2022 16:03:09 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 4894EB8107D; Mon, 10 Jan 2022 21:03:08 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A986CC36AE9; Mon, 10 Jan 2022 21:03:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1641848587; bh=AD4dVJVe8at8uwWCEmd7hOg8NubblSQq5w4iLskvH+c=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ObFdKKf75tSif71up58WTM5O5EMAlL9lhky2+vLsvZkCa4tF2GmKL6tnyLqmcJyE0 S3H+ZsmwP34mfVuGtMhg8TM8X41/nQbRREeMIU2ZGa6M0u/5PTLc5oWmrlQ+Plbz37 iw8Efj2XyfTY0n4Ne/aQSWkWd0Omz9nJRoaCjyalRkoHdjxQ15DO54wTxARnXpQ5CY RqwyN4HUJWnyMyvVoux/BMYO32tSgDkY82Hi++k2m2eFVOekoSQ2NccaQ34Z95aKEb ROqP8ZeInrbGSAhRqQU4BKU92H+0o6h0WCFvM1zNtC175KOiygQGnPk6hM8DX35pxn QLKehabnWGPWQ== Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id BBFE340714; Mon, 10 Jan 2022 18:03:04 -0300 (-03) Date: Mon, 10 Jan 2022 18:03:04 -0300 From: Arnaldo Carvalho de Melo To: Ian Rogers Cc: Andi Kleen , Jiri Olsa , Namhyung Kim , John Garry , Kajol Jain , "Paul A . Clarke" , Riccardo Mancini , Kan Liang , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Vineet Singh , James Clark , Mathieu Poirier , Suzuki K Poulose , Mike Leach , Leo Yan , coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, zhengjun.xing@intel.com, eranian@google.com Subject: Re: [PATCH v3 06/48] perf cpumap: Switch cpu_map__build_map to cpu function Message-ID: References: <20211230072030.302559-1-irogers@google.com> <20211230072030.302559-8-irogers@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-Url: http://acmel.wordpress.com Precedence: bulk List-ID: X-Mailing-List: linux-perf-users@vger.kernel.org Em Mon, Jan 10, 2022 at 05:46:52PM -0300, Arnaldo Carvalho de Melo escreveu: > Em Wed, Dec 29, 2021 at 11:19:48PM -0800, Ian Rogers escreveu: > > Avoid error prone cpu_map + idx variant. Remove now unused functions. > > At this point we need to remove the now unused perf_env__get_cpu(), and > then deal with the fallout in the following patches that needlessly > modify this unused function. > > Doing that now. Done, force pushed to tmp.perf/perf_cpu, now it is going again thru the build containers, a better start now: [perfbuilder@five ~]$ export BUILD_TARBALL=http://192.168.100.2/perf/perf-5.16.0.tar.xz [perfbuilder@five ~]$ time dm 1 95.61 almalinux:8 : Ok gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4) , clang version 12.0.1 (Red Hat 12.0.1-4.module_el8.5.0+1025+93159d6c) 2 56.18 alpine:3.4 : Ok gcc (Alpine 5.3.0) 5.3.0 , clang version 3.8.0 (tags/RELEASE_380/final) 3: alpine:3.5 - Arnaldo > ⬢[acme@toolbox perf]$ git diff > diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c > index 6b985abaa2d22c58..40cb3518f27e2309 100644 > --- a/tools/perf/builtin-stat.c > +++ b/tools/perf/builtin-stat.c > @@ -1477,22 +1477,6 @@ static void perf_stat__exit_aggr_mode(void) > stat_config.cpus_aggr_map = NULL; > } > > -static inline int perf_env__get_cpu(void *data, struct perf_cpu_map *map, int idx) > -{ > - struct perf_env *env = data; > - int cpu; > - > - if (idx > map->nr) > - return -1; > - > - cpu = map->map[idx]; > - > - if (cpu >= env->nr_cpus_avail) > - return -1; > - > - return cpu; > -} > - > static struct aggr_cpu_id perf_env__get_socket_aggr_by_cpu(int cpu, void *data) > { > struct perf_env *env = data; > > > Reviewed-by: James Clark > > Signed-off-by: Ian Rogers > > --- > > tools/perf/builtin-stat.c | 28 ++++------------------------ > > tools/perf/util/cpumap.c | 12 ++++++------ > > tools/perf/util/cpumap.h | 2 +- > > 3 files changed, 11 insertions(+), 31 deletions(-) > > > > diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c > > index 9791ae9b1a53..6b985abaa2d2 100644 > > --- a/tools/perf/builtin-stat.c > > +++ b/tools/perf/builtin-stat.c > > @@ -1504,11 +1504,6 @@ static struct aggr_cpu_id perf_env__get_socket_aggr_by_cpu(int cpu, void *data) > > return id; > > } > > > > -static struct aggr_cpu_id perf_env__get_socket(struct perf_cpu_map *map, int idx, void *data) > > -{ > > - return perf_env__get_socket_aggr_by_cpu(perf_env__get_cpu(data, map, idx), data); > > -} > > - > > static struct aggr_cpu_id perf_env__get_die_aggr_by_cpu(int cpu, void *data) > > { > > struct perf_env *env = data; > > @@ -1527,11 +1522,6 @@ static struct aggr_cpu_id perf_env__get_die_aggr_by_cpu(int cpu, void *data) > > return id; > > } > > > > -static struct aggr_cpu_id perf_env__get_die(struct perf_cpu_map *map, int idx, void *data) > > -{ > > - return perf_env__get_die_aggr_by_cpu(perf_env__get_cpu(data, map, idx), data); > > -} > > - > > static struct aggr_cpu_id perf_env__get_core_aggr_by_cpu(int cpu, void *data) > > { > > struct perf_env *env = data; > > @@ -1551,11 +1541,6 @@ static struct aggr_cpu_id perf_env__get_core_aggr_by_cpu(int cpu, void *data) > > return id; > > } > > > > -static struct aggr_cpu_id perf_env__get_core(struct perf_cpu_map *map, int idx, void *data) > > -{ > > - return perf_env__get_core_aggr_by_cpu(perf_env__get_cpu(data, map, idx), data); > > -} > > - > > static struct aggr_cpu_id perf_env__get_node_aggr_by_cpu(int cpu, void *data) > > { > > struct aggr_cpu_id id = cpu_map__empty_aggr_cpu_id(); > > @@ -1564,33 +1549,28 @@ static struct aggr_cpu_id perf_env__get_node_aggr_by_cpu(int cpu, void *data) > > return id; > > } > > > > -static struct aggr_cpu_id perf_env__get_node(struct perf_cpu_map *map, int idx, void *data) > > -{ > > - return perf_env__get_node_aggr_by_cpu(perf_env__get_cpu(data, map, idx), data); > > -} > > - > > static int perf_env__build_socket_map(struct perf_env *env, struct perf_cpu_map *cpus, > > struct cpu_aggr_map **sockp) > > { > > - return cpu_map__build_map(cpus, sockp, perf_env__get_socket, env); > > + return cpu_map__build_map(cpus, sockp, perf_env__get_socket_aggr_by_cpu, env); > > } > > > > static int perf_env__build_die_map(struct perf_env *env, struct perf_cpu_map *cpus, > > struct cpu_aggr_map **diep) > > { > > - return cpu_map__build_map(cpus, diep, perf_env__get_die, env); > > + return cpu_map__build_map(cpus, diep, perf_env__get_die_aggr_by_cpu, env); > > } > > > > static int perf_env__build_core_map(struct perf_env *env, struct perf_cpu_map *cpus, > > struct cpu_aggr_map **corep) > > { > > - return cpu_map__build_map(cpus, corep, perf_env__get_core, env); > > + return cpu_map__build_map(cpus, corep, perf_env__get_core_aggr_by_cpu, env); > > } > > > > static int perf_env__build_node_map(struct perf_env *env, struct perf_cpu_map *cpus, > > struct cpu_aggr_map **nodep) > > { > > - return cpu_map__build_map(cpus, nodep, perf_env__get_node, env); > > + return cpu_map__build_map(cpus, nodep, perf_env__get_node_aggr_by_cpu, env); > > } > > > > static struct aggr_cpu_id perf_stat__get_socket_file(struct perf_stat_config *config __maybe_unused, > > diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c > > index 49fba2c53822..feaf34b25efc 100644 > > --- a/tools/perf/util/cpumap.c > > +++ b/tools/perf/util/cpumap.c > > @@ -163,7 +163,7 @@ static int cmp_aggr_cpu_id(const void *a_pointer, const void *b_pointer) > > } > > > > int cpu_map__build_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **res, > > - struct aggr_cpu_id (*f)(struct perf_cpu_map *map, int cpu, void *data), > > + struct aggr_cpu_id (*f)(int cpu, void *data), > > void *data) > > { > > int nr = cpus->nr; > > @@ -178,7 +178,7 @@ int cpu_map__build_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **res, > > c->nr = 0; > > > > for (cpu = 0; cpu < nr; cpu++) { > > - s1 = f(cpus, cpu, data); > > + s1 = f(cpu, data); > > for (s2 = 0; s2 < c->nr; s2++) { > > if (cpu_map__compare_aggr_cpu_id(s1, c->map[s2])) > > break; > > @@ -290,22 +290,22 @@ struct aggr_cpu_id cpu_map__get_node(struct perf_cpu_map *map, int idx, void *da > > > > int cpu_map__build_socket_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **sockp) > > { > > - return cpu_map__build_map(cpus, sockp, cpu_map__get_socket, NULL); > > + return cpu_map__build_map(cpus, sockp, cpu_map__get_socket_aggr_by_cpu, NULL); > > } > > > > int cpu_map__build_die_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **diep) > > { > > - return cpu_map__build_map(cpus, diep, cpu_map__get_die, NULL); > > + return cpu_map__build_map(cpus, diep, cpu_map__get_die_aggr_by_cpu, NULL); > > } > > > > int cpu_map__build_core_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **corep) > > { > > - return cpu_map__build_map(cpus, corep, cpu_map__get_core, NULL); > > + return cpu_map__build_map(cpus, corep, cpu_map__get_core_aggr_by_cpu, NULL); > > } > > > > int cpu_map__build_node_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **numap) > > { > > - return cpu_map__build_map(cpus, numap, cpu_map__get_node, NULL); > > + return cpu_map__build_map(cpus, numap, cpu_map__get_node_aggr_by_cpu, NULL); > > } > > > > /* setup simple routines to easily access node numbers given a cpu number */ > > diff --git a/tools/perf/util/cpumap.h b/tools/perf/util/cpumap.h > > index c62d67704425..9648816c4255 100644 > > --- a/tools/perf/util/cpumap.h > > +++ b/tools/perf/util/cpumap.h > > @@ -63,7 +63,7 @@ int cpu__max_present_cpu(void); > > int cpu__get_node(int cpu); > > > > int cpu_map__build_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **res, > > - struct aggr_cpu_id (*f)(struct perf_cpu_map *map, int cpu, void *data), > > + struct aggr_cpu_id (*f)(int cpu, void *data), > > void *data); > > > > int cpu_map__cpu(struct perf_cpu_map *cpus, int idx); > > -- > > 2.34.1.448.ga2b2bfdf31-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 1A24AC433EF for ; Mon, 10 Jan 2022 21:04:32 +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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=MwMkoaWXJJUnu41b4gFe3OaaEV96hRtfE3kv1ed+ofQ=; b=veZu6VLbDul+7Z TS6qErpR4OVOLITC3vEbcXrk9MjdkJZLd9F1j5fQqHdnHNi0u/rXcpln1z2mulOY4p578TB8u3CmH HU05sl6KUJoMV2sV0JK5Sh7B0HsUUv5wmDOPWhl/3PoObeDv33yWT+pbFi1QrzAkI7mckNXW9qwJ9 78xgQAQoce/RaqPo480ApMiAD7OTmdjukQ9zjI+jifGPmSo8NI2Z9bYwajDPqhvEUnU6XpgfT+KnV OyjWQ3U6aimeSyr82a905fFE66mEFhO4CTBODlGUKWaZbhkMpUvjceH/DxbHW0mer43F1O0d3JZfH toFXMkxctGJFq8MAYo/A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1n71ou-00DKoT-Ea; Mon, 10 Jan 2022 21:03:12 +0000 Received: from desiato.infradead.org ([2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1n71os-00DKoC-EK for linux-arm-kernel@bombadil.infradead.org; Mon, 10 Jan 2022 21:03:10 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=In-Reply-To:Content-Transfer-Encoding: Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date: Sender:Reply-To:Content-ID:Content-Description; bh=YoWql6vBCxV1vYjDosJcLRPLiMGhCmOgkPfnGuYui20=; b=oRK9fCo/cWQ9jZjQdFrvFsBlx6 G92kmKttRsq1obGDHZUekF1/5GGpNr7U54kawFViacOi4mg2hox/QwXj/wCRvYB9qAJKuA6NyCCrX BeaEIxpuxxRs1jTPI4ohs9Ge1HL8kSZGzM4eaRrc9S1gwJJLqd7lUWjRUlB+uYMInGkL0GayQX6kh k6hbEHVZ09UYMWI5j2xl74oO/r+icBUMN8RUKNrl3CjvUF0zsMZL016UFXnBvLauM3MEwucOoaEca ITe5hKq/voxhsoOHKtLVepeHwGa2wp2HWznQv9u/SbYNa4PqhKWbMUuLIfjUF3gH6OyyfikpR9Vmb wJXfQ2cw==; Received: from [179.97.37.151] (helo=quaco.ghostprotocols.net) by desiato.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1n71op-000T2E-GI; Mon, 10 Jan 2022 21:03:08 +0000 Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id BBFE340714; Mon, 10 Jan 2022 18:03:04 -0300 (-03) Date: Mon, 10 Jan 2022 18:03:04 -0300 From: Arnaldo Carvalho de Melo To: Ian Rogers Cc: Andi Kleen , Jiri Olsa , Namhyung Kim , John Garry , Kajol Jain , "Paul A . Clarke" , Riccardo Mancini , Kan Liang , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Vineet Singh , James Clark , Mathieu Poirier , Suzuki K Poulose , Mike Leach , Leo Yan , coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, zhengjun.xing@intel.com, eranian@google.com Subject: Re: [PATCH v3 06/48] perf cpumap: Switch cpu_map__build_map to cpu function Message-ID: References: <20211230072030.302559-1-irogers@google.com> <20211230072030.302559-8-irogers@google.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Url: http://acmel.wordpress.com 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 RW0gTW9uLCBKYW4gMTAsIDIwMjIgYXQgMDU6NDY6NTJQTSAtMDMwMCwgQXJuYWxkbyBDYXJ2YWxo byBkZSBNZWxvIGVzY3JldmV1Ogo+IEVtIFdlZCwgRGVjIDI5LCAyMDIxIGF0IDExOjE5OjQ4UE0g LTA4MDAsIElhbiBSb2dlcnMgZXNjcmV2ZXU6Cj4gPiBBdm9pZCBlcnJvciBwcm9uZSBjcHVfbWFw ICsgaWR4IHZhcmlhbnQuIFJlbW92ZSBub3cgdW51c2VkIGZ1bmN0aW9ucy4KPiAKPiBBdCB0aGlz IHBvaW50IHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBub3cgdW51c2VkIHBlcmZfZW52X19nZXRfY3B1 KCksIGFuZAo+IHRoZW4gZGVhbCB3aXRoIHRoZSBmYWxsb3V0IGluIHRoZSBmb2xsb3dpbmcgcGF0 Y2hlcyB0aGF0IG5lZWRsZXNzbHkKPiBtb2RpZnkgdGhpcyB1bnVzZWQgZnVuY3Rpb24uCj4gCj4g RG9pbmcgdGhhdCBub3cuCgpEb25lLCBmb3JjZSBwdXNoZWQgdG8gdG1wLnBlcmYvcGVyZl9jcHUs IG5vdyBpdCBpcyBnb2luZyBhZ2FpbiB0aHJ1IHRoZQpidWlsZCBjb250YWluZXJzLCBhIGJldHRl ciBzdGFydCBub3c6CgpbcGVyZmJ1aWxkZXJAZml2ZSB+XSQgZXhwb3J0IEJVSUxEX1RBUkJBTEw9 aHR0cDovLzE5Mi4xNjguMTAwLjIvcGVyZi9wZXJmLTUuMTYuMC50YXIueHoKW3BlcmZidWlsZGVy QGZpdmUgfl0kIHRpbWUgZG0KICAgMSAgICA5NS42MSBhbG1hbGludXg6OCAgICAgICAgICAgICAg ICAgICA6IE9rICAgZ2NjIChHQ0MpIDguNS4wIDIwMjEwNTE0IChSZWQgSGF0IDguNS4wLTQpICwg Y2xhbmcgdmVyc2lvbiAxMi4wLjEgKFJlZCBIYXQgMTIuMC4xLTQubW9kdWxlX2VsOC41LjArMTAy NSs5MzE1OWQ2YykKICAgMiAgICA1Ni4xOCBhbHBpbmU6My40ICAgICAgICAgICAgICAgICAgICA6 IE9rICAgZ2NjIChBbHBpbmUgNS4zLjApIDUuMy4wICwgY2xhbmcgdmVyc2lvbiAzLjguMCAodGFn cy9SRUxFQVNFXzM4MC9maW5hbCkKICAgMzogYWxwaW5lOjMuNQoKCi0gQXJuYWxkbwogCj4g4qyi W2FjbWVAdG9vbGJveCBwZXJmXSQgZ2l0IGRpZmYKPiBkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9i dWlsdGluLXN0YXQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKPiBpbmRleCA2Yjk4NWFi YWEyZDIyYzU4Li40MGNiMzUxOGYyN2UyMzA5IDEwMDY0NAo+IC0tLSBhL3Rvb2xzL3BlcmYvYnVp bHRpbi1zdGF0LmMKPiArKysgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCj4gQEAgLTE0Nzcs MjIgKzE0NzcsNiBAQCBzdGF0aWMgdm9pZCBwZXJmX3N0YXRfX2V4aXRfYWdncl9tb2RlKHZvaWQp Cj4gICAgICAgICBzdGF0X2NvbmZpZy5jcHVzX2FnZ3JfbWFwID0gTlVMTDsKPiAgfQo+IAo+IC1z dGF0aWMgaW5saW5lIGludCBwZXJmX2Vudl9fZ2V0X2NwdSh2b2lkICpkYXRhLCBzdHJ1Y3QgcGVy Zl9jcHVfbWFwICptYXAsIGludCBpZHgpCj4gLXsKPiAtICAgICAgIHN0cnVjdCBwZXJmX2VudiAq ZW52ID0gZGF0YTsKPiAtICAgICAgIGludCBjcHU7Cj4gLQo+IC0gICAgICAgaWYgKGlkeCA+IG1h cC0+bnIpCj4gLSAgICAgICAgICAgICAgIHJldHVybiAtMTsKPiAtCj4gLSAgICAgICBjcHUgPSBt YXAtPm1hcFtpZHhdOwo+IC0KPiAtICAgICAgIGlmIChjcHUgPj0gZW52LT5ucl9jcHVzX2F2YWls KQo+IC0gICAgICAgICAgICAgICByZXR1cm4gLTE7Cj4gLQo+IC0gICAgICAgcmV0dXJuIGNwdTsK PiAtfQo+IC0KPiAgc3RhdGljIHN0cnVjdCBhZ2dyX2NwdV9pZCBwZXJmX2Vudl9fZ2V0X3NvY2tl dF9hZ2dyX2J5X2NwdShpbnQgY3B1LCB2b2lkICpkYXRhKQo+ICB7Cj4gICAgICAgICBzdHJ1Y3Qg cGVyZl9lbnYgKmVudiA9IGRhdGE7Cj4gIAo+ID4gUmV2aWV3ZWQtYnk6IEphbWVzIENsYXJrIDxq YW1lcy5jbGFya0Bhcm0uY29tPgo+ID4gU2lnbmVkLW9mZi1ieTogSWFuIFJvZ2VycyA8aXJvZ2Vy c0Bnb29nbGUuY29tPgo+ID4gLS0tCj4gPiAgdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYyB8IDI4 ICsrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+ICB0b29scy9wZXJmL3V0aWwvY3B1bWFw LmMgIHwgMTIgKysrKysrLS0tLS0tCj4gPiAgdG9vbHMvcGVyZi91dGlsL2NwdW1hcC5oICB8ICAy ICstCj4gPiAgMyBmaWxlcyBjaGFuZ2VkLCAxMSBpbnNlcnRpb25zKCspLCAzMSBkZWxldGlvbnMo LSkKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMgYi90b29s cy9wZXJmL2J1aWx0aW4tc3RhdC5jCj4gPiBpbmRleCA5NzkxYWU5YjFhNTMuLjZiOTg1YWJhYTJk MiAxMDA2NDQKPiA+IC0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKPiA+ICsrKyBiL3Rv b2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKPiA+IEBAIC0xNTA0LDExICsxNTA0LDYgQEAgc3RhdGlj IHN0cnVjdCBhZ2dyX2NwdV9pZCBwZXJmX2Vudl9fZ2V0X3NvY2tldF9hZ2dyX2J5X2NwdShpbnQg Y3B1LCB2b2lkICpkYXRhKQo+ID4gIAlyZXR1cm4gaWQ7Cj4gPiAgfQo+ID4gIAo+ID4gLXN0YXRp YyBzdHJ1Y3QgYWdncl9jcHVfaWQgcGVyZl9lbnZfX2dldF9zb2NrZXQoc3RydWN0IHBlcmZfY3B1 X21hcCAqbWFwLCBpbnQgaWR4LCB2b2lkICpkYXRhKQo+ID4gLXsKPiA+IC0JcmV0dXJuIHBlcmZf ZW52X19nZXRfc29ja2V0X2FnZ3JfYnlfY3B1KHBlcmZfZW52X19nZXRfY3B1KGRhdGEsIG1hcCwg aWR4KSwgZGF0YSk7Cj4gPiAtfQo+ID4gLQo+ID4gIHN0YXRpYyBzdHJ1Y3QgYWdncl9jcHVfaWQg cGVyZl9lbnZfX2dldF9kaWVfYWdncl9ieV9jcHUoaW50IGNwdSwgdm9pZCAqZGF0YSkKPiA+ICB7 Cj4gPiAgCXN0cnVjdCBwZXJmX2VudiAqZW52ID0gZGF0YTsKPiA+IEBAIC0xNTI3LDExICsxNTIy LDYgQEAgc3RhdGljIHN0cnVjdCBhZ2dyX2NwdV9pZCBwZXJmX2Vudl9fZ2V0X2RpZV9hZ2dyX2J5 X2NwdShpbnQgY3B1LCB2b2lkICpkYXRhKQo+ID4gIAlyZXR1cm4gaWQ7Cj4gPiAgfQo+ID4gIAo+ ID4gLXN0YXRpYyBzdHJ1Y3QgYWdncl9jcHVfaWQgcGVyZl9lbnZfX2dldF9kaWUoc3RydWN0IHBl cmZfY3B1X21hcCAqbWFwLCBpbnQgaWR4LCB2b2lkICpkYXRhKQo+ID4gLXsKPiA+IC0JcmV0dXJu IHBlcmZfZW52X19nZXRfZGllX2FnZ3JfYnlfY3B1KHBlcmZfZW52X19nZXRfY3B1KGRhdGEsIG1h cCwgaWR4KSwgZGF0YSk7Cj4gPiAtfQo+ID4gLQo+ID4gIHN0YXRpYyBzdHJ1Y3QgYWdncl9jcHVf aWQgcGVyZl9lbnZfX2dldF9jb3JlX2FnZ3JfYnlfY3B1KGludCBjcHUsIHZvaWQgKmRhdGEpCj4g PiAgewo+ID4gIAlzdHJ1Y3QgcGVyZl9lbnYgKmVudiA9IGRhdGE7Cj4gPiBAQCAtMTU1MSwxMSAr MTU0MSw2IEBAIHN0YXRpYyBzdHJ1Y3QgYWdncl9jcHVfaWQgcGVyZl9lbnZfX2dldF9jb3JlX2Fn Z3JfYnlfY3B1KGludCBjcHUsIHZvaWQgKmRhdGEpCj4gPiAgCXJldHVybiBpZDsKPiA+ICB9Cj4g PiAgCj4gPiAtc3RhdGljIHN0cnVjdCBhZ2dyX2NwdV9pZCBwZXJmX2Vudl9fZ2V0X2NvcmUoc3Ry dWN0IHBlcmZfY3B1X21hcCAqbWFwLCBpbnQgaWR4LCB2b2lkICpkYXRhKQo+ID4gLXsKPiA+IC0J cmV0dXJuIHBlcmZfZW52X19nZXRfY29yZV9hZ2dyX2J5X2NwdShwZXJmX2Vudl9fZ2V0X2NwdShk YXRhLCBtYXAsIGlkeCksIGRhdGEpOwo+ID4gLX0KPiA+IC0KPiA+ICBzdGF0aWMgc3RydWN0IGFn Z3JfY3B1X2lkIHBlcmZfZW52X19nZXRfbm9kZV9hZ2dyX2J5X2NwdShpbnQgY3B1LCB2b2lkICpk YXRhKQo+ID4gIHsKPiA+ICAJc3RydWN0IGFnZ3JfY3B1X2lkIGlkID0gY3B1X21hcF9fZW1wdHlf YWdncl9jcHVfaWQoKTsKPiA+IEBAIC0xNTY0LDMzICsxNTQ5LDI4IEBAIHN0YXRpYyBzdHJ1Y3Qg YWdncl9jcHVfaWQgcGVyZl9lbnZfX2dldF9ub2RlX2FnZ3JfYnlfY3B1KGludCBjcHUsIHZvaWQg KmRhdGEpCj4gPiAgCXJldHVybiBpZDsKPiA+ICB9Cj4gPiAgCj4gPiAtc3RhdGljIHN0cnVjdCBh Z2dyX2NwdV9pZCBwZXJmX2Vudl9fZ2V0X25vZGUoc3RydWN0IHBlcmZfY3B1X21hcCAqbWFwLCBp bnQgaWR4LCB2b2lkICpkYXRhKQo+ID4gLXsKPiA+IC0JcmV0dXJuIHBlcmZfZW52X19nZXRfbm9k ZV9hZ2dyX2J5X2NwdShwZXJmX2Vudl9fZ2V0X2NwdShkYXRhLCBtYXAsIGlkeCksIGRhdGEpOwo+ ID4gLX0KPiA+IC0KPiA+ICBzdGF0aWMgaW50IHBlcmZfZW52X19idWlsZF9zb2NrZXRfbWFwKHN0 cnVjdCBwZXJmX2VudiAqZW52LCBzdHJ1Y3QgcGVyZl9jcHVfbWFwICpjcHVzLAo+ID4gIAkJCQkg ICAgICBzdHJ1Y3QgY3B1X2FnZ3JfbWFwICoqc29ja3ApCj4gPiAgewo+ID4gLQlyZXR1cm4gY3B1 X21hcF9fYnVpbGRfbWFwKGNwdXMsIHNvY2twLCBwZXJmX2Vudl9fZ2V0X3NvY2tldCwgZW52KTsK PiA+ICsJcmV0dXJuIGNwdV9tYXBfX2J1aWxkX21hcChjcHVzLCBzb2NrcCwgcGVyZl9lbnZfX2dl dF9zb2NrZXRfYWdncl9ieV9jcHUsIGVudik7Cj4gPiAgfQo+ID4gIAo+ID4gIHN0YXRpYyBpbnQg cGVyZl9lbnZfX2J1aWxkX2RpZV9tYXAoc3RydWN0IHBlcmZfZW52ICplbnYsIHN0cnVjdCBwZXJm X2NwdV9tYXAgKmNwdXMsCj4gPiAgCQkJCSAgIHN0cnVjdCBjcHVfYWdncl9tYXAgKipkaWVwKQo+ ID4gIHsKPiA+IC0JcmV0dXJuIGNwdV9tYXBfX2J1aWxkX21hcChjcHVzLCBkaWVwLCBwZXJmX2Vu dl9fZ2V0X2RpZSwgZW52KTsKPiA+ICsJcmV0dXJuIGNwdV9tYXBfX2J1aWxkX21hcChjcHVzLCBk aWVwLCBwZXJmX2Vudl9fZ2V0X2RpZV9hZ2dyX2J5X2NwdSwgZW52KTsKPiA+ICB9Cj4gPiAgCj4g PiAgc3RhdGljIGludCBwZXJmX2Vudl9fYnVpbGRfY29yZV9tYXAoc3RydWN0IHBlcmZfZW52ICpl bnYsIHN0cnVjdCBwZXJmX2NwdV9tYXAgKmNwdXMsCj4gPiAgCQkJCSAgICBzdHJ1Y3QgY3B1X2Fn Z3JfbWFwICoqY29yZXApCj4gPiAgewo+ID4gLQlyZXR1cm4gY3B1X21hcF9fYnVpbGRfbWFwKGNw dXMsIGNvcmVwLCBwZXJmX2Vudl9fZ2V0X2NvcmUsIGVudik7Cj4gPiArCXJldHVybiBjcHVfbWFw X19idWlsZF9tYXAoY3B1cywgY29yZXAsIHBlcmZfZW52X19nZXRfY29yZV9hZ2dyX2J5X2NwdSwg ZW52KTsKPiA+ICB9Cj4gPiAgCj4gPiAgc3RhdGljIGludCBwZXJmX2Vudl9fYnVpbGRfbm9kZV9t YXAoc3RydWN0IHBlcmZfZW52ICplbnYsIHN0cnVjdCBwZXJmX2NwdV9tYXAgKmNwdXMsCj4gPiAg CQkJCSAgICBzdHJ1Y3QgY3B1X2FnZ3JfbWFwICoqbm9kZXApCj4gPiAgewo+ID4gLQlyZXR1cm4g Y3B1X21hcF9fYnVpbGRfbWFwKGNwdXMsIG5vZGVwLCBwZXJmX2Vudl9fZ2V0X25vZGUsIGVudik7 Cj4gPiArCXJldHVybiBjcHVfbWFwX19idWlsZF9tYXAoY3B1cywgbm9kZXAsIHBlcmZfZW52X19n ZXRfbm9kZV9hZ2dyX2J5X2NwdSwgZW52KTsKPiA+ICB9Cj4gPiAgCj4gPiAgc3RhdGljIHN0cnVj dCBhZ2dyX2NwdV9pZCBwZXJmX3N0YXRfX2dldF9zb2NrZXRfZmlsZShzdHJ1Y3QgcGVyZl9zdGF0 X2NvbmZpZyAqY29uZmlnIF9fbWF5YmVfdW51c2VkLAo+ID4gZGlmZiAtLWdpdCBhL3Rvb2xzL3Bl cmYvdXRpbC9jcHVtYXAuYyBiL3Rvb2xzL3BlcmYvdXRpbC9jcHVtYXAuYwo+ID4gaW5kZXggNDlm YmEyYzUzODIyLi5mZWFmMzRiMjVlZmMgMTAwNjQ0Cj4gPiAtLS0gYS90b29scy9wZXJmL3V0aWwv Y3B1bWFwLmMKPiA+ICsrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jcHVtYXAuYwo+ID4gQEAgLTE2Myw3 ICsxNjMsNyBAQCBzdGF0aWMgaW50IGNtcF9hZ2dyX2NwdV9pZChjb25zdCB2b2lkICphX3BvaW50 ZXIsIGNvbnN0IHZvaWQgKmJfcG9pbnRlcikKPiA+ICB9Cj4gPiAgCj4gPiAgaW50IGNwdV9tYXBf X2J1aWxkX21hcChzdHJ1Y3QgcGVyZl9jcHVfbWFwICpjcHVzLCBzdHJ1Y3QgY3B1X2FnZ3JfbWFw ICoqcmVzLAo+ID4gLQkJICAgICAgIHN0cnVjdCBhZ2dyX2NwdV9pZCAoKmYpKHN0cnVjdCBwZXJm X2NwdV9tYXAgKm1hcCwgaW50IGNwdSwgdm9pZCAqZGF0YSksCj4gPiArCQkgICAgICAgc3RydWN0 IGFnZ3JfY3B1X2lkICgqZikoaW50IGNwdSwgdm9pZCAqZGF0YSksCj4gPiAgCQkgICAgICAgdm9p ZCAqZGF0YSkKPiA+ICB7Cj4gPiAgCWludCBuciA9IGNwdXMtPm5yOwo+ID4gQEAgLTE3OCw3ICsx NzgsNyBAQCBpbnQgY3B1X21hcF9fYnVpbGRfbWFwKHN0cnVjdCBwZXJmX2NwdV9tYXAgKmNwdXMs IHN0cnVjdCBjcHVfYWdncl9tYXAgKipyZXMsCj4gPiAgCWMtPm5yID0gMDsKPiA+ICAKPiA+ICAJ Zm9yIChjcHUgPSAwOyBjcHUgPCBucjsgY3B1KyspIHsKPiA+IC0JCXMxID0gZihjcHVzLCBjcHUs IGRhdGEpOwo+ID4gKwkJczEgPSBmKGNwdSwgZGF0YSk7Cj4gPiAgCQlmb3IgKHMyID0gMDsgczIg PCBjLT5ucjsgczIrKykgewo+ID4gIAkJCWlmIChjcHVfbWFwX19jb21wYXJlX2FnZ3JfY3B1X2lk KHMxLCBjLT5tYXBbczJdKSkKPiA+ICAJCQkJYnJlYWs7Cj4gPiBAQCAtMjkwLDIyICsyOTAsMjIg QEAgc3RydWN0IGFnZ3JfY3B1X2lkIGNwdV9tYXBfX2dldF9ub2RlKHN0cnVjdCBwZXJmX2NwdV9t YXAgKm1hcCwgaW50IGlkeCwgdm9pZCAqZGEKPiA+ICAKPiA+ICBpbnQgY3B1X21hcF9fYnVpbGRf c29ja2V0X21hcChzdHJ1Y3QgcGVyZl9jcHVfbWFwICpjcHVzLCBzdHJ1Y3QgY3B1X2FnZ3JfbWFw ICoqc29ja3ApCj4gPiAgewo+ID4gLQlyZXR1cm4gY3B1X21hcF9fYnVpbGRfbWFwKGNwdXMsIHNv Y2twLCBjcHVfbWFwX19nZXRfc29ja2V0LCBOVUxMKTsKPiA+ICsJcmV0dXJuIGNwdV9tYXBfX2J1 aWxkX21hcChjcHVzLCBzb2NrcCwgY3B1X21hcF9fZ2V0X3NvY2tldF9hZ2dyX2J5X2NwdSwgTlVM TCk7Cj4gPiAgfQo+ID4gIAo+ID4gIGludCBjcHVfbWFwX19idWlsZF9kaWVfbWFwKHN0cnVjdCBw ZXJmX2NwdV9tYXAgKmNwdXMsIHN0cnVjdCBjcHVfYWdncl9tYXAgKipkaWVwKQo+ID4gIHsKPiA+ IC0JcmV0dXJuIGNwdV9tYXBfX2J1aWxkX21hcChjcHVzLCBkaWVwLCBjcHVfbWFwX19nZXRfZGll LCBOVUxMKTsKPiA+ICsJcmV0dXJuIGNwdV9tYXBfX2J1aWxkX21hcChjcHVzLCBkaWVwLCBjcHVf bWFwX19nZXRfZGllX2FnZ3JfYnlfY3B1LCBOVUxMKTsKPiA+ICB9Cj4gPiAgCj4gPiAgaW50IGNw dV9tYXBfX2J1aWxkX2NvcmVfbWFwKHN0cnVjdCBwZXJmX2NwdV9tYXAgKmNwdXMsIHN0cnVjdCBj cHVfYWdncl9tYXAgKipjb3JlcCkKPiA+ICB7Cj4gPiAtCXJldHVybiBjcHVfbWFwX19idWlsZF9t YXAoY3B1cywgY29yZXAsIGNwdV9tYXBfX2dldF9jb3JlLCBOVUxMKTsKPiA+ICsJcmV0dXJuIGNw dV9tYXBfX2J1aWxkX21hcChjcHVzLCBjb3JlcCwgY3B1X21hcF9fZ2V0X2NvcmVfYWdncl9ieV9j cHUsIE5VTEwpOwo+ID4gIH0KPiA+ICAKPiA+ICBpbnQgY3B1X21hcF9fYnVpbGRfbm9kZV9tYXAo c3RydWN0IHBlcmZfY3B1X21hcCAqY3B1cywgc3RydWN0IGNwdV9hZ2dyX21hcCAqKm51bWFwKQo+ ID4gIHsKPiA+IC0JcmV0dXJuIGNwdV9tYXBfX2J1aWxkX21hcChjcHVzLCBudW1hcCwgY3B1X21h cF9fZ2V0X25vZGUsIE5VTEwpOwo+ID4gKwlyZXR1cm4gY3B1X21hcF9fYnVpbGRfbWFwKGNwdXMs IG51bWFwLCBjcHVfbWFwX19nZXRfbm9kZV9hZ2dyX2J5X2NwdSwgTlVMTCk7Cj4gPiAgfQo+ID4g IAo+ID4gIC8qIHNldHVwIHNpbXBsZSByb3V0aW5lcyB0byBlYXNpbHkgYWNjZXNzIG5vZGUgbnVt YmVycyBnaXZlbiBhIGNwdSBudW1iZXIgKi8KPiA+IGRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0 aWwvY3B1bWFwLmggYi90b29scy9wZXJmL3V0aWwvY3B1bWFwLmgKPiA+IGluZGV4IGM2MmQ2Nzcw NDQyNS4uOTY0ODgxNmM0MjU1IDEwMDY0NAo+ID4gLS0tIGEvdG9vbHMvcGVyZi91dGlsL2NwdW1h cC5oCj4gPiArKysgYi90b29scy9wZXJmL3V0aWwvY3B1bWFwLmgKPiA+IEBAIC02Myw3ICs2Myw3 IEBAIGludCBjcHVfX21heF9wcmVzZW50X2NwdSh2b2lkKTsKPiA+ICBpbnQgY3B1X19nZXRfbm9k ZShpbnQgY3B1KTsKPiA+ICAKPiA+ICBpbnQgY3B1X21hcF9fYnVpbGRfbWFwKHN0cnVjdCBwZXJm X2NwdV9tYXAgKmNwdXMsIHN0cnVjdCBjcHVfYWdncl9tYXAgKipyZXMsCj4gPiAtCQkgICAgICAg c3RydWN0IGFnZ3JfY3B1X2lkICgqZikoc3RydWN0IHBlcmZfY3B1X21hcCAqbWFwLCBpbnQgY3B1 LCB2b2lkICpkYXRhKSwKPiA+ICsJCSAgICAgICBzdHJ1Y3QgYWdncl9jcHVfaWQgKCpmKShpbnQg Y3B1LCB2b2lkICpkYXRhKSwKPiA+ICAJCSAgICAgICB2b2lkICpkYXRhKTsKPiA+ICAKPiA+ICBp bnQgY3B1X21hcF9fY3B1KHN0cnVjdCBwZXJmX2NwdV9tYXAgKmNwdXMsIGludCBpZHgpOwo+ID4g LS0gCj4gPiAyLjM0LjEuNDQ4LmdhMmIyYmZkZjMxLWdvb2cKPiAKPiAtLSAKPiAKPiAtIEFybmFs ZG8KCi0tIAoKLSBBcm5hbGRvCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVs QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==