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 X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3EA6FC433E0 for ; Wed, 20 May 2020 02:45:38 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 0EBD820829 for ; Wed, 20 May 2020 02:45:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="C78FFGpY"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="pprZAfHn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0EBD820829 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=09MWYrpKAOOVVLafAN9KeaJWVxrBxuc6Kh9t+T3rATA=; b=C78FFGpYKPe839 867NzqJeA3ze/6OSS69cU/UbSQLvjpSq6riGHtCDecsUKMJr/T9/ZSLn0dJrGbk8Ye0bep4g9ZUFk ugEC7Hh0Ce+Na7pd7qB9Hxlj/BL1Xz+IRRZze2G4X1EaP+pnkzEj60o01bYmrIqCTfCD/FT18qQ78 0uQDVnIULoA47A3jdwfEPXG06Y0T5dBnCASqtrjhoR5wHw0auIC+BWe6xsp9xaFOTEzHCSkwzx2va o02gnpc0QPVbISUGwt0maOoBL0wLfWmyP1JDtLVAkVgiucOcB4Anm8PR7c0LfPdO0zFUFlt0AFC0Z oaqBUDoLxYqcExnUqLOQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jbEjZ-0006Uz-SV; Wed, 20 May 2020 02:45:29 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jbEjV-0006Nx-Gt; Wed, 20 May 2020 02:45:27 +0000 X-UUID: f79612a43a304c68b810a722972f12fc-20200519 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=m3DuqKpgf4iRj54o8NbAF84k6JTIXvziVvcOSZRHoIg=; b=pprZAfHnMW2iiLtKhiX6rF6fVqTf65pM0W4WuwpZ+7QM979ced+CrQKXmSB+0aS/EO/+ot+d3WOSRfwJgi/TtOGa/VFJbibDdBAipcHmAHNj/b77huu+CB+b6YQX5uXVdh9S8DJED90r3cqdGgwXPs9idY0Co7z9wFWqqWRC4/Y=; X-UUID: f79612a43a304c68b810a722972f12fc-20200519 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 2097067973; Tue, 19 May 2020 18:45:22 -0800 Received: from MTKMBS01N2.mediatek.inc (172.21.101.79) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 19 May 2020 19:45:19 -0700 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs01n2.mediatek.inc (172.21.101.79) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 20 May 2020 10:45:16 +0800 Received: from [172.21.84.99] (172.21.84.99) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 20 May 2020 10:45:13 +0800 Message-ID: <1589942718.29577.3.camel@mtksdccf07> Subject: Re: [PATCH v4 1/4] rcu/kasan: record and print call_rcu() call stack From: Walter Wu To: Andrey Konovalov Date: Wed, 20 May 2020 10:45:18 +0800 In-Reply-To: References: <20200519022359.24115-1-walter-zh.wu@mediatek.com> X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-TM-SNTS-SMTP: 6304041814EFF626743B3D340E4065BDC8A74CE1B689507D0DDD49A81C3153BD2000:8 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200519_194525_639906_52AC9802 X-CRM114-Status: GOOD ( 31.95 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: wsd_upstream , "Paul E . McKenney" , Linux Memory Management List , Lai Jiangshan , Josh Triplett , kasan-dev , LKML , Joel Fernandes , linux-mediatek@lists.infradead.org, Alexander Potapenko , Linux ARM , Matthias Brugger , Andrey Ryabinin , Andrew Morton , Dmitry Vyukov , Mathieu Desnoyers Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org Hi Andrey, On Tue, 2020-05-19 at 16:52 +0200, 'Andrey Konovalov' via kasan-dev wrote: > On Tue, May 19, 2020 at 4:24 AM Walter Wu wrote: > > > > This feature will record the last two call_rcu() call stacks and > > prints up to 2 call_rcu() call stacks in KASAN report. > > > > When call_rcu() is called, we store the call_rcu() call stack into > > slub alloc meta-data, so that the KASAN report can print rcu stack. > > > > [1]https://bugzilla.kernel.org/show_bug.cgi?id=198437 > > [2]https://groups.google.com/forum/#!searchin/kasan-dev/better$20stack$20traces$20for$20rcu%7Csort:date/kasan-dev/KQsjT_88hDE/7rNUZprRBgAJ > > > > Signed-off-by: Walter Wu > > Suggested-by: Dmitry Vyukov > > Cc: Andrey Ryabinin > > Cc: Dmitry Vyukov > > Cc: Alexander Potapenko > > Cc: Andrew Morton > > Cc: Paul E. McKenney > > Cc: Josh Triplett > > Cc: Mathieu Desnoyers > > Cc: Lai Jiangshan > > Cc: Joel Fernandes > > --- > > include/linux/kasan.h | 2 ++ > > kernel/rcu/tree.c | 2 ++ > > lib/Kconfig.kasan | 2 ++ > > mm/kasan/common.c | 4 ++-- > > mm/kasan/generic.c | 19 +++++++++++++++++++ > > mm/kasan/kasan.h | 10 ++++++++++ > > mm/kasan/report.c | 24 ++++++++++++++++++++++++ > > 7 files changed, 61 insertions(+), 2 deletions(-) > > > > diff --git a/include/linux/kasan.h b/include/linux/kasan.h > > index 31314ca7c635..23b7ee00572d 100644 > > --- a/include/linux/kasan.h > > +++ b/include/linux/kasan.h > > @@ -174,11 +174,13 @@ static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } > > > > void kasan_cache_shrink(struct kmem_cache *cache); > > void kasan_cache_shutdown(struct kmem_cache *cache); > > +void kasan_record_aux_stack(void *ptr); > > > > #else /* CONFIG_KASAN_GENERIC */ > > > > static inline void kasan_cache_shrink(struct kmem_cache *cache) {} > > static inline void kasan_cache_shutdown(struct kmem_cache *cache) {} > > +static inline void kasan_record_aux_stack(void *ptr) {} > > > > #endif /* CONFIG_KASAN_GENERIC */ > > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > index 06548e2ebb72..36a4ff7f320b 100644 > > --- a/kernel/rcu/tree.c > > +++ b/kernel/rcu/tree.c > > @@ -57,6 +57,7 @@ > > #include > > #include > > #include > > +#include > > #include "../time/tick-internal.h" > > > > #include "tree.h" > > @@ -2668,6 +2669,7 @@ __call_rcu(struct rcu_head *head, rcu_callback_t func) > > head->func = func; > > head->next = NULL; > > local_irq_save(flags); > > + kasan_record_aux_stack(head); > > rdp = this_cpu_ptr(&rcu_data); > > > > /* Add the callback to our list. */ > > diff --git a/lib/Kconfig.kasan b/lib/Kconfig.kasan > > index 81f5464ea9e1..4e83cf6e3caa 100644 > > --- a/lib/Kconfig.kasan > > +++ b/lib/Kconfig.kasan > > @@ -58,6 +58,8 @@ config KASAN_GENERIC > > For better error detection enable CONFIG_STACKTRACE. > > Currently CONFIG_KASAN_GENERIC doesn't work with CONFIG_DEBUG_SLAB > > (the resulting kernel does not boot). > > + In generic mode KASAN prints the last two call_rcu() call stacks in > > + reports. > > I don't think we need this here, mentioning this in the documentation is fine. > Ok, we will remove it. Only mention it in the documentation. > > > > > config KASAN_SW_TAGS > > bool "Software tag-based mode" > > diff --git a/mm/kasan/common.c b/mm/kasan/common.c > > index 2906358e42f0..8bc618289bb1 100644 > > --- a/mm/kasan/common.c > > +++ b/mm/kasan/common.c > > @@ -41,7 +41,7 @@ > > #include "kasan.h" > > #include "../slab.h" > > > > -static inline depot_stack_handle_t save_stack(gfp_t flags) > > +depot_stack_handle_t kasan_save_stack(gfp_t flags) > > { > > unsigned long entries[KASAN_STACK_DEPTH]; > > unsigned int nr_entries; > > @@ -54,7 +54,7 @@ static inline depot_stack_handle_t save_stack(gfp_t flags) > > static inline void set_track(struct kasan_track *track, gfp_t flags) > > { > > track->pid = current->pid; > > - track->stack = save_stack(flags); > > + track->stack = kasan_save_stack(flags); > > } > > > > void kasan_enable_current(void) > > diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c > > index 56ff8885fe2e..3372bdcaf92a 100644 > > --- a/mm/kasan/generic.c > > +++ b/mm/kasan/generic.c > > @@ -325,3 +325,22 @@ DEFINE_ASAN_SET_SHADOW(f2); > > DEFINE_ASAN_SET_SHADOW(f3); > > DEFINE_ASAN_SET_SHADOW(f5); > > DEFINE_ASAN_SET_SHADOW(f8); > > + > > +void kasan_record_aux_stack(void *addr) > > +{ > > + struct page *page = kasan_addr_to_page(addr); > > + struct kmem_cache *cache; > > + struct kasan_alloc_meta *alloc_info; > > + void *object; > > + > > + if (!(page && PageSlab(page))) > > + return; > > + > > + cache = page->slab_cache; > > + object = nearest_obj(cache, page, addr); > > + alloc_info = get_alloc_info(cache, object); > > + > > + /* record the last two call_rcu() call stacks */ > > + alloc_info->aux_stack[1] = alloc_info->aux_stack[0]; > > + alloc_info->aux_stack[0] = kasan_save_stack(GFP_NOWAIT); > > +} > > diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h > > index e8f37199d885..a7391bc83070 100644 > > --- a/mm/kasan/kasan.h > > +++ b/mm/kasan/kasan.h > > @@ -104,7 +104,15 @@ struct kasan_track { > > > > struct kasan_alloc_meta { > > struct kasan_track alloc_track; > > +#ifdef CONFIG_KASAN_GENERIC > > + /* > > + * call_rcu() call stack is stored into struct kasan_alloc_meta. > > + * The free stack is stored into struct kasan_free_meta. > > + */ > > + depot_stack_handle_t aux_stack[2]; > > +#else > > struct kasan_track free_track[KASAN_NR_FREE_STACKS]; > > +#endif > > #ifdef CONFIG_KASAN_SW_TAGS_IDENTIFY > > u8 free_pointer_tag[KASAN_NR_FREE_STACKS]; > > u8 free_track_idx; > > @@ -159,6 +167,8 @@ void kasan_report_invalid_free(void *object, unsigned long ip); > > > > struct page *kasan_addr_to_page(const void *addr); > > > > +depot_stack_handle_t kasan_save_stack(gfp_t flags); > > + > > #if defined(CONFIG_KASAN_GENERIC) && \ > > (defined(CONFIG_SLAB) || defined(CONFIG_SLUB)) > > void quarantine_put(struct kasan_free_meta *info, struct kmem_cache *cache); > > diff --git a/mm/kasan/report.c b/mm/kasan/report.c > > index 80f23c9da6b0..6f8f2bf8f53b 100644 > > --- a/mm/kasan/report.c > > +++ b/mm/kasan/report.c > > @@ -179,6 +179,17 @@ static struct kasan_track *kasan_get_free_track(struct kmem_cache *cache, > > return &alloc_meta->free_track[i]; > > } > > > > +#ifdef CONFIG_KASAN_GENERIC > > +static void print_stack(depot_stack_handle_t stack) > > Let's put this function just before print_track() and reuse there. > Ok. > > +{ > > + unsigned long *entries; > > + unsigned int nr_entries; > > + > > + nr_entries = stack_depot_fetch(stack, &entries); > > + stack_trace_print(entries, nr_entries, 0); > > +} > > +#endif > > + > > static void describe_object(struct kmem_cache *cache, void *object, > > const void *addr, u8 tag) > > { > > @@ -192,6 +203,19 @@ static void describe_object(struct kmem_cache *cache, void *object, > > free_track = kasan_get_free_track(cache, object, tag); > > print_track(free_track, "Freed"); > > pr_err("\n"); > > + > > +#ifdef CONFIG_KASAN_GENERIC > > + if (alloc_info->aux_stack[0]) { > > + pr_err("Last one call_rcu() call stack:\n"); > > Could you change this to "Last call_rcu():\n", > > > + print_stack(alloc_info->aux_stack[0]); > > + pr_err("\n"); > > + } > > + if (alloc_info->aux_stack[1]) { > > + pr_err("Second to last call_rcu() call stack:\n"); > > and this to "Second to last call_rcu():\n"? > > It's shorter, but provides the same info. > We will change their name. Thank you for your review. > > > > + print_stack(alloc_info->aux_stack[1]); > > + pr_err("\n"); > > + } > > +#endif > > } > > > > describe_object_addr(cache, object, addr); > > -- > > 2.18.0 > > > > -- > > You received this message because you are subscribed to the Google Groups "kasan-dev" group. > > To unsubscribe from this group and stop receiving emails from it, send an email to kasan-dev+unsubscribe@googlegroups.com. > > To view this discussion on the web visit https://groups.google.com/d/msgid/kasan-dev/20200519022359.24115-1-walter-zh.wu%40mediatek.com. > _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek 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 X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A264C433DF for ; Wed, 20 May 2020 02:45:35 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 9CF0520578 for ; Wed, 20 May 2020 02:45:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="UIZgsITy"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="pprZAfHn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9CF0520578 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=df7C4TW6kqnz3Cl9bx8IS4mz4ikjKrGPTWtqxja2178=; b=UIZgsITySqnP1/ MIXcc7HEdwfNgDL7xEY2OJ/m+snJn9my/t1C50e4I2cCyZRjHwu2Q+smtchdLM/O5oFqnKWi2hWR4 UHIMFe3osKj0yYZTbY6RX4GZKKBkj3ROreuQ7T4M0ZPGYYeyPzpucyt7eJffXgXdXtHkXgO9vB0Db g2pAgD4fx4KqsvrpfbXJsDw63GPCWXV5Tow0rJFKktjRg+P0QSFyAGwjs2plGzbGINltCbvHJUKyY wMRHQ/SSmuSVRlFeIzjFwSu4Rgcs52FdAjlglAkDClr0wVVymf6J+N9y3FQ3/kBHRBP6FrYzHcV58 PE1gA85kSHeFJtWK74lw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jbEjb-0006X8-MW; Wed, 20 May 2020 02:45:31 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jbEjV-0006Nx-Gt; Wed, 20 May 2020 02:45:27 +0000 X-UUID: f79612a43a304c68b810a722972f12fc-20200519 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=m3DuqKpgf4iRj54o8NbAF84k6JTIXvziVvcOSZRHoIg=; b=pprZAfHnMW2iiLtKhiX6rF6fVqTf65pM0W4WuwpZ+7QM979ced+CrQKXmSB+0aS/EO/+ot+d3WOSRfwJgi/TtOGa/VFJbibDdBAipcHmAHNj/b77huu+CB+b6YQX5uXVdh9S8DJED90r3cqdGgwXPs9idY0Co7z9wFWqqWRC4/Y=; X-UUID: f79612a43a304c68b810a722972f12fc-20200519 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 2097067973; Tue, 19 May 2020 18:45:22 -0800 Received: from MTKMBS01N2.mediatek.inc (172.21.101.79) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 19 May 2020 19:45:19 -0700 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs01n2.mediatek.inc (172.21.101.79) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 20 May 2020 10:45:16 +0800 Received: from [172.21.84.99] (172.21.84.99) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 20 May 2020 10:45:13 +0800 Message-ID: <1589942718.29577.3.camel@mtksdccf07> Subject: Re: [PATCH v4 1/4] rcu/kasan: record and print call_rcu() call stack From: Walter Wu To: Andrey Konovalov Date: Wed, 20 May 2020 10:45:18 +0800 In-Reply-To: References: <20200519022359.24115-1-walter-zh.wu@mediatek.com> X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-TM-SNTS-SMTP: 6304041814EFF626743B3D340E4065BDC8A74CE1B689507D0DDD49A81C3153BD2000:8 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200519_194525_639906_52AC9802 X-CRM114-Status: GOOD ( 31.95 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: wsd_upstream , "Paul E . McKenney" , Linux Memory Management List , Lai Jiangshan , Josh Triplett , kasan-dev , LKML , Joel Fernandes , linux-mediatek@lists.infradead.org, Alexander Potapenko , Linux ARM , Matthias Brugger , Andrey Ryabinin , Andrew Morton , Dmitry Vyukov , Mathieu Desnoyers Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Andrey, On Tue, 2020-05-19 at 16:52 +0200, 'Andrey Konovalov' via kasan-dev wrote: > On Tue, May 19, 2020 at 4:24 AM Walter Wu wrote: > > > > This feature will record the last two call_rcu() call stacks and > > prints up to 2 call_rcu() call stacks in KASAN report. > > > > When call_rcu() is called, we store the call_rcu() call stack into > > slub alloc meta-data, so that the KASAN report can print rcu stack. > > > > [1]https://bugzilla.kernel.org/show_bug.cgi?id=198437 > > [2]https://groups.google.com/forum/#!searchin/kasan-dev/better$20stack$20traces$20for$20rcu%7Csort:date/kasan-dev/KQsjT_88hDE/7rNUZprRBgAJ > > > > Signed-off-by: Walter Wu > > Suggested-by: Dmitry Vyukov > > Cc: Andrey Ryabinin > > Cc: Dmitry Vyukov > > Cc: Alexander Potapenko > > Cc: Andrew Morton > > Cc: Paul E. McKenney > > Cc: Josh Triplett > > Cc: Mathieu Desnoyers > > Cc: Lai Jiangshan > > Cc: Joel Fernandes > > --- > > include/linux/kasan.h | 2 ++ > > kernel/rcu/tree.c | 2 ++ > > lib/Kconfig.kasan | 2 ++ > > mm/kasan/common.c | 4 ++-- > > mm/kasan/generic.c | 19 +++++++++++++++++++ > > mm/kasan/kasan.h | 10 ++++++++++ > > mm/kasan/report.c | 24 ++++++++++++++++++++++++ > > 7 files changed, 61 insertions(+), 2 deletions(-) > > > > diff --git a/include/linux/kasan.h b/include/linux/kasan.h > > index 31314ca7c635..23b7ee00572d 100644 > > --- a/include/linux/kasan.h > > +++ b/include/linux/kasan.h > > @@ -174,11 +174,13 @@ static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } > > > > void kasan_cache_shrink(struct kmem_cache *cache); > > void kasan_cache_shutdown(struct kmem_cache *cache); > > +void kasan_record_aux_stack(void *ptr); > > > > #else /* CONFIG_KASAN_GENERIC */ > > > > static inline void kasan_cache_shrink(struct kmem_cache *cache) {} > > static inline void kasan_cache_shutdown(struct kmem_cache *cache) {} > > +static inline void kasan_record_aux_stack(void *ptr) {} > > > > #endif /* CONFIG_KASAN_GENERIC */ > > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > index 06548e2ebb72..36a4ff7f320b 100644 > > --- a/kernel/rcu/tree.c > > +++ b/kernel/rcu/tree.c > > @@ -57,6 +57,7 @@ > > #include > > #include > > #include > > +#include > > #include "../time/tick-internal.h" > > > > #include "tree.h" > > @@ -2668,6 +2669,7 @@ __call_rcu(struct rcu_head *head, rcu_callback_t func) > > head->func = func; > > head->next = NULL; > > local_irq_save(flags); > > + kasan_record_aux_stack(head); > > rdp = this_cpu_ptr(&rcu_data); > > > > /* Add the callback to our list. */ > > diff --git a/lib/Kconfig.kasan b/lib/Kconfig.kasan > > index 81f5464ea9e1..4e83cf6e3caa 100644 > > --- a/lib/Kconfig.kasan > > +++ b/lib/Kconfig.kasan > > @@ -58,6 +58,8 @@ config KASAN_GENERIC > > For better error detection enable CONFIG_STACKTRACE. > > Currently CONFIG_KASAN_GENERIC doesn't work with CONFIG_DEBUG_SLAB > > (the resulting kernel does not boot). > > + In generic mode KASAN prints the last two call_rcu() call stacks in > > + reports. > > I don't think we need this here, mentioning this in the documentation is fine. > Ok, we will remove it. Only mention it in the documentation. > > > > > config KASAN_SW_TAGS > > bool "Software tag-based mode" > > diff --git a/mm/kasan/common.c b/mm/kasan/common.c > > index 2906358e42f0..8bc618289bb1 100644 > > --- a/mm/kasan/common.c > > +++ b/mm/kasan/common.c > > @@ -41,7 +41,7 @@ > > #include "kasan.h" > > #include "../slab.h" > > > > -static inline depot_stack_handle_t save_stack(gfp_t flags) > > +depot_stack_handle_t kasan_save_stack(gfp_t flags) > > { > > unsigned long entries[KASAN_STACK_DEPTH]; > > unsigned int nr_entries; > > @@ -54,7 +54,7 @@ static inline depot_stack_handle_t save_stack(gfp_t flags) > > static inline void set_track(struct kasan_track *track, gfp_t flags) > > { > > track->pid = current->pid; > > - track->stack = save_stack(flags); > > + track->stack = kasan_save_stack(flags); > > } > > > > void kasan_enable_current(void) > > diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c > > index 56ff8885fe2e..3372bdcaf92a 100644 > > --- a/mm/kasan/generic.c > > +++ b/mm/kasan/generic.c > > @@ -325,3 +325,22 @@ DEFINE_ASAN_SET_SHADOW(f2); > > DEFINE_ASAN_SET_SHADOW(f3); > > DEFINE_ASAN_SET_SHADOW(f5); > > DEFINE_ASAN_SET_SHADOW(f8); > > + > > +void kasan_record_aux_stack(void *addr) > > +{ > > + struct page *page = kasan_addr_to_page(addr); > > + struct kmem_cache *cache; > > + struct kasan_alloc_meta *alloc_info; > > + void *object; > > + > > + if (!(page && PageSlab(page))) > > + return; > > + > > + cache = page->slab_cache; > > + object = nearest_obj(cache, page, addr); > > + alloc_info = get_alloc_info(cache, object); > > + > > + /* record the last two call_rcu() call stacks */ > > + alloc_info->aux_stack[1] = alloc_info->aux_stack[0]; > > + alloc_info->aux_stack[0] = kasan_save_stack(GFP_NOWAIT); > > +} > > diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h > > index e8f37199d885..a7391bc83070 100644 > > --- a/mm/kasan/kasan.h > > +++ b/mm/kasan/kasan.h > > @@ -104,7 +104,15 @@ struct kasan_track { > > > > struct kasan_alloc_meta { > > struct kasan_track alloc_track; > > +#ifdef CONFIG_KASAN_GENERIC > > + /* > > + * call_rcu() call stack is stored into struct kasan_alloc_meta. > > + * The free stack is stored into struct kasan_free_meta. > > + */ > > + depot_stack_handle_t aux_stack[2]; > > +#else > > struct kasan_track free_track[KASAN_NR_FREE_STACKS]; > > +#endif > > #ifdef CONFIG_KASAN_SW_TAGS_IDENTIFY > > u8 free_pointer_tag[KASAN_NR_FREE_STACKS]; > > u8 free_track_idx; > > @@ -159,6 +167,8 @@ void kasan_report_invalid_free(void *object, unsigned long ip); > > > > struct page *kasan_addr_to_page(const void *addr); > > > > +depot_stack_handle_t kasan_save_stack(gfp_t flags); > > + > > #if defined(CONFIG_KASAN_GENERIC) && \ > > (defined(CONFIG_SLAB) || defined(CONFIG_SLUB)) > > void quarantine_put(struct kasan_free_meta *info, struct kmem_cache *cache); > > diff --git a/mm/kasan/report.c b/mm/kasan/report.c > > index 80f23c9da6b0..6f8f2bf8f53b 100644 > > --- a/mm/kasan/report.c > > +++ b/mm/kasan/report.c > > @@ -179,6 +179,17 @@ static struct kasan_track *kasan_get_free_track(struct kmem_cache *cache, > > return &alloc_meta->free_track[i]; > > } > > > > +#ifdef CONFIG_KASAN_GENERIC > > +static void print_stack(depot_stack_handle_t stack) > > Let's put this function just before print_track() and reuse there. > Ok. > > +{ > > + unsigned long *entries; > > + unsigned int nr_entries; > > + > > + nr_entries = stack_depot_fetch(stack, &entries); > > + stack_trace_print(entries, nr_entries, 0); > > +} > > +#endif > > + > > static void describe_object(struct kmem_cache *cache, void *object, > > const void *addr, u8 tag) > > { > > @@ -192,6 +203,19 @@ static void describe_object(struct kmem_cache *cache, void *object, > > free_track = kasan_get_free_track(cache, object, tag); > > print_track(free_track, "Freed"); > > pr_err("\n"); > > + > > +#ifdef CONFIG_KASAN_GENERIC > > + if (alloc_info->aux_stack[0]) { > > + pr_err("Last one call_rcu() call stack:\n"); > > Could you change this to "Last call_rcu():\n", > > > + print_stack(alloc_info->aux_stack[0]); > > + pr_err("\n"); > > + } > > + if (alloc_info->aux_stack[1]) { > > + pr_err("Second to last call_rcu() call stack:\n"); > > and this to "Second to last call_rcu():\n"? > > It's shorter, but provides the same info. > We will change their name. Thank you for your review. > > > > + print_stack(alloc_info->aux_stack[1]); > > + pr_err("\n"); > > + } > > +#endif > > } > > > > describe_object_addr(cache, object, addr); > > -- > > 2.18.0 > > > > -- > > You received this message because you are subscribed to the Google Groups "kasan-dev" group. > > To unsubscribe from this group and stop receiving emails from it, send an email to kasan-dev+unsubscribe@googlegroups.com. > > To view this discussion on the web visit https://groups.google.com/d/msgid/kasan-dev/20200519022359.24115-1-walter-zh.wu%40mediatek.com. > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel 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 X-Spam-Level: X-Spam-Status: No, score=-8.4 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1D633C433E1 for ; Wed, 20 May 2020 02:45:27 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id B6E9D20578 for ; Wed, 20 May 2020 02:45:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="pprZAfHn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B6E9D20578 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 622D180045; Tue, 19 May 2020 22:45:26 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5D29F8002C; Tue, 19 May 2020 22:45:26 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4C28280045; Tue, 19 May 2020 22:45:26 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0131.hostedemail.com [216.40.44.131]) by kanga.kvack.org (Postfix) with ESMTP id 30F2D8002C for ; Tue, 19 May 2020 22:45:26 -0400 (EDT) Received: from smtpin23.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id EF5B68248047 for ; Wed, 20 May 2020 02:45:25 +0000 (UTC) X-FDA: 76835556210.23.bears21_696e46cd88e5e X-HE-Tag: bears21_696e46cd88e5e X-Filterd-Recvd-Size: 15462 Received: from mailgw01.mediatek.com (unknown [210.61.82.183]) by imf44.hostedemail.com (Postfix) with ESMTP for ; Wed, 20 May 2020 02:45:24 +0000 (UTC) X-UUID: 490816c7f02349ceb88497402d494d3e-20200520 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=m3DuqKpgf4iRj54o8NbAF84k6JTIXvziVvcOSZRHoIg=; b=pprZAfHnMW2iiLtKhiX6rF6fVqTf65pM0W4WuwpZ+7QM979ced+CrQKXmSB+0aS/EO/+ot+d3WOSRfwJgi/TtOGa/VFJbibDdBAipcHmAHNj/b77huu+CB+b6YQX5uXVdh9S8DJED90r3cqdGgwXPs9idY0Co7z9wFWqqWRC4/Y=; X-UUID: 490816c7f02349ceb88497402d494d3e-20200520 Received: from mtkcas11.mediatek.inc [(172.21.101.40)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 1085158723; Wed, 20 May 2020 10:45:20 +0800 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs01n2.mediatek.inc (172.21.101.79) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 20 May 2020 10:45:16 +0800 Received: from [172.21.84.99] (172.21.84.99) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 20 May 2020 10:45:13 +0800 Message-ID: <1589942718.29577.3.camel@mtksdccf07> Subject: Re: [PATCH v4 1/4] rcu/kasan: record and print call_rcu() call stack From: Walter Wu To: Andrey Konovalov CC: Andrey Ryabinin , Alexander Potapenko , Dmitry Vyukov , Matthias Brugger , "Paul E . McKenney" , "Josh Triplett" , Mathieu Desnoyers , Lai Jiangshan , Joel Fernandes , Andrew Morton , kasan-dev , "Linux Memory Management List" , LKML , Linux ARM , wsd_upstream , Date: Wed, 20 May 2020 10:45:18 +0800 In-Reply-To: References: <20200519022359.24115-1-walter-zh.wu@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-TM-SNTS-SMTP: 6304041814EFF626743B3D340E4065BDC8A74CE1B689507D0DDD49A81C3153BD2000:8 X-MTK: N Content-Transfer-Encoding: base64 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: SGkgQW5kcmV5LA0KDQpPbiBUdWUsIDIwMjAtMDUtMTkgYXQgMTY6NTIgKzAyMDAsICdBbmRyZXkg S29ub3ZhbG92JyB2aWEga2FzYW4tZGV2DQp3cm90ZToNCj4gT24gVHVlLCBNYXkgMTksIDIwMjAg YXQgNDoyNCBBTSBXYWx0ZXIgV3UgPHdhbHRlci16aC53dUBtZWRpYXRlay5jb20+IHdyb3RlOg0K PiA+DQo+ID4gVGhpcyBmZWF0dXJlIHdpbGwgcmVjb3JkIHRoZSBsYXN0IHR3byBjYWxsX3JjdSgp IGNhbGwgc3RhY2tzIGFuZA0KPiA+IHByaW50cyB1cCB0byAyIGNhbGxfcmN1KCkgY2FsbCBzdGFj a3MgaW4gS0FTQU4gcmVwb3J0Lg0KPiA+DQo+ID4gV2hlbiBjYWxsX3JjdSgpIGlzIGNhbGxlZCwg d2Ugc3RvcmUgdGhlIGNhbGxfcmN1KCkgY2FsbCBzdGFjayBpbnRvDQo+ID4gc2x1YiBhbGxvYyBt ZXRhLWRhdGEsIHNvIHRoYXQgdGhlIEtBU0FOIHJlcG9ydCBjYW4gcHJpbnQgcmN1IHN0YWNrLg0K PiA+DQo+ID4gWzFdaHR0cHM6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD0x OTg0MzcNCj4gPiBbMl1odHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2ZvcnVtLyMhc2VhcmNoaW4v a2FzYW4tZGV2L2JldHRlciQyMHN0YWNrJDIwdHJhY2VzJDIwZm9yJDIwcmN1JTdDc29ydDpkYXRl L2thc2FuLWRldi9LUXNqVF84OGhERS83ck5VWnByUkJnQUoNCj4gPg0KPiA+IFNpZ25lZC1vZmYt Ynk6IFdhbHRlciBXdSA8d2FsdGVyLXpoLnd1QG1lZGlhdGVrLmNvbT4NCj4gPiBTdWdnZXN0ZWQt Ynk6IERtaXRyeSBWeXVrb3YgPGR2eXVrb3ZAZ29vZ2xlLmNvbT4NCj4gPiBDYzogQW5kcmV5IFJ5 YWJpbmluIDxhcnlhYmluaW5AdmlydHVvenpvLmNvbT4NCj4gPiBDYzogRG1pdHJ5IFZ5dWtvdiA8 ZHZ5dWtvdkBnb29nbGUuY29tPg0KPiA+IENjOiBBbGV4YW5kZXIgUG90YXBlbmtvIDxnbGlkZXJA Z29vZ2xlLmNvbT4NCj4gPiBDYzogQW5kcmV3IE1vcnRvbiA8YWtwbUBsaW51eC1mb3VuZGF0aW9u Lm9yZz4NCj4gPiBDYzogUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BrZXJuZWwub3JnPg0KPiA+ IENjOiBKb3NoIFRyaXBsZXR0IDxqb3NoQGpvc2h0cmlwbGV0dC5vcmc+DQo+ID4gQ2M6IE1hdGhp ZXUgRGVzbm95ZXJzIDxtYXRoaWV1LmRlc25veWVyc0BlZmZpY2lvcy5jb20+DQo+ID4gQ2M6IExh aSBKaWFuZ3NoYW4gPGppYW5nc2hhbmxhaUBnbWFpbC5jb20+DQo+ID4gQ2M6IEpvZWwgRmVybmFu ZGVzIDxqb2VsQGpvZWxmZXJuYW5kZXMub3JnPg0KPiA+IC0tLQ0KPiA+ICBpbmNsdWRlL2xpbnV4 L2thc2FuLmggfCAgMiArKw0KPiA+ICBrZXJuZWwvcmN1L3RyZWUuYyAgICAgfCAgMiArKw0KPiA+ ICBsaWIvS2NvbmZpZy5rYXNhbiAgICAgfCAgMiArKw0KPiA+ICBtbS9rYXNhbi9jb21tb24uYyAg ICAgfCAgNCArKy0tDQo+ID4gIG1tL2thc2FuL2dlbmVyaWMuYyAgICB8IDE5ICsrKysrKysrKysr KysrKysrKysNCj4gPiAgbW0va2FzYW4va2FzYW4uaCAgICAgIHwgMTAgKysrKysrKysrKw0KPiA+ ICBtbS9rYXNhbi9yZXBvcnQuYyAgICAgfCAyNCArKysrKysrKysrKysrKysrKysrKysrKysNCj4g PiAgNyBmaWxlcyBjaGFuZ2VkLCA2MSBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQ0KPiA+ DQo+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2FzYW4uaCBiL2luY2x1ZGUvbGludXgv a2FzYW4uaA0KPiA+IGluZGV4IDMxMzE0Y2E3YzYzNS4uMjNiN2VlMDA1NzJkIDEwMDY0NA0KPiA+ IC0tLSBhL2luY2x1ZGUvbGludXgva2FzYW4uaA0KPiA+ICsrKyBiL2luY2x1ZGUvbGludXgva2Fz YW4uaA0KPiA+IEBAIC0xNzQsMTEgKzE3NCwxMyBAQCBzdGF0aWMgaW5saW5lIHNpemVfdCBrYXNh bl9tZXRhZGF0YV9zaXplKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSkgeyByZXR1cm4gMDsgfQ0K PiA+DQo+ID4gIHZvaWQga2FzYW5fY2FjaGVfc2hyaW5rKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNo ZSk7DQo+ID4gIHZvaWQga2FzYW5fY2FjaGVfc2h1dGRvd24oc3RydWN0IGttZW1fY2FjaGUgKmNh Y2hlKTsNCj4gPiArdm9pZCBrYXNhbl9yZWNvcmRfYXV4X3N0YWNrKHZvaWQgKnB0cik7DQo+ID4N Cj4gPiAgI2Vsc2UgLyogQ09ORklHX0tBU0FOX0dFTkVSSUMgKi8NCj4gPg0KPiA+ICBzdGF0aWMg aW5saW5lIHZvaWQga2FzYW5fY2FjaGVfc2hyaW5rKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSkg e30NCj4gPiAgc3RhdGljIGlubGluZSB2b2lkIGthc2FuX2NhY2hlX3NodXRkb3duKHN0cnVjdCBr bWVtX2NhY2hlICpjYWNoZSkge30NCj4gPiArc3RhdGljIGlubGluZSB2b2lkIGthc2FuX3JlY29y ZF9hdXhfc3RhY2sodm9pZCAqcHRyKSB7fQ0KPiA+DQo+ID4gICNlbmRpZiAvKiBDT05GSUdfS0FT QU5fR0VORVJJQyAqLw0KPiA+DQo+ID4gZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZS5jIGIv a2VybmVsL3JjdS90cmVlLmMNCj4gPiBpbmRleCAwNjU0OGUyZWJiNzIuLjM2YTRmZjdmMzIwYiAx MDA2NDQNCj4gPiAtLS0gYS9rZXJuZWwvcmN1L3RyZWUuYw0KPiA+ICsrKyBiL2tlcm5lbC9yY3Uv dHJlZS5jDQo+ID4gQEAgLTU3LDYgKzU3LDcgQEANCj4gPiAgI2luY2x1ZGUgPGxpbnV4L3NsYWIu aD4NCj4gPiAgI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2lzb2xhdGlvbi5oPg0KPiA+ICAjaW5jbHVk ZSA8bGludXgvc2NoZWQvY2xvY2suaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2thc2FuLmg+DQo+ ID4gICNpbmNsdWRlICIuLi90aW1lL3RpY2staW50ZXJuYWwuaCINCj4gPg0KPiA+ICAjaW5jbHVk ZSAidHJlZS5oIg0KPiA+IEBAIC0yNjY4LDYgKzI2NjksNyBAQCBfX2NhbGxfcmN1KHN0cnVjdCBy Y3VfaGVhZCAqaGVhZCwgcmN1X2NhbGxiYWNrX3QgZnVuYykNCj4gPiAgICAgICAgIGhlYWQtPmZ1 bmMgPSBmdW5jOw0KPiA+ICAgICAgICAgaGVhZC0+bmV4dCA9IE5VTEw7DQo+ID4gICAgICAgICBs b2NhbF9pcnFfc2F2ZShmbGFncyk7DQo+ID4gKyAgICAgICBrYXNhbl9yZWNvcmRfYXV4X3N0YWNr KGhlYWQpOw0KPiA+ICAgICAgICAgcmRwID0gdGhpc19jcHVfcHRyKCZyY3VfZGF0YSk7DQo+ID4N Cj4gPiAgICAgICAgIC8qIEFkZCB0aGUgY2FsbGJhY2sgdG8gb3VyIGxpc3QuICovDQo+ID4gZGlm ZiAtLWdpdCBhL2xpYi9LY29uZmlnLmthc2FuIGIvbGliL0tjb25maWcua2FzYW4NCj4gPiBpbmRl eCA4MWY1NDY0ZWE5ZTEuLjRlODNjZjZlM2NhYSAxMDA2NDQNCj4gPiAtLS0gYS9saWIvS2NvbmZp Zy5rYXNhbg0KPiA+ICsrKyBiL2xpYi9LY29uZmlnLmthc2FuDQo+ID4gQEAgLTU4LDYgKzU4LDgg QEAgY29uZmlnIEtBU0FOX0dFTkVSSUMNCj4gPiAgICAgICAgICAgRm9yIGJldHRlciBlcnJvciBk ZXRlY3Rpb24gZW5hYmxlIENPTkZJR19TVEFDS1RSQUNFLg0KPiA+ICAgICAgICAgICBDdXJyZW50 bHkgQ09ORklHX0tBU0FOX0dFTkVSSUMgZG9lc24ndCB3b3JrIHdpdGggQ09ORklHX0RFQlVHX1NM QUINCj4gPiAgICAgICAgICAgKHRoZSByZXN1bHRpbmcga2VybmVsIGRvZXMgbm90IGJvb3QpLg0K PiA+ICsgICAgICAgICBJbiBnZW5lcmljIG1vZGUgS0FTQU4gcHJpbnRzIHRoZSBsYXN0IHR3byBj YWxsX3JjdSgpIGNhbGwgc3RhY2tzIGluDQo+ID4gKyAgICAgICAgIHJlcG9ydHMuDQo+IA0KPiBJ IGRvbid0IHRoaW5rIHdlIG5lZWQgdGhpcyBoZXJlLCBtZW50aW9uaW5nIHRoaXMgaW4gdGhlIGRv Y3VtZW50YXRpb24gaXMgZmluZS4NCj4gDQoNCk9rLCB3ZSB3aWxsIHJlbW92ZSBpdC4gT25seSBt ZW50aW9uIGl0IGluIHRoZSBkb2N1bWVudGF0aW9uLg0KDQo+IA0KPiA+DQo+ID4gIGNvbmZpZyBL QVNBTl9TV19UQUdTDQo+ID4gICAgICAgICBib29sICJTb2Z0d2FyZSB0YWctYmFzZWQgbW9kZSIN Cj4gPiBkaWZmIC0tZ2l0IGEvbW0va2FzYW4vY29tbW9uLmMgYi9tbS9rYXNhbi9jb21tb24uYw0K PiA+IGluZGV4IDI5MDYzNThlNDJmMC4uOGJjNjE4Mjg5YmIxIDEwMDY0NA0KPiA+IC0tLSBhL21t L2thc2FuL2NvbW1vbi5jDQo+ID4gKysrIGIvbW0va2FzYW4vY29tbW9uLmMNCj4gPiBAQCAtNDEs NyArNDEsNyBAQA0KPiA+ICAjaW5jbHVkZSAia2FzYW4uaCINCj4gPiAgI2luY2x1ZGUgIi4uL3Ns YWIuaCINCj4gPg0KPiA+IC1zdGF0aWMgaW5saW5lIGRlcG90X3N0YWNrX2hhbmRsZV90IHNhdmVf c3RhY2soZ2ZwX3QgZmxhZ3MpDQo+ID4gK2RlcG90X3N0YWNrX2hhbmRsZV90IGthc2FuX3NhdmVf c3RhY2soZ2ZwX3QgZmxhZ3MpDQo+ID4gIHsNCj4gPiAgICAgICAgIHVuc2lnbmVkIGxvbmcgZW50 cmllc1tLQVNBTl9TVEFDS19ERVBUSF07DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgbnJfZW50 cmllczsNCj4gPiBAQCAtNTQsNyArNTQsNyBAQCBzdGF0aWMgaW5saW5lIGRlcG90X3N0YWNrX2hh bmRsZV90IHNhdmVfc3RhY2soZ2ZwX3QgZmxhZ3MpDQo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBz ZXRfdHJhY2soc3RydWN0IGthc2FuX3RyYWNrICp0cmFjaywgZ2ZwX3QgZmxhZ3MpDQo+ID4gIHsN Cj4gPiAgICAgICAgIHRyYWNrLT5waWQgPSBjdXJyZW50LT5waWQ7DQo+ID4gLSAgICAgICB0cmFj ay0+c3RhY2sgPSBzYXZlX3N0YWNrKGZsYWdzKTsNCj4gPiArICAgICAgIHRyYWNrLT5zdGFjayA9 IGthc2FuX3NhdmVfc3RhY2soZmxhZ3MpOw0KPiA+ICB9DQo+ID4NCj4gPiAgdm9pZCBrYXNhbl9l bmFibGVfY3VycmVudCh2b2lkKQ0KPiA+IGRpZmYgLS1naXQgYS9tbS9rYXNhbi9nZW5lcmljLmMg Yi9tbS9rYXNhbi9nZW5lcmljLmMNCj4gPiBpbmRleCA1NmZmODg4NWZlMmUuLjMzNzJiZGNhZjky YSAxMDA2NDQNCj4gPiAtLS0gYS9tbS9rYXNhbi9nZW5lcmljLmMNCj4gPiArKysgYi9tbS9rYXNh bi9nZW5lcmljLmMNCj4gPiBAQCAtMzI1LDMgKzMyNSwyMiBAQCBERUZJTkVfQVNBTl9TRVRfU0hB RE9XKGYyKTsNCj4gPiAgREVGSU5FX0FTQU5fU0VUX1NIQURPVyhmMyk7DQo+ID4gIERFRklORV9B U0FOX1NFVF9TSEFET1coZjUpOw0KPiA+ICBERUZJTkVfQVNBTl9TRVRfU0hBRE9XKGY4KTsNCj4g PiArDQo+ID4gK3ZvaWQga2FzYW5fcmVjb3JkX2F1eF9zdGFjayh2b2lkICphZGRyKQ0KPiA+ICt7 DQo+ID4gKyAgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSA9IGthc2FuX2FkZHJfdG9fcGFnZShhZGRy KTsNCj4gPiArICAgICAgIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZTsNCj4gPiArICAgICAgIHN0 cnVjdCBrYXNhbl9hbGxvY19tZXRhICphbGxvY19pbmZvOw0KPiA+ICsgICAgICAgdm9pZCAqb2Jq ZWN0Ow0KPiA+ICsNCj4gPiArICAgICAgIGlmICghKHBhZ2UgJiYgUGFnZVNsYWIocGFnZSkpKQ0K PiA+ICsgICAgICAgICAgICAgICByZXR1cm47DQo+ID4gKw0KPiA+ICsgICAgICAgY2FjaGUgPSBw YWdlLT5zbGFiX2NhY2hlOw0KPiA+ICsgICAgICAgb2JqZWN0ID0gbmVhcmVzdF9vYmooY2FjaGUs IHBhZ2UsIGFkZHIpOw0KPiA+ICsgICAgICAgYWxsb2NfaW5mbyA9IGdldF9hbGxvY19pbmZvKGNh Y2hlLCBvYmplY3QpOw0KPiA+ICsNCj4gPiArICAgICAgIC8qIHJlY29yZCB0aGUgbGFzdCB0d28g Y2FsbF9yY3UoKSBjYWxsIHN0YWNrcyAqLw0KPiA+ICsgICAgICAgYWxsb2NfaW5mby0+YXV4X3N0 YWNrWzFdID0gYWxsb2NfaW5mby0+YXV4X3N0YWNrWzBdOw0KPiA+ICsgICAgICAgYWxsb2NfaW5m by0+YXV4X3N0YWNrWzBdID0ga2FzYW5fc2F2ZV9zdGFjayhHRlBfTk9XQUlUKTsNCj4gPiArfQ0K PiA+IGRpZmYgLS1naXQgYS9tbS9rYXNhbi9rYXNhbi5oIGIvbW0va2FzYW4va2FzYW4uaA0KPiA+ IGluZGV4IGU4ZjM3MTk5ZDg4NS4uYTczOTFiYzgzMDcwIDEwMDY0NA0KPiA+IC0tLSBhL21tL2th c2FuL2thc2FuLmgNCj4gPiArKysgYi9tbS9rYXNhbi9rYXNhbi5oDQo+ID4gQEAgLTEwNCw3ICsx MDQsMTUgQEAgc3RydWN0IGthc2FuX3RyYWNrIHsNCj4gPg0KPiA+ICBzdHJ1Y3Qga2FzYW5fYWxs b2NfbWV0YSB7DQo+ID4gICAgICAgICBzdHJ1Y3Qga2FzYW5fdHJhY2sgYWxsb2NfdHJhY2s7DQo+ ID4gKyNpZmRlZiBDT05GSUdfS0FTQU5fR0VORVJJQw0KPiA+ICsgICAgICAgLyoNCj4gPiArICAg ICAgICAqIGNhbGxfcmN1KCkgY2FsbCBzdGFjayBpcyBzdG9yZWQgaW50byBzdHJ1Y3Qga2FzYW5f YWxsb2NfbWV0YS4NCj4gPiArICAgICAgICAqIFRoZSBmcmVlIHN0YWNrIGlzIHN0b3JlZCBpbnRv IHN0cnVjdCBrYXNhbl9mcmVlX21ldGEuDQo+ID4gKyAgICAgICAgKi8NCj4gPiArICAgICAgIGRl cG90X3N0YWNrX2hhbmRsZV90IGF1eF9zdGFja1syXTsNCj4gPiArI2Vsc2UNCj4gPiAgICAgICAg IHN0cnVjdCBrYXNhbl90cmFjayBmcmVlX3RyYWNrW0tBU0FOX05SX0ZSRUVfU1RBQ0tTXTsNCj4g PiArI2VuZGlmDQo+ID4gICNpZmRlZiBDT05GSUdfS0FTQU5fU1dfVEFHU19JREVOVElGWQ0KPiA+ ICAgICAgICAgdTggZnJlZV9wb2ludGVyX3RhZ1tLQVNBTl9OUl9GUkVFX1NUQUNLU107DQo+ID4g ICAgICAgICB1OCBmcmVlX3RyYWNrX2lkeDsNCj4gPiBAQCAtMTU5LDYgKzE2Nyw4IEBAIHZvaWQg a2FzYW5fcmVwb3J0X2ludmFsaWRfZnJlZSh2b2lkICpvYmplY3QsIHVuc2lnbmVkIGxvbmcgaXAp Ow0KPiA+DQo+ID4gIHN0cnVjdCBwYWdlICprYXNhbl9hZGRyX3RvX3BhZ2UoY29uc3Qgdm9pZCAq YWRkcik7DQo+ID4NCj4gPiArZGVwb3Rfc3RhY2tfaGFuZGxlX3Qga2FzYW5fc2F2ZV9zdGFjayhn ZnBfdCBmbGFncyk7DQo+ID4gKw0KPiA+ICAjaWYgZGVmaW5lZChDT05GSUdfS0FTQU5fR0VORVJJ QykgJiYgXA0KPiA+ICAgICAgICAgKGRlZmluZWQoQ09ORklHX1NMQUIpIHx8IGRlZmluZWQoQ09O RklHX1NMVUIpKQ0KPiA+ICB2b2lkIHF1YXJhbnRpbmVfcHV0KHN0cnVjdCBrYXNhbl9mcmVlX21l dGEgKmluZm8sIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSk7DQo+ID4gZGlmZiAtLWdpdCBhL21t L2thc2FuL3JlcG9ydC5jIGIvbW0va2FzYW4vcmVwb3J0LmMNCj4gPiBpbmRleCA4MGYyM2M5ZGE2 YjAuLjZmOGYyYmY4ZjUzYiAxMDA2NDQNCj4gPiAtLS0gYS9tbS9rYXNhbi9yZXBvcnQuYw0KPiA+ ICsrKyBiL21tL2thc2FuL3JlcG9ydC5jDQo+ID4gQEAgLTE3OSw2ICsxNzksMTcgQEAgc3RhdGlj IHN0cnVjdCBrYXNhbl90cmFjayAqa2FzYW5fZ2V0X2ZyZWVfdHJhY2soc3RydWN0IGttZW1fY2Fj aGUgKmNhY2hlLA0KPiA+ICAgICAgICAgcmV0dXJuICZhbGxvY19tZXRhLT5mcmVlX3RyYWNrW2ld Ow0KPiA+ICB9DQo+ID4NCj4gPiArI2lmZGVmIENPTkZJR19LQVNBTl9HRU5FUklDDQo+ID4gK3N0 YXRpYyB2b2lkIHByaW50X3N0YWNrKGRlcG90X3N0YWNrX2hhbmRsZV90IHN0YWNrKQ0KPiANCj4g TGV0J3MgcHV0IHRoaXMgZnVuY3Rpb24ganVzdCBiZWZvcmUgcHJpbnRfdHJhY2soKSBhbmQgcmV1 c2UgdGhlcmUuDQo+IA0KDQpPay4NCg0KPiA+ICt7DQo+ID4gKyAgICAgICB1bnNpZ25lZCBsb25n ICplbnRyaWVzOw0KPiA+ICsgICAgICAgdW5zaWduZWQgaW50IG5yX2VudHJpZXM7DQo+ID4gKw0K PiA+ICsgICAgICAgbnJfZW50cmllcyA9IHN0YWNrX2RlcG90X2ZldGNoKHN0YWNrLCAmZW50cmll cyk7DQo+ID4gKyAgICAgICBzdGFja190cmFjZV9wcmludChlbnRyaWVzLCBucl9lbnRyaWVzLCAw KTsNCj4gPiArfQ0KPiA+ICsjZW5kaWYNCj4gPiArDQo+ID4gIHN0YXRpYyB2b2lkIGRlc2NyaWJl X29iamVjdChzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIHZvaWQgKm9iamVjdCwNCj4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmFkZHIsIHU4IHRhZykNCj4g PiAgew0KPiA+IEBAIC0xOTIsNiArMjAzLDE5IEBAIHN0YXRpYyB2b2lkIGRlc2NyaWJlX29iamVj dChzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIHZvaWQgKm9iamVjdCwNCj4gPiAgICAgICAgICAg ICAgICAgZnJlZV90cmFjayA9IGthc2FuX2dldF9mcmVlX3RyYWNrKGNhY2hlLCBvYmplY3QsIHRh Zyk7DQo+ID4gICAgICAgICAgICAgICAgIHByaW50X3RyYWNrKGZyZWVfdHJhY2ssICJGcmVlZCIp Ow0KPiA+ICAgICAgICAgICAgICAgICBwcl9lcnIoIlxuIik7DQo+ID4gKw0KPiA+ICsjaWZkZWYg Q09ORklHX0tBU0FOX0dFTkVSSUMNCj4gPiArICAgICAgICAgICAgICAgaWYgKGFsbG9jX2luZm8t PmF1eF9zdGFja1swXSkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHByX2VycigiTGFz dCBvbmUgY2FsbF9yY3UoKSBjYWxsIHN0YWNrOlxuIik7DQo+IA0KPiBDb3VsZCB5b3UgY2hhbmdl IHRoaXMgdG8gIkxhc3QgY2FsbF9yY3UoKTpcbiIsDQo+IA0KPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgIHByaW50X3N0YWNrKGFsbG9jX2luZm8tPmF1eF9zdGFja1swXSk7DQo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgcHJfZXJyKCJcbiIpOw0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ ID4gKyAgICAgICAgICAgICAgIGlmIChhbGxvY19pbmZvLT5hdXhfc3RhY2tbMV0pIHsNCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICBwcl9lcnIoIlNlY29uZCB0byBsYXN0IGNhbGxfcmN1KCkg Y2FsbCBzdGFjazpcbiIpOw0KPiANCj4gYW5kIHRoaXMgdG8gIlNlY29uZCB0byBsYXN0IGNhbGxf cmN1KCk6XG4iPw0KPiANCj4gSXQncyBzaG9ydGVyLCBidXQgcHJvdmlkZXMgdGhlIHNhbWUgaW5m by4NCj4gDQoNCldlIHdpbGwgY2hhbmdlIHRoZWlyIG5hbWUuDQoNClRoYW5rIHlvdSBmb3IgeW91 ciByZXZpZXcuDQoNCj4gDQo+IA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0 YWNrKGFsbG9jX2luZm8tPmF1eF9zdGFja1sxXSk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgcHJfZXJyKCJcbiIpOw0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKyNlbmRpZg0KPiA+ ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBkZXNjcmliZV9vYmplY3RfYWRkcihjYWNoZSwg b2JqZWN0LCBhZGRyKTsNCj4gPiAtLQ0KPiA+IDIuMTguMA0KPiA+DQo+ID4gLS0NCj4gPiBZb3Ug cmVjZWl2ZWQgdGhpcyBtZXNzYWdlIGJlY2F1c2UgeW91IGFyZSBzdWJzY3JpYmVkIHRvIHRoZSBH b29nbGUgR3JvdXBzICJrYXNhbi1kZXYiIGdyb3VwLg0KPiA+IFRvIHVuc3Vic2NyaWJlIGZyb20g dGhpcyBncm91cCBhbmQgc3RvcCByZWNlaXZpbmcgZW1haWxzIGZyb20gaXQsIHNlbmQgYW4gZW1h aWwgdG8ga2FzYW4tZGV2K3Vuc3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb20uDQo+ID4gVG8gdmll dyB0aGlzIGRpc2N1c3Npb24gb24gdGhlIHdlYiB2aXNpdCBodHRwczovL2dyb3Vwcy5nb29nbGUu Y29tL2QvbXNnaWQva2FzYW4tZGV2LzIwMjAwNTE5MDIyMzU5LjI0MTE1LTEtd2FsdGVyLXpoLnd1 JTQwbWVkaWF0ZWsuY29tLg0KPiANCg0K