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=-16.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 AAC2FC432BE for ; Fri, 20 Aug 2021 22:10:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 89B7860F3A for ; Fri, 20 Aug 2021 22:10:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233825AbhHTWLg (ORCPT ); Fri, 20 Aug 2021 18:11:36 -0400 Received: from mail.kernel.org ([198.145.29.99]:37050 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231511AbhHTWLf (ORCPT ); Fri, 20 Aug 2021 18:11:35 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 1DFD660232; Fri, 20 Aug 2021 22:10:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1629497457; bh=1smIaCVltxpgS+a3hHbmjML7XtWQjkKdSxjd/HTTFME=; h=Date:From:To:Cc:Subject:Reply-To:References:In-Reply-To:From; b=FihF8xykt8FA4kSOXlkCUHdc131GGlTHM1xsBmmB7CJsGXhvtlAhmlgvqb8C/CtHe OLjBmh5DLrD88hLGR7gUMOu9vo/IPhaW3inCFWc8CWVNFpgfZqDo+yAHfjr0INqAJZ +PfGqE2bq8RgduyvY6eohoZvxf/n6gjDLfWz70It2fr1c4JGQhUosg33dwsUdUQSeX 4aLkWKjoXmiDIbaaeXtT+sbzLc7qTP3NBhv9y7rImh+liSbkYOmQRyphBmrCUtQo7y e6ssNTfHbJt2bVyOzTT//mSf6FMeoM7kY/kBRx20XyyXFdz7hRseq/tlQaBUCbP4r6 w9Rn/X81e76Rg== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id E39EB5C0399; Fri, 20 Aug 2021 15:10:56 -0700 (PDT) Date: Fri, 20 Aug 2021 15:10:56 -0700 From: "Paul E. McKenney" To: Sebastian Andrzej Siewior Cc: Scott Wood , Valentin Schneider , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, rcu@vger.kernel.org, linux-rt-users@vger.kernel.org, Catalin Marinas , Will Deacon , Ingo Molnar , Peter Zijlstra , Thomas Gleixner , Steven Rostedt , Daniel Bristot de Oliveira , Frederic Weisbecker , Josh Triplett , Mathieu Desnoyers , Davidlohr Bueso , Lai Jiangshan , Joel Fernandes , Anshuman Khandual , Vincenzo Frascino , Steven Price , Ard Biesheuvel , Boqun Feng , Mike Galbraith Subject: Re: [PATCH v2] rcutorture: Avoid problematic critical section nesting on PREEMPT_RT Message-ID: <20210820221056.GL4126399@paulmck-ThinkPad-P17-Gen-1> Reply-To: paulmck@kernel.org References: <20210811201354.1976839-2-valentin.schneider@arm.com> <20210817121345.5iyj5epemczn3a52@linutronix.de> <20210817131741.evduh4fw7vyv2dzt@linutronix.de> <20210817144018.nqssoq475vitrqlv@linutronix.de> <20210818224651.GY4126399@paulmck-ThinkPad-P17-Gen-1> <20210819153927.clqxr4f7qegpflbr@linutronix.de> <20210819154708.3efz6jtgwtuhpeds@linutronix.de> <20210819182035.GF4126399@paulmck-ThinkPad-P17-Gen-1> <561ab28b18c31fbc221f4cb0c4df6db9b0538675.camel@redhat.com> <20210820074236.2zli4nje7bof62rh@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20210820074236.2zli4nje7bof62rh@linutronix.de> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Aug 20, 2021 at 09:42:36AM +0200, Sebastian Andrzej Siewior wrote: > From: "From: Scott Wood" > > rcutorture is generating some nesting scenarios that are not compatible on PREEMPT_RT. > For example: > preempt_disable(); > rcu_read_lock_bh(); > preempt_enable(); > rcu_read_unlock_bh(); > > The problem here is that on PREEMPT_RT the bottom halves have to be > disabled and enabled in preemptible context. > > Reorder locking: start with BH locking and continue with then with > disabling preemption or interrupts. In the unlocking do it reverse by > first enabling interrupts and preemption and BH at the very end. > Ensure that on PREEMPT_RT BH locking remains unchanged if in > non-preemptible context. > > Link: https://lkml.kernel.org/r/20190911165729.11178-6-swood@redhat.com > Link: https://lkml.kernel.org/r/20210819182035.GF4126399@paulmck-ThinkPad-P17-Gen-1 > Signed-off-by: Scott Wood > [bigeasy: Drop ATOM_BH, make it only about changing BH in atomic > context. Allow enabling RCU in IRQ-off section. Reword commit message.] > Signed-off-by: Sebastian Andrzej Siewior Looks plausible. ;-) I have queued this for testing and further review. If all goes well, perhaps the v5.16 merge window. Thanx, Paul > --- > v1…v2: > - Drop the ATOM_BH* bits. There don't seem to be needed, Paul did not > ant the preempt-disable around enabling/disabling BH as it might fix > things that RCU should take care. > > - Allow enabling RCU with disabled interrupts on RT. Scott confirmed > that it was needed but might no longer be needed. Paul said that it > might have been required at some point. It survived multiple 6h long > TREE01 and TREE06 testing. > > kernel/rcu/rcutorture.c | 48 ++++++++++++++++++++++++++++++----------- > 1 file changed, 36 insertions(+), 12 deletions(-) > > diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c > index 40ef5417d9545..d2ef535530b10 100644 > --- a/kernel/rcu/rcutorture.c > +++ b/kernel/rcu/rcutorture.c > @@ -1432,28 +1432,34 @@ static void rcutorture_one_extend(int *readstate, int newstate, > /* First, put new protection in place to avoid critical-section gap. */ > if (statesnew & RCUTORTURE_RDR_BH) > local_bh_disable(); > + if (statesnew & RCUTORTURE_RDR_RBH) > + rcu_read_lock_bh(); > if (statesnew & RCUTORTURE_RDR_IRQ) > local_irq_disable(); > if (statesnew & RCUTORTURE_RDR_PREEMPT) > preempt_disable(); > - if (statesnew & RCUTORTURE_RDR_RBH) > - rcu_read_lock_bh(); > if (statesnew & RCUTORTURE_RDR_SCHED) > rcu_read_lock_sched(); > if (statesnew & RCUTORTURE_RDR_RCU) > idxnew = cur_ops->readlock() << RCUTORTURE_RDR_SHIFT; > > - /* Next, remove old protection, irq first due to bh conflict. */ > + /* > + * Next, remove old protection, in decreasing order of strength > + * to avoid unlock paths that aren't safe in the stronger > + * context. Namely: BH can not be enabled with disabled interrupts. > + * Additionally PREEMPT_RT requires that BH is enabled in preemptible > + * context. > + */ > if (statesold & RCUTORTURE_RDR_IRQ) > local_irq_enable(); > - if (statesold & RCUTORTURE_RDR_BH) > - local_bh_enable(); > if (statesold & RCUTORTURE_RDR_PREEMPT) > preempt_enable(); > - if (statesold & RCUTORTURE_RDR_RBH) > - rcu_read_unlock_bh(); > if (statesold & RCUTORTURE_RDR_SCHED) > rcu_read_unlock_sched(); > + if (statesold & RCUTORTURE_RDR_BH) > + local_bh_enable(); > + if (statesold & RCUTORTURE_RDR_RBH) > + rcu_read_unlock_bh(); > if (statesold & RCUTORTURE_RDR_RCU) { > bool lockit = !statesnew && !(torture_random(trsp) & 0xffff); > > @@ -1496,6 +1502,9 @@ rcutorture_extend_mask(int oldmask, struct torture_random_state *trsp) > int mask = rcutorture_extend_mask_max(); > unsigned long randmask1 = torture_random(trsp) >> 8; > unsigned long randmask2 = randmask1 >> 3; > + unsigned long preempts = RCUTORTURE_RDR_PREEMPT | RCUTORTURE_RDR_SCHED; > + unsigned long preempts_irq = preempts | RCUTORTURE_RDR_IRQ; > + unsigned long bhs = RCUTORTURE_RDR_BH | RCUTORTURE_RDR_RBH; > > WARN_ON_ONCE(mask >> RCUTORTURE_RDR_SHIFT); > /* Mostly only one bit (need preemption!), sometimes lots of bits. */ > @@ -1503,11 +1512,26 @@ rcutorture_extend_mask(int oldmask, struct torture_random_state *trsp) > mask = mask & randmask2; > else > mask = mask & (1 << (randmask2 % RCUTORTURE_RDR_NBITS)); > - /* Can't enable bh w/irq disabled. */ > - if ((mask & RCUTORTURE_RDR_IRQ) && > - ((!(mask & RCUTORTURE_RDR_BH) && (oldmask & RCUTORTURE_RDR_BH)) || > - (!(mask & RCUTORTURE_RDR_RBH) && (oldmask & RCUTORTURE_RDR_RBH)))) > - mask |= RCUTORTURE_RDR_BH | RCUTORTURE_RDR_RBH; > + > + /* > + * Can't enable bh w/irq disabled. > + */ > + if (mask & RCUTORTURE_RDR_IRQ) > + mask |= oldmask & bhs; > + > + /* > + * Ideally these sequences would be detected in debug builds > + * (regardless of RT), but until then don't stop testing > + * them on non-RT. > + */ > + if (IS_ENABLED(CONFIG_PREEMPT_RT)) { > + /* Can't modify BH in atomic context */ > + if (oldmask & preempts_irq) > + mask &= ~bhs; > + if ((oldmask | mask) & preempts_irq) > + mask |= oldmask & bhs; > + } > + > return mask ?: RCUTORTURE_RDR_RCU; > } > > -- > 2.33.0 > 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=-14.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 3CCCFC4338F for ; Fri, 20 Aug 2021 22:13:24 +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 EFC8B61029 for ; Fri, 20 Aug 2021 22:13:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org EFC8B61029 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org 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:Reply-To: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:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=wB8uis88xZXrsStbw5gsW2APEV+XtUSlnJNOdIsYDT4=; b=GmmJ7ac/k6ZCTS ry8KO0Bj4GwzhL02jdjk+ycfN2JfoSr9B0okKzgbIQGdzRUfDMo4QkuoGhhjYPam9djQyo+jZkiGW D6tYeqAXfIAt2SJ4YoHzkKQkEe4jkHLWM5KUJoFv9YDDNyA4A9GjOdzMXfijFqTM9aE0OXZsQMbAA wlHywitKQSXHRKNeFFkVSXlE9reCB3SMDf2C5HilaaEytVGfBZd4oG4xcCPoyoBwHifDbMIlTCtw/ f2cRPOlD7jHz4mhK2CyaECj3vaRQdNiDpU7wMPcdi4yN89OSaaPTIixTfnAjQruRf0LfTFwvbOZxm aONXvpRjJtucQoBgznrg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mHCj8-00CAii-7y; Fri, 20 Aug 2021 22:11:02 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mHCj3-00CAht-MU for linux-arm-kernel@lists.infradead.org; Fri, 20 Aug 2021 22:10:59 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 1DFD660232; Fri, 20 Aug 2021 22:10:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1629497457; bh=1smIaCVltxpgS+a3hHbmjML7XtWQjkKdSxjd/HTTFME=; h=Date:From:To:Cc:Subject:Reply-To:References:In-Reply-To:From; b=FihF8xykt8FA4kSOXlkCUHdc131GGlTHM1xsBmmB7CJsGXhvtlAhmlgvqb8C/CtHe OLjBmh5DLrD88hLGR7gUMOu9vo/IPhaW3inCFWc8CWVNFpgfZqDo+yAHfjr0INqAJZ +PfGqE2bq8RgduyvY6eohoZvxf/n6gjDLfWz70It2fr1c4JGQhUosg33dwsUdUQSeX 4aLkWKjoXmiDIbaaeXtT+sbzLc7qTP3NBhv9y7rImh+liSbkYOmQRyphBmrCUtQo7y e6ssNTfHbJt2bVyOzTT//mSf6FMeoM7kY/kBRx20XyyXFdz7hRseq/tlQaBUCbP4r6 w9Rn/X81e76Rg== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id E39EB5C0399; Fri, 20 Aug 2021 15:10:56 -0700 (PDT) Date: Fri, 20 Aug 2021 15:10:56 -0700 From: "Paul E. McKenney" To: Sebastian Andrzej Siewior Cc: Scott Wood , Valentin Schneider , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, rcu@vger.kernel.org, linux-rt-users@vger.kernel.org, Catalin Marinas , Will Deacon , Ingo Molnar , Peter Zijlstra , Thomas Gleixner , Steven Rostedt , Daniel Bristot de Oliveira , Frederic Weisbecker , Josh Triplett , Mathieu Desnoyers , Davidlohr Bueso , Lai Jiangshan , Joel Fernandes , Anshuman Khandual , Vincenzo Frascino , Steven Price , Ard Biesheuvel , Boqun Feng , Mike Galbraith Subject: Re: [PATCH v2] rcutorture: Avoid problematic critical section nesting on PREEMPT_RT Message-ID: <20210820221056.GL4126399@paulmck-ThinkPad-P17-Gen-1> References: <20210811201354.1976839-2-valentin.schneider@arm.com> <20210817121345.5iyj5epemczn3a52@linutronix.de> <20210817131741.evduh4fw7vyv2dzt@linutronix.de> <20210817144018.nqssoq475vitrqlv@linutronix.de> <20210818224651.GY4126399@paulmck-ThinkPad-P17-Gen-1> <20210819153927.clqxr4f7qegpflbr@linutronix.de> <20210819154708.3efz6jtgwtuhpeds@linutronix.de> <20210819182035.GF4126399@paulmck-ThinkPad-P17-Gen-1> <561ab28b18c31fbc221f4cb0c4df6db9b0538675.camel@redhat.com> <20210820074236.2zli4nje7bof62rh@linutronix.de> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20210820074236.2zli4nje7bof62rh@linutronix.de> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210820_151057_846734_90A8D3B1 X-CRM114-Status: GOOD ( 33.81 ) 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: , Reply-To: paulmck@kernel.org 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 T24gRnJpLCBBdWcgMjAsIDIwMjEgYXQgMDk6NDI6MzZBTSArMDIwMCwgU2ViYXN0aWFuIEFuZHJ6 ZWogU2lld2lvciB3cm90ZToKPiBGcm9tOiAiRnJvbTogU2NvdHQgV29vZCIgPHN3b29kQHJlZGhh dC5jb20+Cj4gCj4gcmN1dG9ydHVyZSBpcyBnZW5lcmF0aW5nIHNvbWUgbmVzdGluZyBzY2VuYXJp b3MgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgb24gUFJFRU1QVF9SVC4KPiBGb3IgZXhhbXBsZToK PiAJcHJlZW1wdF9kaXNhYmxlKCk7Cj4gCXJjdV9yZWFkX2xvY2tfYmgoKTsKPiAJcHJlZW1wdF9l bmFibGUoKTsKPiAJcmN1X3JlYWRfdW5sb2NrX2JoKCk7Cj4gCj4gVGhlIHByb2JsZW0gaGVyZSBp cyB0aGF0IG9uIFBSRUVNUFRfUlQgdGhlIGJvdHRvbSBoYWx2ZXMgaGF2ZSB0byBiZQo+IGRpc2Fi bGVkIGFuZCBlbmFibGVkIGluIHByZWVtcHRpYmxlIGNvbnRleHQuCj4gCj4gUmVvcmRlciBsb2Nr aW5nOiBzdGFydCB3aXRoIEJIIGxvY2tpbmcgYW5kIGNvbnRpbnVlIHdpdGggdGhlbiB3aXRoCj4g ZGlzYWJsaW5nIHByZWVtcHRpb24gb3IgaW50ZXJydXB0cy4gSW4gdGhlIHVubG9ja2luZyBkbyBp dCByZXZlcnNlIGJ5Cj4gZmlyc3QgZW5hYmxpbmcgaW50ZXJydXB0cyBhbmQgcHJlZW1wdGlvbiBh bmQgQkggYXQgdGhlIHZlcnkgZW5kLgo+IEVuc3VyZSB0aGF0IG9uIFBSRUVNUFRfUlQgQkggbG9j a2luZyByZW1haW5zIHVuY2hhbmdlZCBpZiBpbgo+IG5vbi1wcmVlbXB0aWJsZSBjb250ZXh0Lgo+ IAo+IExpbms6IGh0dHBzOi8vbGttbC5rZXJuZWwub3JnL3IvMjAxOTA5MTExNjU3MjkuMTExNzgt Ni1zd29vZEByZWRoYXQuY29tCj4gTGluazogaHR0cHM6Ly9sa21sLmtlcm5lbC5vcmcvci8yMDIx MDgxOTE4MjAzNS5HRjQxMjYzOTlAcGF1bG1jay1UaGlua1BhZC1QMTctR2VuLTEKPiBTaWduZWQt b2ZmLWJ5OiBTY290dCBXb29kIDxzd29vZEByZWRoYXQuY29tPgo+IFtiaWdlYXN5OiBEcm9wIEFU T01fQkgsIG1ha2UgaXQgb25seSBhYm91dCBjaGFuZ2luZyBCSCBpbiBhdG9taWMKPiBjb250ZXh0 LiBBbGxvdyBlbmFibGluZyBSQ1UgaW4gSVJRLW9mZiBzZWN0aW9uLiBSZXdvcmQgY29tbWl0IG1l c3NhZ2UuXQo+IFNpZ25lZC1vZmYtYnk6IFNlYmFzdGlhbiBBbmRyemVqIFNpZXdpb3IgPGJpZ2Vh c3lAbGludXRyb25peC5kZT4KCkxvb2tzIHBsYXVzaWJsZS4gIDstKQoKSSBoYXZlIHF1ZXVlZCB0 aGlzIGZvciB0ZXN0aW5nIGFuZCBmdXJ0aGVyIHJldmlldy4gIElmIGFsbCBnb2VzIHdlbGwsCnBl cmhhcHMgdGhlIHY1LjE2IG1lcmdlIHdpbmRvdy4KCgkJCQkJCQlUaGFueCwgUGF1bAoKPiAtLS0K PiB2MeKApnYyOgo+ICAgLSBEcm9wIHRoZSBBVE9NX0JIKiBiaXRzLiBUaGVyZSBkb24ndCBzZWVt IHRvIGJlIG5lZWRlZCwgUGF1bCBkaWQgbm90Cj4gICAgIGFudCB0aGUgcHJlZW1wdC1kaXNhYmxl IGFyb3VuZCBlbmFibGluZy9kaXNhYmxpbmcgQkggYXMgaXQgbWlnaHQgZml4Cj4gICAgIHRoaW5n cyB0aGF0IFJDVSBzaG91bGQgdGFrZSBjYXJlLgo+IAo+ICAgLSBBbGxvdyBlbmFibGluZyBSQ1Ug d2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzIG9uIFJULiBTY290dCBjb25maXJtZWQKPiAgICAgdGhh dCBpdCB3YXMgbmVlZGVkIGJ1dCBtaWdodCBubyBsb25nZXIgYmUgbmVlZGVkLiBQYXVsIHNhaWQg dGhhdCBpdAo+ICAgICBtaWdodCBoYXZlIGJlZW4gcmVxdWlyZWQgYXQgc29tZSBwb2ludC4gSXQg c3Vydml2ZWQgbXVsdGlwbGUgNmggbG9uZwo+ICAgICBUUkVFMDEgYW5kIFRSRUUwNiB0ZXN0aW5n Lgo+IAo+ICBrZXJuZWwvcmN1L3JjdXRvcnR1cmUuYyB8IDQ4ICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKy0tLS0tLS0tLS0tCj4gIDEgZmlsZSBjaGFuZ2VkLCAzNiBpbnNlcnRpb25zKCsp LCAxMiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS9yY3V0b3J0dXJl LmMgYi9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYwo+IGluZGV4IDQwZWY1NDE3ZDk1NDUuLmQyZWY1 MzU1MzBiMTAgMTAwNjQ0Cj4gLS0tIGEva2VybmVsL3JjdS9yY3V0b3J0dXJlLmMKPiArKysgYi9r ZXJuZWwvcmN1L3JjdXRvcnR1cmUuYwo+IEBAIC0xNDMyLDI4ICsxNDMyLDM0IEBAIHN0YXRpYyB2 b2lkIHJjdXRvcnR1cmVfb25lX2V4dGVuZChpbnQgKnJlYWRzdGF0ZSwgaW50IG5ld3N0YXRlLAo+ ICAJLyogRmlyc3QsIHB1dCBuZXcgcHJvdGVjdGlvbiBpbiBwbGFjZSB0byBhdm9pZCBjcml0aWNh bC1zZWN0aW9uIGdhcC4gKi8KPiAgCWlmIChzdGF0ZXNuZXcgJiBSQ1VUT1JUVVJFX1JEUl9CSCkK PiAgCQlsb2NhbF9iaF9kaXNhYmxlKCk7Cj4gKwlpZiAoc3RhdGVzbmV3ICYgUkNVVE9SVFVSRV9S RFJfUkJIKQo+ICsJCXJjdV9yZWFkX2xvY2tfYmgoKTsKPiAgCWlmIChzdGF0ZXNuZXcgJiBSQ1VU T1JUVVJFX1JEUl9JUlEpCj4gIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKPiAgCWlmIChzdGF0ZXNu ZXcgJiBSQ1VUT1JUVVJFX1JEUl9QUkVFTVBUKQo+ICAJCXByZWVtcHRfZGlzYWJsZSgpOwo+IC0J aWYgKHN0YXRlc25ldyAmIFJDVVRPUlRVUkVfUkRSX1JCSCkKPiAtCQlyY3VfcmVhZF9sb2NrX2Jo KCk7Cj4gIAlpZiAoc3RhdGVzbmV3ICYgUkNVVE9SVFVSRV9SRFJfU0NIRUQpCj4gIAkJcmN1X3Jl YWRfbG9ja19zY2hlZCgpOwo+ICAJaWYgKHN0YXRlc25ldyAmIFJDVVRPUlRVUkVfUkRSX1JDVSkK PiAgCQlpZHhuZXcgPSBjdXJfb3BzLT5yZWFkbG9jaygpIDw8IFJDVVRPUlRVUkVfUkRSX1NISUZU Owo+ICAKPiAtCS8qIE5leHQsIHJlbW92ZSBvbGQgcHJvdGVjdGlvbiwgaXJxIGZpcnN0IGR1ZSB0 byBiaCBjb25mbGljdC4gKi8KPiArCS8qCj4gKwkgKiBOZXh0LCByZW1vdmUgb2xkIHByb3RlY3Rp b24sIGluIGRlY3JlYXNpbmcgb3JkZXIgb2Ygc3RyZW5ndGgKPiArCSAqIHRvIGF2b2lkIHVubG9j ayBwYXRocyB0aGF0IGFyZW4ndCBzYWZlIGluIHRoZSBzdHJvbmdlcgo+ICsJICogY29udGV4dC4g TmFtZWx5OiBCSCBjYW4gbm90IGJlIGVuYWJsZWQgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzLgo+ ICsJICogQWRkaXRpb25hbGx5IFBSRUVNUFRfUlQgcmVxdWlyZXMgdGhhdCBCSCBpcyBlbmFibGVk IGluIHByZWVtcHRpYmxlCj4gKwkgKiBjb250ZXh0Lgo+ICsJICovCj4gIAlpZiAoc3RhdGVzb2xk ICYgUkNVVE9SVFVSRV9SRFJfSVJRKQo+ICAJCWxvY2FsX2lycV9lbmFibGUoKTsKPiAtCWlmIChz dGF0ZXNvbGQgJiBSQ1VUT1JUVVJFX1JEUl9CSCkKPiAtCQlsb2NhbF9iaF9lbmFibGUoKTsKPiAg CWlmIChzdGF0ZXNvbGQgJiBSQ1VUT1JUVVJFX1JEUl9QUkVFTVBUKQo+ICAJCXByZWVtcHRfZW5h YmxlKCk7Cj4gLQlpZiAoc3RhdGVzb2xkICYgUkNVVE9SVFVSRV9SRFJfUkJIKQo+IC0JCXJjdV9y ZWFkX3VubG9ja19iaCgpOwo+ICAJaWYgKHN0YXRlc29sZCAmIFJDVVRPUlRVUkVfUkRSX1NDSEVE KQo+ICAJCXJjdV9yZWFkX3VubG9ja19zY2hlZCgpOwo+ICsJaWYgKHN0YXRlc29sZCAmIFJDVVRP UlRVUkVfUkRSX0JIKQo+ICsJCWxvY2FsX2JoX2VuYWJsZSgpOwo+ICsJaWYgKHN0YXRlc29sZCAm IFJDVVRPUlRVUkVfUkRSX1JCSCkKPiArCQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKPiAgCWlmIChz dGF0ZXNvbGQgJiBSQ1VUT1JUVVJFX1JEUl9SQ1UpIHsKPiAgCQlib29sIGxvY2tpdCA9ICFzdGF0 ZXNuZXcgJiYgISh0b3J0dXJlX3JhbmRvbSh0cnNwKSAmIDB4ZmZmZik7Cj4gIAo+IEBAIC0xNDk2 LDYgKzE1MDIsOSBAQCByY3V0b3J0dXJlX2V4dGVuZF9tYXNrKGludCBvbGRtYXNrLCBzdHJ1Y3Qg dG9ydHVyZV9yYW5kb21fc3RhdGUgKnRyc3ApCj4gIAlpbnQgbWFzayA9IHJjdXRvcnR1cmVfZXh0 ZW5kX21hc2tfbWF4KCk7Cj4gIAl1bnNpZ25lZCBsb25nIHJhbmRtYXNrMSA9IHRvcnR1cmVfcmFu ZG9tKHRyc3ApID4+IDg7Cj4gIAl1bnNpZ25lZCBsb25nIHJhbmRtYXNrMiA9IHJhbmRtYXNrMSA+ PiAzOwo+ICsJdW5zaWduZWQgbG9uZyBwcmVlbXB0cyA9IFJDVVRPUlRVUkVfUkRSX1BSRUVNUFQg fCBSQ1VUT1JUVVJFX1JEUl9TQ0hFRDsKPiArCXVuc2lnbmVkIGxvbmcgcHJlZW1wdHNfaXJxID0g cHJlZW1wdHMgfCBSQ1VUT1JUVVJFX1JEUl9JUlE7Cj4gKwl1bnNpZ25lZCBsb25nIGJocyA9IFJD VVRPUlRVUkVfUkRSX0JIIHwgUkNVVE9SVFVSRV9SRFJfUkJIOwo+ICAKPiAgCVdBUk5fT05fT05D RShtYXNrID4+IFJDVVRPUlRVUkVfUkRSX1NISUZUKTsKPiAgCS8qIE1vc3RseSBvbmx5IG9uZSBi aXQgKG5lZWQgcHJlZW1wdGlvbiEpLCBzb21ldGltZXMgbG90cyBvZiBiaXRzLiAqLwo+IEBAIC0x NTAzLDExICsxNTEyLDI2IEBAIHJjdXRvcnR1cmVfZXh0ZW5kX21hc2soaW50IG9sZG1hc2ssIHN0 cnVjdCB0b3J0dXJlX3JhbmRvbV9zdGF0ZSAqdHJzcCkKPiAgCQltYXNrID0gbWFzayAmIHJhbmRt YXNrMjsKPiAgCWVsc2UKPiAgCQltYXNrID0gbWFzayAmICgxIDw8IChyYW5kbWFzazIgJSBSQ1VU T1JUVVJFX1JEUl9OQklUUykpOwo+IC0JLyogQ2FuJ3QgZW5hYmxlIGJoIHcvaXJxIGRpc2FibGVk LiAqLwo+IC0JaWYgKChtYXNrICYgUkNVVE9SVFVSRV9SRFJfSVJRKSAmJgo+IC0JICAgICgoISht YXNrICYgUkNVVE9SVFVSRV9SRFJfQkgpICYmIChvbGRtYXNrICYgUkNVVE9SVFVSRV9SRFJfQkgp KSB8fAo+IC0JICAgICAoIShtYXNrICYgUkNVVE9SVFVSRV9SRFJfUkJIKSAmJiAob2xkbWFzayAm IFJDVVRPUlRVUkVfUkRSX1JCSCkpKSkKPiAtCQltYXNrIHw9IFJDVVRPUlRVUkVfUkRSX0JIIHwg UkNVVE9SVFVSRV9SRFJfUkJIOwo+ICsKPiArCS8qCj4gKwkgKiBDYW4ndCBlbmFibGUgYmggdy9p cnEgZGlzYWJsZWQuCj4gKwkgKi8KPiArCWlmIChtYXNrICYgUkNVVE9SVFVSRV9SRFJfSVJRKQo+ ICsJCW1hc2sgfD0gb2xkbWFzayAmIGJoczsKPiArCj4gKwkvKgo+ICsJICogSWRlYWxseSB0aGVz ZSBzZXF1ZW5jZXMgd291bGQgYmUgZGV0ZWN0ZWQgaW4gZGVidWcgYnVpbGRzCj4gKwkgKiAocmVn YXJkbGVzcyBvZiBSVCksIGJ1dCB1bnRpbCB0aGVuIGRvbid0IHN0b3AgdGVzdGluZwo+ICsJICog dGhlbSBvbiBub24tUlQuCj4gKwkgKi8KPiArCWlmIChJU19FTkFCTEVEKENPTkZJR19QUkVFTVBU X1JUKSkgewo+ICsJCS8qIENhbid0IG1vZGlmeSBCSCBpbiBhdG9taWMgY29udGV4dCAqLwo+ICsJ CWlmIChvbGRtYXNrICYgcHJlZW1wdHNfaXJxKQo+ICsJCQltYXNrICY9IH5iaHM7Cj4gKwkJaWYg KChvbGRtYXNrIHwgbWFzaykgJiBwcmVlbXB0c19pcnEpCj4gKwkJCW1hc2sgfD0gb2xkbWFzayAm IGJoczsKPiArCX0KPiArCj4gIAlyZXR1cm4gbWFzayA/OiBSQ1VUT1JUVVJFX1JEUl9SQ1U7Cj4g IH0KPiAgCj4gLS0gCj4gMi4zMy4wCj4gCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0t a2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==