From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 875331C8781; Wed, 23 Oct 2024 15:39:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729697991; cv=none; b=IsNEQZxMXmLd11uODeL3hQXzw4YVPWjFmD5J040XGxNDFbrA8NGVNgn9rNidMgsvl0SyZ5mYNP2XP/rArvYrmQ4a0CiGPKDBGRYY4dvF/i/qY5eR/4oI7PPmvfDBkoCpDbCahU/wY3tfLlHeYUAQnX6xX36TsIgLctcgR3ct4nI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729697991; c=relaxed/simple; bh=hs0lXbcOH7c9T/cGcTNkAHvTScTMvbdw0SB7nKBj1RE=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=kcUdXed+z/ChqTQNtw0bSgWGVnSOyMAcC7iYt9jMScqQD0aXMaWIaq/U38JM1/7/4mQ8VxRb5UjiV8wyZxwMxejjX0aY7bqrPi265FhOTQ7xhBK99P66dXzuI+ZnHPyIHVjlz64fk2Ew+7XCiH4yWUa9WD6JuvschetVa4tQjbM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CLXkRVYM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CLXkRVYM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B94B1C4CEC6; Wed, 23 Oct 2024 15:39:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1729697991; bh=hs0lXbcOH7c9T/cGcTNkAHvTScTMvbdw0SB7nKBj1RE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=CLXkRVYMKhLzKMnLaS5EdZKHPPcUn+76PrLIXutI7U7lnmOtG7xAlx/T6eUgfP9Lf iRnHCzrrhQzMSO30G8hyKYGiQlNWbYQe1UdjYh5qk3fEm4Sw4L9HlRQUGDG92IZIdR 1lPKPE9Z580GvVAMZTQ2iKxapj4MdVIlSXR425bYdCaYVAPgEfK2iu+wAQ7G9XtgXr zCWqbwuHW48kEEQtTny3dFmZrnujNEy13djB4XQ2HLJ4x+ZB3GdEHZ1J5QqqCeu5rB DdlQrflJp4OHqetFDcsmUWeCSGAL94qex3lkro+Q2P8LUDd/4rOvs7STpUIijFgyoU HbU94z2on57xA== From: Puranjay Mohan To: Albert Ou , Alexei Starovoitov , Andrew Morton , Andrii Nakryiko , bpf@vger.kernel.org, Daniel Borkmann , "David S. Miller" , Eduard Zingerman , Eric Dumazet , Hao Luo , Helge Deller , Jakub Kicinski , "James E.J. Bottomley" , Jiri Olsa , John Fastabend , KP Singh , linux-kernel@vger.kernel.org, linux-parisc@vger.kernel.org, linux-riscv@lists.infradead.org, Martin KaFai Lau , Mykola Lysenko , netdev@vger.kernel.org, Palmer Dabbelt , Paolo Abeni , Paul Walmsley , Puranjay Mohan , Puranjay Mohan , Shuah Khan , Song Liu , Stanislav Fomichev , Yonghong Song Subject: [PATCH bpf-next v2 2/4] bpf: bpf_csum_diff: optimize and homogenize for all archs Date: Wed, 23 Oct 2024 15:39:20 +0000 Message-Id: <20241023153922.86909-3-puranjay@kernel.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20241023153922.86909-1-puranjay@kernel.org> References: <20241023153922.86909-1-puranjay@kernel.org> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Optimization ------------ The current implementation copies the 'from' and 'to' buffers to a scratchpad and it takes the bitwise NOT of 'from' buffer while copying. In the next step csum_partial() is called with this scratchpad. so, mathematically, the current implementation is doing: result = csum(to - from) Here, 'to' and '~ from' are copied in to the scratchpad buffer, we need it in the scratchpad buffer because csum_partial() takes a single contiguous buffer and not two disjoint buffers like 'to' and 'from'. We can re write this equation to: result = csum(to) - csum(from) using the distributive property of csum(). this allows 'to' and 'from' to be at different locations and therefore this scratchpad and copying is not needed. This in C code will look like: result = csum_sub(csum_partial(to, to_size, seed), csum_partial(from, from_size, 0)); 2. Homogenization -------------- The bpf_csum_diff() helper calls csum_partial() which is implemented by some architectures like arm and x86 but other architectures rely on the generic implementation in lib/checksum.c The generic implementation in lib/checksum.c returns a 16 bit value but the arch specific implementations can return more than 16 bits, this works out in most places because before the result is used, it is passed through csum_fold() that turns it into a 16-bit value. bpf_csum_diff() directly returns the value from csum_partial() and therefore the returned values could be different on different architectures. see discussion in [1]: for the int value 28 the calculated checksums are: x86 : -29 : 0xffffffe3 generic (arm64, riscv) : 65507 : 0x0000ffe3 arm : 131042 : 0x0001ffe2 Pass the result of bpf_csum_diff() through from32to16() before returning to homogenize this result for all architectures. NOTE: from32to16() is used instead of csum_fold() because csum_fold() does from32to16() + bitwise NOT of the result, which is not what we want to do here. [1] https://lore.kernel.org/bpf/CAJ+HfNiQbOcqCLxFUP2FMm5QrLXUUaj852Fxe3hn_2JNiucn6g@mail.gmail.com/ Signed-off-by: Puranjay Mohan Acked-by: Daniel Borkmann Reviewed-by: Toke Høiland-Jørgensen --- net/core/filter.c | 37 +++++++++---------------------------- 1 file changed, 9 insertions(+), 28 deletions(-) diff --git a/net/core/filter.c b/net/core/filter.c index bd0d08bf76bb8..e00bec7de9edd 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -1654,18 +1654,6 @@ void sk_reuseport_prog_free(struct bpf_prog *prog) bpf_prog_destroy(prog); } -struct bpf_scratchpad { - union { - __be32 diff[MAX_BPF_STACK / sizeof(__be32)]; - u8 buff[MAX_BPF_STACK]; - }; - local_lock_t bh_lock; -}; - -static DEFINE_PER_CPU(struct bpf_scratchpad, bpf_sp) = { - .bh_lock = INIT_LOCAL_LOCK(bh_lock), -}; - static inline int __bpf_try_make_writable(struct sk_buff *skb, unsigned int write_len) { @@ -2022,11 +2010,6 @@ static const struct bpf_func_proto bpf_l4_csum_replace_proto = { BPF_CALL_5(bpf_csum_diff, __be32 *, from, u32, from_size, __be32 *, to, u32, to_size, __wsum, seed) { - struct bpf_scratchpad *sp = this_cpu_ptr(&bpf_sp); - u32 diff_size = from_size + to_size; - int i, j = 0; - __wsum ret; - /* This is quite flexible, some examples: * * from_size == 0, to_size > 0, seed := csum --> pushing data @@ -2035,19 +2018,17 @@ BPF_CALL_5(bpf_csum_diff, __be32 *, from, u32, from_size, * * Even for diffing, from_size and to_size don't need to be equal. */ - if (unlikely(((from_size | to_size) & (sizeof(__be32) - 1)) || - diff_size > sizeof(sp->diff))) - return -EINVAL; - local_lock_nested_bh(&bpf_sp.bh_lock); - for (i = 0; i < from_size / sizeof(__be32); i++, j++) - sp->diff[j] = ~from[i]; - for (i = 0; i < to_size / sizeof(__be32); i++, j++) - sp->diff[j] = to[i]; + if (from_size && to_size) + return csum_from32to16(csum_sub(csum_partial(to, to_size, seed), + csum_partial(from, from_size, 0))); + if (to_size) + return csum_from32to16(csum_partial(to, to_size, seed)); - ret = csum_partial(sp->diff, diff_size, seed); - local_unlock_nested_bh(&bpf_sp.bh_lock); - return ret; + if (from_size) + return csum_from32to16(~csum_partial(from, from_size, ~seed)); + + return seed; } static const struct bpf_func_proto bpf_csum_diff_proto = { -- 2.40.1 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 5B984CFA44E for ; Wed, 23 Oct 2024 16:21:47 +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:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Cc:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=cC2K4hgXgJdv+udUEplQebPj0d9ZQVTa/jpkceu7s1c=; b=1pWuVv3bduoVW6 Y5PvolBVloyiLYtCDoiBzAJX0qGtfqgHUCxXiA8WVr9qh8NyO2X4UCjke8QXBmmgmc28IWmnSVj9I l+Et+X+sozKHP8i4uI4IWtixOqd2BkdAPjiiwyAmdht0PZSaSAsgMKy0dTjkJzjQD5FhY5VvvGHAR 4i8c0tYLDMM9bod1O3tF4AmXmUlUVYtBJhYZRBOzVIbn4rPtgrLIvlBGQ+aNu5uuL+1J20Na0FHcJ q7WFLzMYTUPdW7ujjAj0gUJvRr1MpLOI/j9J1nZVtXDQQ5Lbe6WusWzwmqwvZ/ufHpeHVZS4cVqCi QtEl7NJpFgQkXX3yl6aQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1t3e7C-0000000F7WA-43B5; Wed, 23 Oct 2024 16:21:42 +0000 Received: from nyc.source.kernel.org ([147.75.193.91]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1t3dSi-0000000Ezfx-29BD for linux-riscv@lists.infradead.org; Wed, 23 Oct 2024 15:39:54 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by nyc.source.kernel.org (Postfix) with ESMTP id 3EA42A40A22; Wed, 23 Oct 2024 15:39:42 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B94B1C4CEC6; Wed, 23 Oct 2024 15:39:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1729697991; bh=hs0lXbcOH7c9T/cGcTNkAHvTScTMvbdw0SB7nKBj1RE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=CLXkRVYMKhLzKMnLaS5EdZKHPPcUn+76PrLIXutI7U7lnmOtG7xAlx/T6eUgfP9Lf iRnHCzrrhQzMSO30G8hyKYGiQlNWbYQe1UdjYh5qk3fEm4Sw4L9HlRQUGDG92IZIdR 1lPKPE9Z580GvVAMZTQ2iKxapj4MdVIlSXR425bYdCaYVAPgEfK2iu+wAQ7G9XtgXr zCWqbwuHW48kEEQtTny3dFmZrnujNEy13djB4XQ2HLJ4x+ZB3GdEHZ1J5QqqCeu5rB DdlQrflJp4OHqetFDcsmUWeCSGAL94qex3lkro+Q2P8LUDd/4rOvs7STpUIijFgyoU HbU94z2on57xA== From: Puranjay Mohan To: Albert Ou , Alexei Starovoitov , Andrew Morton , Andrii Nakryiko , bpf@vger.kernel.org, Daniel Borkmann , "David S. Miller" , Eduard Zingerman , Eric Dumazet , Hao Luo , Helge Deller , Jakub Kicinski , "James E.J. Bottomley" , Jiri Olsa , John Fastabend , KP Singh , linux-kernel@vger.kernel.org, linux-parisc@vger.kernel.org, linux-riscv@lists.infradead.org, Martin KaFai Lau , Mykola Lysenko , netdev@vger.kernel.org, Palmer Dabbelt , Paolo Abeni , Paul Walmsley , Puranjay Mohan , Puranjay Mohan , Shuah Khan , Song Liu , Stanislav Fomichev , Yonghong Song Subject: [PATCH bpf-next v2 2/4] bpf: bpf_csum_diff: optimize and homogenize for all archs Date: Wed, 23 Oct 2024 15:39:20 +0000 Message-Id: <20241023153922.86909-3-puranjay@kernel.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20241023153922.86909-1-puranjay@kernel.org> References: <20241023153922.86909-1-puranjay@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241023_083952_716353_C64A6AA4 X-CRM114-Status: GOOD ( 19.62 ) X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org MS4gT3B0aW1pemF0aW9uCiAgIC0tLS0tLS0tLS0tLQoKVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRp b24gY29waWVzIHRoZSAnZnJvbScgYW5kICd0bycgYnVmZmVycyB0byBhCnNjcmF0Y2hwYWQgYW5k IGl0IHRha2VzIHRoZSBiaXR3aXNlIE5PVCBvZiAnZnJvbScgYnVmZmVyIHdoaWxlIGNvcHlpbmcu CkluIHRoZSBuZXh0IHN0ZXAgY3N1bV9wYXJ0aWFsKCkgaXMgY2FsbGVkIHdpdGggdGhpcyBzY3Jh dGNocGFkLgoKc28sIG1hdGhlbWF0aWNhbGx5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBp cyBkb2luZzoKCglyZXN1bHQgPSBjc3VtKHRvIC0gZnJvbSkKCkhlcmUsICd0bycgIGFuZCAnfiBm cm9tJyBhcmUgY29waWVkIGluIHRvIHRoZSBzY3JhdGNocGFkIGJ1ZmZlciwgd2UgbmVlZAppdCBp biB0aGUgc2NyYXRjaHBhZCBidWZmZXIgYmVjYXVzZSBjc3VtX3BhcnRpYWwoKSB0YWtlcyBhIHNp bmdsZQpjb250aWd1b3VzIGJ1ZmZlciBhbmQgbm90IHR3byBkaXNqb2ludCBidWZmZXJzIGxpa2Ug J3RvJyBhbmQgJ2Zyb20nLgoKV2UgY2FuIHJlIHdyaXRlIHRoaXMgZXF1YXRpb24gdG86CgoJcmVz dWx0ID0gY3N1bSh0bykgLSBjc3VtKGZyb20pCgp1c2luZyB0aGUgZGlzdHJpYnV0aXZlIHByb3Bl cnR5IG9mIGNzdW0oKS4KCnRoaXMgYWxsb3dzICd0bycgYW5kICdmcm9tJyB0byBiZSBhdCBkaWZm ZXJlbnQgbG9jYXRpb25zIGFuZCB0aGVyZWZvcmUKdGhpcyBzY3JhdGNocGFkIGFuZCBjb3B5aW5n IGlzIG5vdCBuZWVkZWQuCgpUaGlzIGluIEMgY29kZSB3aWxsIGxvb2sgbGlrZToKCnJlc3VsdCA9 IGNzdW1fc3ViKGNzdW1fcGFydGlhbCh0bywgdG9fc2l6ZSwgc2VlZCksCiAgICAgICAgICAgICAg ICAgIGNzdW1fcGFydGlhbChmcm9tLCBmcm9tX3NpemUsIDApKTsKCjIuIEhvbW9nZW5pemF0aW9u CiAgIC0tLS0tLS0tLS0tLS0tCgpUaGUgYnBmX2NzdW1fZGlmZigpIGhlbHBlciBjYWxscyBjc3Vt X3BhcnRpYWwoKSB3aGljaCBpcyBpbXBsZW1lbnRlZCBieQpzb21lIGFyY2hpdGVjdHVyZXMgbGlr ZSBhcm0gYW5kIHg4NiBidXQgb3RoZXIgYXJjaGl0ZWN0dXJlcyByZWx5IG9uIHRoZQpnZW5lcmlj IGltcGxlbWVudGF0aW9uIGluIGxpYi9jaGVja3N1bS5jCgpUaGUgZ2VuZXJpYyBpbXBsZW1lbnRh dGlvbiBpbiBsaWIvY2hlY2tzdW0uYyByZXR1cm5zIGEgMTYgYml0IHZhbHVlIGJ1dAp0aGUgYXJj aCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgY2FuIHJldHVybiBtb3JlIHRoYW4gMTYgYml0cywg dGhpcwp3b3JrcyBvdXQgaW4gbW9zdCBwbGFjZXMgYmVjYXVzZSBiZWZvcmUgdGhlIHJlc3VsdCBp cyB1c2VkLCBpdCBpcyBwYXNzZWQKdGhyb3VnaCBjc3VtX2ZvbGQoKSB0aGF0IHR1cm5zIGl0IGlu dG8gYSAxNi1iaXQgdmFsdWUuCgpicGZfY3N1bV9kaWZmKCkgZGlyZWN0bHkgcmV0dXJucyB0aGUg dmFsdWUgZnJvbSBjc3VtX3BhcnRpYWwoKSBhbmQKdGhlcmVmb3JlIHRoZSByZXR1cm5lZCB2YWx1 ZXMgY291bGQgYmUgZGlmZmVyZW50IG9uIGRpZmZlcmVudAphcmNoaXRlY3R1cmVzLiBzZWUgZGlz Y3Vzc2lvbiBpbiBbMV06Cgpmb3IgdGhlIGludCB2YWx1ZSAyOCB0aGUgY2FsY3VsYXRlZCBjaGVj a3N1bXMgYXJlOgoKeDg2ICAgICAgICAgICAgICAgICAgICA6ICAgIC0yOSA6IDB4ZmZmZmZmZTMK Z2VuZXJpYyAoYXJtNjQsIHJpc2N2KSA6ICA2NTUwNyA6IDB4MDAwMGZmZTMKYXJtICAgICAgICAg ICAgICAgICAgICA6IDEzMTA0MiA6IDB4MDAwMWZmZTIKClBhc3MgdGhlIHJlc3VsdCBvZiBicGZf Y3N1bV9kaWZmKCkgdGhyb3VnaCBmcm9tMzJ0bzE2KCkgYmVmb3JlIHJldHVybmluZwp0byBob21v Z2VuaXplIHRoaXMgcmVzdWx0IGZvciBhbGwgYXJjaGl0ZWN0dXJlcy4KCk5PVEU6IGZyb20zMnRv MTYoKSBpcyB1c2VkIGluc3RlYWQgb2YgY3N1bV9mb2xkKCkgYmVjYXVzZSBjc3VtX2ZvbGQoKQpk b2VzIGZyb20zMnRvMTYoKSArIGJpdHdpc2UgTk9UIG9mIHRoZSByZXN1bHQsIHdoaWNoIGlzIG5v dCB3aGF0IHdlIHdhbnQKdG8gZG8gaGVyZS4KClsxXSBodHRwczovL2xvcmUua2VybmVsLm9yZy9i cGYvQ0FKK0hmTmlRYk9jcUNMeEZVUDJGTW01UXJMWFVVYWo4NTJGeGUzaG5fMkpOaXVjbjZnQG1h aWwuZ21haWwuY29tLwoKU2lnbmVkLW9mZi1ieTogUHVyYW5qYXkgTW9oYW4gPHB1cmFuamF5QGtl cm5lbC5vcmc+CkFja2VkLWJ5OiBEYW5pZWwgQm9ya21hbm4gPGRhbmllbEBpb2dlYXJib3gubmV0 PgpSZXZpZXdlZC1ieTogVG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2VuIDx0b2tlQHJlZGhhdC5jb20+ Ci0tLQogbmV0L2NvcmUvZmlsdGVyLmMgfCAzNyArKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAyOCBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9uZXQvY29yZS9maWx0ZXIuYyBiL25ldC9jb3JlL2ZpbHRlci5jCmlu ZGV4IGJkMGQwOGJmNzZiYjguLmUwMGJlYzdkZTllZGQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Zp bHRlci5jCisrKyBiL25ldC9jb3JlL2ZpbHRlci5jCkBAIC0xNjU0LDE4ICsxNjU0LDYgQEAgdm9p ZCBza19yZXVzZXBvcnRfcHJvZ19mcmVlKHN0cnVjdCBicGZfcHJvZyAqcHJvZykKIAkJYnBmX3By b2dfZGVzdHJveShwcm9nKTsKIH0KIAotc3RydWN0IGJwZl9zY3JhdGNocGFkIHsKLQl1bmlvbiB7 Ci0JCV9fYmUzMiBkaWZmW01BWF9CUEZfU1RBQ0sgLyBzaXplb2YoX19iZTMyKV07Ci0JCXU4ICAg ICBidWZmW01BWF9CUEZfU1RBQ0tdOwotCX07Ci0JbG9jYWxfbG9ja190CWJoX2xvY2s7Ci19Owot Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGJwZl9zY3JhdGNocGFkLCBicGZfc3ApID0g ewotCS5iaF9sb2NrCT0gSU5JVF9MT0NBTF9MT0NLKGJoX2xvY2spLAotfTsKLQogc3RhdGljIGlu bGluZSBpbnQgX19icGZfdHJ5X21ha2Vfd3JpdGFibGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJ CQkJICB1bnNpZ25lZCBpbnQgd3JpdGVfbGVuKQogewpAQCAtMjAyMiwxMSArMjAxMCw2IEBAIHN0 YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2w0X2NzdW1fcmVwbGFjZV9wcm90 byA9IHsKIEJQRl9DQUxMXzUoYnBmX2NzdW1fZGlmZiwgX19iZTMyICosIGZyb20sIHUzMiwgZnJv bV9zaXplLAogCSAgIF9fYmUzMiAqLCB0bywgdTMyLCB0b19zaXplLCBfX3dzdW0sIHNlZWQpCiB7 Ci0Jc3RydWN0IGJwZl9zY3JhdGNocGFkICpzcCA9IHRoaXNfY3B1X3B0cigmYnBmX3NwKTsKLQl1 MzIgZGlmZl9zaXplID0gZnJvbV9zaXplICsgdG9fc2l6ZTsKLQlpbnQgaSwgaiA9IDA7Ci0JX193 c3VtIHJldDsKLQogCS8qIFRoaXMgaXMgcXVpdGUgZmxleGlibGUsIHNvbWUgZXhhbXBsZXM6CiAJ ICoKIAkgKiBmcm9tX3NpemUgPT0gMCwgdG9fc2l6ZSA+IDAsICBzZWVkIDo9IGNzdW0gLS0+IHB1 c2hpbmcgZGF0YQpAQCAtMjAzNSwxOSArMjAxOCwxNyBAQCBCUEZfQ0FMTF81KGJwZl9jc3VtX2Rp ZmYsIF9fYmUzMiAqLCBmcm9tLCB1MzIsIGZyb21fc2l6ZSwKIAkgKgogCSAqIEV2ZW4gZm9yIGRp ZmZpbmcsIGZyb21fc2l6ZSBhbmQgdG9fc2l6ZSBkb24ndCBuZWVkIHRvIGJlIGVxdWFsLgogCSAq LwotCWlmICh1bmxpa2VseSgoKGZyb21fc2l6ZSB8IHRvX3NpemUpICYgKHNpemVvZihfX2JlMzIp IC0gMSkpIHx8Ci0JCSAgICAgZGlmZl9zaXplID4gc2l6ZW9mKHNwLT5kaWZmKSkpCi0JCXJldHVy biAtRUlOVkFMOwogCi0JbG9jYWxfbG9ja19uZXN0ZWRfYmgoJmJwZl9zcC5iaF9sb2NrKTsKLQlm b3IgKGkgPSAwOyBpIDwgZnJvbV9zaXplIC8gc2l6ZW9mKF9fYmUzMik7IGkrKywgaisrKQotCQlz cC0+ZGlmZltqXSA9IH5mcm9tW2ldOwotCWZvciAoaSA9IDA7IGkgPCAgIHRvX3NpemUgLyBzaXpl b2YoX19iZTMyKTsgaSsrLCBqKyspCi0JCXNwLT5kaWZmW2pdID0gdG9baV07CisJaWYgKGZyb21f c2l6ZSAmJiB0b19zaXplKQorCQlyZXR1cm4gY3N1bV9mcm9tMzJ0bzE2KGNzdW1fc3ViKGNzdW1f cGFydGlhbCh0bywgdG9fc2l6ZSwgc2VlZCksCisJCQkJCQljc3VtX3BhcnRpYWwoZnJvbSwgZnJv bV9zaXplLCAwKSkpOworCWlmICh0b19zaXplKQorCQlyZXR1cm4gY3N1bV9mcm9tMzJ0bzE2KGNz dW1fcGFydGlhbCh0bywgdG9fc2l6ZSwgc2VlZCkpOwogCi0JcmV0ID0gY3N1bV9wYXJ0aWFsKHNw LT5kaWZmLCBkaWZmX3NpemUsIHNlZWQpOwotCWxvY2FsX3VubG9ja19uZXN0ZWRfYmgoJmJwZl9z cC5iaF9sb2NrKTsKLQlyZXR1cm4gcmV0OworCWlmIChmcm9tX3NpemUpCisJCXJldHVybiBjc3Vt X2Zyb20zMnRvMTYofmNzdW1fcGFydGlhbChmcm9tLCBmcm9tX3NpemUsIH5zZWVkKSk7CisKKwly ZXR1cm4gc2VlZDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZf Y3N1bV9kaWZmX3Byb3RvID0gewotLSAKMi40MC4xCgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJp c2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1h bi9saXN0aW5mby9saW51eC1yaXNjdgo=