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=-0.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no 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 C20D5C7618B for ; Thu, 25 Jul 2019 05:09:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8DF742189F for ; Thu, 25 Jul 2019 05:09:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390427AbfGYFJU (ORCPT ); Thu, 25 Jul 2019 01:09:20 -0400 Received: from mail-qt1-f193.google.com ([209.85.160.193]:37918 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390424AbfGYFJU (ORCPT ); Thu, 25 Jul 2019 01:09:20 -0400 Received: by mail-qt1-f193.google.com with SMTP id n11so47863428qtl.5 for ; Wed, 24 Jul 2019 22:09:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=SnXooH6bRth1jD1xI5jgub1n7W/9cDeezB8IK/8FBvM=; b=pGF0iZ/byiwzueszTqZPMydpL4KSb4ARL+9zHl8Zq+a+zY2tq0P5wl9XIyOV02k5rN qWNVzLDyRv+s3Z2eOqCVG/L44dxd/eToH+kcMjmBTvGXDq8rXA72w8RIDVdQVIxoqCEZ D1dTwmgkOeiolXp+xd6Zh4z7f+CVGdjgSMkFHm9UKcrtJFv1DrMTiWuKdM7R6J0swz6y LOE6yZGsrZCy1ELwgx/bZ9GVC52lIzrE21A8/PJqA/Bk0xUJOcaoDThUgm+trWdnqOyj i6wOVc0S7IKnrHcB1fU4YASrbTZ90tlUQ67R+gWblIzfWNZe3LFDl6MmZIYSpjGENMBr huZg== X-Gm-Message-State: APjAAAVauThRAZc7wZdjNxDpnfDkJHhUuM/yLnnSiAWKotuKsp+KQAi8 RqZzOtjnQS/NKxcMjCwCUmzrqA== X-Google-Smtp-Source: APXvYqzxEY8dCmXk72rFnbRyLodej+/+AemVfFopwhCrDsk6CUcwTNrtK1TN+HZM5zzMAfs0Ax/wsg== X-Received: by 2002:aed:3325:: with SMTP id u34mr59397385qtd.324.1564031358875; Wed, 24 Jul 2019 22:09:18 -0700 (PDT) Received: from redhat.com (bzq-79-181-91-42.red.bezeqint.net. [79.181.91.42]) by smtp.gmail.com with ESMTPSA id m5sm20753530qke.25.2019.07.24.22.09.11 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Wed, 24 Jul 2019 22:09:17 -0700 (PDT) Date: Thu, 25 Jul 2019 01:09:08 -0400 From: "Michael S. Tsirkin" To: Jason Wang Cc: syzbot , aarcange@redhat.com, akpm@linux-foundation.org, christian@brauner.io, davem@davemloft.net, ebiederm@xmission.com, elena.reshetova@intel.com, guro@fb.com, hch@infradead.org, james.bottomley@hansenpartnership.com, jglisse@redhat.com, keescook@chromium.org, ldv@altlinux.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-parisc@vger.kernel.org, luto@amacapital.net, mhocko@suse.com, mingo@kernel.org, namit@vmware.com, peterz@infradead.org, syzkaller-bugs@googlegroups.com, viro@zeniv.linux.org.uk, wad@chromium.org Subject: Re: WARNING in __mmdrop Message-ID: <20190725010342-mutt-send-email-mst@kernel.org> References: <20190723032800-mutt-send-email-mst@kernel.org> <20190723062221-mutt-send-email-mst@kernel.org> <9baa4214-67fd-7ad2-cbad-aadf90bbfc20@redhat.com> <20190723110219-mutt-send-email-mst@kernel.org> <20190724040238-mutt-send-email-mst@kernel.org> <3dfa2269-60ba-7dd8-99af-5aef8552bd98@redhat.com> <20190724142533-mutt-send-email-mst@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Sender: linux-parisc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-parisc@vger.kernel.org On Thu, Jul 25, 2019 at 11:44:27AM +0800, Jason Wang wrote: > > On 2019/7/25 上午2:25, Michael S. Tsirkin wrote: > > On Wed, Jul 24, 2019 at 06:08:05PM +0800, Jason Wang wrote: > > > On 2019/7/24 下午4:05, Michael S. Tsirkin wrote: > > > > On Wed, Jul 24, 2019 at 10:17:14AM +0800, Jason Wang wrote: > > > > > On 2019/7/23 下午11:02, Michael S. Tsirkin wrote: > > > > > > On Tue, Jul 23, 2019 at 09:34:29PM +0800, Jason Wang wrote: > > > > > > > On 2019/7/23 下午6:27, Michael S. Tsirkin wrote: > > > > > > > > > Yes, since there could be multiple co-current invalidation requests. We need > > > > > > > > > count them to make sure we don't pin wrong pages. > > > > > > > > > > > > > > > > > > > > > > > > > > > > I also wonder about ordering. kvm has this: > > > > > > > > > > /* > > > > > > > > > > * Used to check for invalidations in progress, of the pfn that is > > > > > > > > > > * returned by pfn_to_pfn_prot below. > > > > > > > > > > */ > > > > > > > > > > mmu_seq = kvm->mmu_notifier_seq; > > > > > > > > > > /* > > > > > > > > > > * Ensure the read of mmu_notifier_seq isn't reordered with PTE reads in > > > > > > > > > > * gfn_to_pfn_prot() (which calls get_user_pages()), so that we don't > > > > > > > > > > * risk the page we get a reference to getting unmapped before we have a > > > > > > > > > > * chance to grab the mmu_lock without mmu_notifier_retry() noticing. > > > > > > > > > > * > > > > > > > > > > * This smp_rmb() pairs with the effective smp_wmb() of the combination > > > > > > > > > > * of the pte_unmap_unlock() after the PTE is zapped, and the > > > > > > > > > > * spin_lock() in kvm_mmu_notifier_invalidate_() before > > > > > > > > > > * mmu_notifier_seq is incremented. > > > > > > > > > > */ > > > > > > > > > > smp_rmb(); > > > > > > > > > > > > > > > > > > > > does this apply to us? Can't we use a seqlock instead so we do > > > > > > > > > > not need to worry? > > > > > > > > > I'm not familiar with kvm MMU internals, but we do everything under of > > > > > > > > > mmu_lock. > > > > > > > > > > > > > > > > > > Thanks > > > > > > > > I don't think this helps at all. > > > > > > > > > > > > > > > > There's no lock between checking the invalidate counter and > > > > > > > > get user pages fast within vhost_map_prefetch. So it's possible > > > > > > > > that get user pages fast reads PTEs speculatively before > > > > > > > > invalidate is read. > > > > > > > > > > > > > > > > -- > > > > > > > In vhost_map_prefetch() we do: > > > > > > > > > > > > > >         spin_lock(&vq->mmu_lock); > > > > > > > > > > > > > >         ... > > > > > > > > > > > > > >         err = -EFAULT; > > > > > > >         if (vq->invalidate_count) > > > > > > >                 goto err; > > > > > > > > > > > > > >         ... > > > > > > > > > > > > > >         npinned = __get_user_pages_fast(uaddr->uaddr, npages, > > > > > > >                                         uaddr->write, pages); > > > > > > > > > > > > > >         ... > > > > > > > > > > > > > >         spin_unlock(&vq->mmu_lock); > > > > > > > > > > > > > > Is this not sufficient? > > > > > > > > > > > > > > Thanks > > > > > > So what orders __get_user_pages_fast wrt invalidate_count read? > > > > > So in invalidate_end() callback we have: > > > > > > > > > > spin_lock(&vq->mmu_lock); > > > > > --vq->invalidate_count; > > > > >         spin_unlock(&vq->mmu_lock); > > > > > > > > > > > > > > > So even PTE is read speculatively before reading invalidate_count (only in > > > > > the case of invalidate_count is zero). The spinlock has guaranteed that we > > > > > won't read any stale PTEs. > > > > > > > > > > Thanks > > > > I'm sorry I just do not get the argument. > > > > If you want to order two reads you need an smp_rmb > > > > or stronger between them executed on the same CPU. > > > > > > > > Executing any kind of barrier on another CPU > > > > will have no ordering effect on the 1st one. > > > > > > > > > > > > So if CPU1 runs the prefetch, and CPU2 runs invalidate > > > > callback, read of invalidate counter on CPU1 can bypass > > > > read of PTE on CPU1 unless there's a barrier > > > > in between, and nothing CPU2 does can affect that outcome. > > > > > > > > > > > > What did I miss? > > > > > > It doesn't harm if PTE is read before invalidate_count, this is because: > > > > > > 1) This speculation is serialized with invalidate_range_end() because of the > > > spinlock > > > > > > 2) This speculation can only make effect when we read invalidate_count as > > > zero. > > > > > > 3) This means the speculation is done after the last invalidate_range_end() > > > and because of the spinlock, when we enter the critical section of spinlock > > > in prefetch, we can not see any stale PTE that was unmapped before. > > > > > > Am I wrong? > > > > > > Thanks > > OK I think you are right. Sorry it took me a while to figure out. > > > No problem. So do you want me to send a V2 of the fixes (e.g with the > conversion from synchronize_rcu() to kfree_rcu()). Or you want something > else. (e.g revert or a config option)? > > Thanks Pls post V2 and I'll do my best to do a thorough review. We can then decide, if we find more issues then patch revert makes more sense IMHO. If we don't let's keep it in and if issues surface close to release we can flip the config option. -- MST 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=-0.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED autolearn=no 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 69F38C76191 for ; Thu, 25 Jul 2019 05:09:25 +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 34C1022BED for ; Thu, 25 Jul 2019 05:09:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="fHEAhVxu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 34C1022BED Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.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:In-Reply-To:MIME-Version:References: Message-ID:Subject: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=8HYk+TS9pEd/KSkB8NC3D7ZwOx51Wr0CC+8X4O1+npY=; b=fHEAhVxu7JfY7I NF3LHMXuTHtQkTP0a4ZrVMBfFfGz+VXLzOBPs6eib6RDnk9kGN76CCwD85cbfifRM/Rv41KuH2RuT IOWuzoH3ycxiY+pwTnuDTHxOv5TEH9MIYYxaQcC47KIDTbva6kjLy2TWD1YK2NZbtG0+j2zmdbUUz Jyns7PkEDPsnZ7oASgv96NOu8gLhp7llcLwIen7xI9kXOB+dpvnGEchk92sf2ah1tcPi5CCWa65Ob vFN2tPW2wUGx1Hazmsd2y+ThYjOGdzBEuBNYJl7riUjOgh27nKEwHJMB9nPLOr9Uve7hfuXoJq1lO M2bQ//5vjzZUXnDKsKCg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hqW0K-0002Av-Lv; Thu, 25 Jul 2019 05:09:24 +0000 Received: from mail-qt1-f196.google.com ([209.85.160.196]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hqW0F-0002A2-Vj for linux-arm-kernel@lists.infradead.org; Thu, 25 Jul 2019 05:09:22 +0000 Received: by mail-qt1-f196.google.com with SMTP id r6so43653382qtt.0 for ; Wed, 24 Jul 2019 22:09:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=SnXooH6bRth1jD1xI5jgub1n7W/9cDeezB8IK/8FBvM=; b=Sz6lDLPweVhjd5vl+KdvHjOajTIxHjnlPAuBPqhmLQEupWf9iqpn0f0k8SsdTOoDld YJphnpDQHTfrkNUNfimB/CN3LRsV4PbTGxSg5qGUIeiDjyGEyiEFudlL3c8NyUTo1Yvb P0/Qlo7aO5wkLDV8i9ahOw7zuhdkMTad//tz1/jvL2q9zjof15kv0xgZ2u17FlRMfPFW CZew4WWoz/7q6puRNKWBkZ4gB80/7dQrP9KP74nlyy7MTPeDomJE8KbydUzhEeX4BrAD /gtLQRGMdjw8h7WJNXZVMWD7iCZv8l78+w+4Jf51kmu+CD/f8KE/Yww0V4HoLyPDPKMV P76w== X-Gm-Message-State: APjAAAVVAoZhQW9I+H6Dsd2VkjI1a81Wrn/KysCgSnalC2+kOtlo6U5w qqvU5Z4wooMp4xlMv1QzLMLMCg== X-Google-Smtp-Source: APXvYqzxEY8dCmXk72rFnbRyLodej+/+AemVfFopwhCrDsk6CUcwTNrtK1TN+HZM5zzMAfs0Ax/wsg== X-Received: by 2002:aed:3325:: with SMTP id u34mr59397385qtd.324.1564031358875; Wed, 24 Jul 2019 22:09:18 -0700 (PDT) Received: from redhat.com (bzq-79-181-91-42.red.bezeqint.net. [79.181.91.42]) by smtp.gmail.com with ESMTPSA id m5sm20753530qke.25.2019.07.24.22.09.11 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Wed, 24 Jul 2019 22:09:17 -0700 (PDT) Date: Thu, 25 Jul 2019 01:09:08 -0400 From: "Michael S. Tsirkin" To: Jason Wang Subject: Re: WARNING in __mmdrop Message-ID: <20190725010342-mutt-send-email-mst@kernel.org> References: <20190723032800-mutt-send-email-mst@kernel.org> <20190723062221-mutt-send-email-mst@kernel.org> <9baa4214-67fd-7ad2-cbad-aadf90bbfc20@redhat.com> <20190723110219-mutt-send-email-mst@kernel.org> <20190724040238-mutt-send-email-mst@kernel.org> <3dfa2269-60ba-7dd8-99af-5aef8552bd98@redhat.com> <20190724142533-mutt-send-email-mst@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190724_220920_027749_3FFBEA6C X-CRM114-Status: GOOD ( 29.01 ) 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: mhocko@suse.com, peterz@infradead.org, ldv@altlinux.org, james.bottomley@hansenpartnership.com, linux-mm@kvack.org, namit@vmware.com, mingo@kernel.org, elena.reshetova@intel.com, keescook@chromium.org, aarcange@redhat.com, davem@davemloft.net, hch@infradead.org, christian@brauner.io, syzbot , syzkaller-bugs@googlegroups.com, jglisse@redhat.com, viro@zeniv.linux.org.uk, linux-arm-kernel@lists.infradead.org, wad@chromium.org, linux-parisc@vger.kernel.org, linux-kernel@vger.kernel.org, luto@amacapital.net, ebiederm@xmission.com, akpm@linux-foundation.org, guro@fb.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gVGh1LCBKdWwgMjUsIDIwMTkgYXQgMTE6NDQ6MjdBTSArMDgwMCwgSmFzb24gV2FuZyB3cm90 ZToKPiAKPiBPbiAyMDE5LzcvMjUg5LiK5Y2IMjoyNSwgTWljaGFlbCBTLiBUc2lya2luIHdyb3Rl Ogo+ID4gT24gV2VkLCBKdWwgMjQsIDIwMTkgYXQgMDY6MDg6MDVQTSArMDgwMCwgSmFzb24gV2Fu ZyB3cm90ZToKPiA+ID4gT24gMjAxOS83LzI0IOS4i+WNiDQ6MDUsIE1pY2hhZWwgUy4gVHNpcmtp biB3cm90ZToKPiA+ID4gPiBPbiBXZWQsIEp1bCAyNCwgMjAxOSBhdCAxMDoxNzoxNEFNICswODAw LCBKYXNvbiBXYW5nIHdyb3RlOgo+ID4gPiA+ID4gT24gMjAxOS83LzIzIOS4i+WNiDExOjAyLCBN aWNoYWVsIFMuIFRzaXJraW4gd3JvdGU6Cj4gPiA+ID4gPiA+IE9uIFR1ZSwgSnVsIDIzLCAyMDE5 IGF0IDA5OjM0OjI5UE0gKzA4MDAsIEphc29uIFdhbmcgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gT24g MjAxOS83LzIzIOS4i+WNiDY6MjcsIE1pY2hhZWwgUy4gVHNpcmtpbiB3cm90ZToKPiA+ID4gPiA+ ID4gPiA+ID4gWWVzLCBzaW5jZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBjby1jdXJyZW50IGlu dmFsaWRhdGlvbiByZXF1ZXN0cy4gV2UgbmVlZAo+ID4gPiA+ID4gPiA+ID4gPiBjb3VudCB0aGVt IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBwaW4gd3JvbmcgcGFnZXMuCj4gPiA+ID4gPiA+ID4gPiA+ IAo+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiBJIGFsc28gd29uZGVyIGFi b3V0IG9yZGVyaW5nLiBrdm0gaGFzIHRoaXM6Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAg ICAgLyoKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgICAgICogVXNlZCB0byBjaGVjayBm b3IgaW52YWxpZGF0aW9ucyBpbiBwcm9ncmVzcywgb2YgdGhlIHBmbiB0aGF0IGlzCj4gPiA+ID4g PiA+ID4gPiA+ID4gICAgICAgICAgICAgICAqIHJldHVybmVkIGJ5IHBmbl90b19wZm5fcHJvdCBi ZWxvdy4KPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgICAgICovCj4gPiA+ID4gPiA+ID4g PiA+ID4gICAgICAgICAgICAgIG1tdV9zZXEgPSBrdm0tPm1tdV9ub3RpZmllcl9zZXE7Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gICAgICAgICAgICAgIC8qCj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAg ICAgICAgICAqIEVuc3VyZSB0aGUgcmVhZCBvZiBtbXVfbm90aWZpZXJfc2VxIGlzbid0IHJlb3Jk ZXJlZCB3aXRoIFBURSByZWFkcyBpbgo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgICAgICAg KiBnZm5fdG9fcGZuX3Byb3QoKSAod2hpY2ggY2FsbHMgZ2V0X3VzZXJfcGFnZXMoKSksIHNvIHRo YXQgd2UgZG9uJ3QKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgICAgICogcmlzayB0aGUg cGFnZSB3ZSBnZXQgYSByZWZlcmVuY2UgdG8gZ2V0dGluZyB1bm1hcHBlZCBiZWZvcmUgd2UgaGF2 ZSBhCj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgICAgICAqIGNoYW5jZSB0byBncmFiIHRo ZSBtbXVfbG9jayB3aXRob3V0IG1tdV9ub3RpZmllcl9yZXRyeSgpIG5vdGljaW5nLgo+ID4gPiA+ ID4gPiA+ID4gPiA+ICAgICAgICAgICAgICAgKgo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgICAg ICAgICAgKiBUaGlzIHNtcF9ybWIoKSBwYWlycyB3aXRoIHRoZSBlZmZlY3RpdmUgc21wX3dtYigp IG9mIHRoZSBjb21iaW5hdGlvbgo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgICAgICAgKiBv ZiB0aGUgcHRlX3VubWFwX3VubG9jaygpIGFmdGVyIHRoZSBQVEUgaXMgemFwcGVkLCBhbmQgdGhl Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgICAgICAqIHNwaW5fbG9jaygpIGluIGt2bV9t bXVfbm90aWZpZXJfaW52YWxpZGF0ZV88cGFnZXxyYW5nZV9lbmQ+KCkgYmVmb3JlCj4gPiA+ID4g PiA+ID4gPiA+ID4gICAgICAgICAgICAgICAqIG1tdV9ub3RpZmllcl9zZXEgaXMgaW5jcmVtZW50 ZWQuCj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgICAgICAqLwo+ID4gPiA+ID4gPiA+ID4g PiA+ICAgICAgICAgICAgICBzbXBfcm1iKCk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4g PiA+ID4gPiA+ID4gZG9lcyB0aGlzIGFwcGx5IHRvIHVzPyBDYW4ndCB3ZSB1c2UgYSBzZXFsb2Nr IGluc3RlYWQgc28gd2UgZG8KPiA+ID4gPiA+ID4gPiA+ID4gPiBub3QgbmVlZCB0byB3b3JyeT8K PiA+ID4gPiA+ID4gPiA+ID4gSSdtIG5vdCBmYW1pbGlhciB3aXRoIGt2bSBNTVUgaW50ZXJuYWxz LCBidXQgd2UgZG8gZXZlcnl0aGluZyB1bmRlciBvZgo+ID4gPiA+ID4gPiA+ID4gPiBtbXVfbG9j ay4KPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+IFRoYW5rcwo+ID4gPiA+ID4g PiA+ID4gSSBkb24ndCB0aGluayB0aGlzIGhlbHBzIGF0IGFsbC4KPiA+ID4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiA+ID4gVGhlcmUncyBubyBsb2NrIGJldHdlZW4gY2hlY2tpbmcgdGhlIGludmFs aWRhdGUgY291bnRlciBhbmQKPiA+ID4gPiA+ID4gPiA+IGdldCB1c2VyIHBhZ2VzIGZhc3Qgd2l0 aGluIHZob3N0X21hcF9wcmVmZXRjaC4gU28gaXQncyBwb3NzaWJsZQo+ID4gPiA+ID4gPiA+ID4g dGhhdCBnZXQgdXNlciBwYWdlcyBmYXN0IHJlYWRzIFBURXMgc3BlY3VsYXRpdmVseSBiZWZvcmUK PiA+ID4gPiA+ID4gPiA+IGludmFsaWRhdGUgaXMgcmVhZC4KPiA+ID4gPiA+ID4gPiA+IAo+ID4g PiA+ID4gPiA+ID4gLS0gCj4gPiA+ID4gPiA+ID4gSW4gdmhvc3RfbWFwX3ByZWZldGNoKCkgd2Ug ZG86Cj4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gICAgwqDCoMKgwqDCoMKgwqAgc3Bpbl9s b2NrKCZ2cS0+bW11X2xvY2spOwo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ICAgIMKgIMKg IMKgIMKgIC4uLgo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ICAgIMKgwqDCoMKgwqDCoMKg IGVyciA9IC1FRkFVTFQ7Cj4gPiA+ID4gPiA+ID4gICAgwqDCoMKgwqDCoMKgwqAgaWYgKHZxLT5p bnZhbGlkYXRlX2NvdW50KQo+ID4gPiA+ID4gPiA+ICAgIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBnb3RvIGVycjsKPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiAgICDCoMKgwqDC oMKgwqDCoCAuLi4KPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiAgICDCoMKgwqDCoMKgwqDC oCBucGlubmVkID0gX19nZXRfdXNlcl9wYWdlc19mYXN0KHVhZGRyLT51YWRkciwgbnBhZ2VzLAo+ ID4gPiA+ID4gPiA+ICAgIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1YWRkci0+d3JpdGUsIHBhZ2Vz KTsKPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiAgICDCoMKgwqDCoMKgwqDCoCAuLi4KPiA+ ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiAgICDCoMKgwqAgwqDCoMKgIHNwaW5fdW5sb2NrKCZ2 cS0+bW11X2xvY2spOwo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IElzIHRoaXMgbm90IHN1 ZmZpY2llbnQ/Cj4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gVGhhbmtzCj4gPiA+ID4gPiA+ IFNvIHdoYXQgb3JkZXJzIF9fZ2V0X3VzZXJfcGFnZXNfZmFzdCB3cnQgaW52YWxpZGF0ZV9jb3Vu dCByZWFkPwo+ID4gPiA+ID4gU28gaW4gaW52YWxpZGF0ZV9lbmQoKSBjYWxsYmFjayB3ZSBoYXZl Ogo+ID4gPiA+ID4gCj4gPiA+ID4gPiBzcGluX2xvY2soJnZxLT5tbXVfbG9jayk7Cj4gPiA+ID4g PiAtLXZxLT5pbnZhbGlkYXRlX2NvdW50Owo+ID4gPiA+ID4gICDCoMKgwqDCoMKgwqDCoCBzcGlu X3VubG9jaygmdnEtPm1tdV9sb2NrKTsKPiA+ID4gPiA+IAo+ID4gPiA+ID4gCj4gPiA+ID4gPiBT byBldmVuIFBURSBpcyByZWFkIHNwZWN1bGF0aXZlbHkgYmVmb3JlIHJlYWRpbmcgaW52YWxpZGF0 ZV9jb3VudCAob25seSBpbgo+ID4gPiA+ID4gdGhlIGNhc2Ugb2YgaW52YWxpZGF0ZV9jb3VudCBp cyB6ZXJvKS4gVGhlIHNwaW5sb2NrIGhhcyBndWFyYW50ZWVkIHRoYXQgd2UKPiA+ID4gPiA+IHdv bid0IHJlYWQgYW55IHN0YWxlIFBURXMuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IFRoYW5rcwo+ID4g PiA+IEknbSBzb3JyeSBJIGp1c3QgZG8gbm90IGdldCB0aGUgYXJndW1lbnQuCj4gPiA+ID4gSWYg eW91IHdhbnQgdG8gb3JkZXIgdHdvIHJlYWRzIHlvdSBuZWVkIGFuIHNtcF9ybWIKPiA+ID4gPiBv ciBzdHJvbmdlciBiZXR3ZWVuIHRoZW0gZXhlY3V0ZWQgb24gdGhlIHNhbWUgQ1BVLgo+ID4gPiA+ IAo+ID4gPiA+IEV4ZWN1dGluZyBhbnkga2luZCBvZiBiYXJyaWVyIG9uIGFub3RoZXIgQ1BVCj4g PiA+ID4gd2lsbCBoYXZlIG5vIG9yZGVyaW5nIGVmZmVjdCBvbiB0aGUgMXN0IG9uZS4KPiA+ID4g PiAKPiA+ID4gPiAKPiA+ID4gPiBTbyBpZiBDUFUxIHJ1bnMgdGhlIHByZWZldGNoLCBhbmQgQ1BV MiBydW5zIGludmFsaWRhdGUKPiA+ID4gPiBjYWxsYmFjaywgcmVhZCBvZiBpbnZhbGlkYXRlIGNv dW50ZXIgb24gQ1BVMSBjYW4gYnlwYXNzCj4gPiA+ID4gcmVhZCBvZiBQVEUgb24gQ1BVMSB1bmxl c3MgdGhlcmUncyBhIGJhcnJpZXIKPiA+ID4gPiBpbiBiZXR3ZWVuLCBhbmQgbm90aGluZyBDUFUy IGRvZXMgY2FuIGFmZmVjdCB0aGF0IG91dGNvbWUuCj4gPiA+ID4gCj4gPiA+ID4gCj4gPiA+ID4g V2hhdCBkaWQgSSBtaXNzPwo+ID4gPiAKPiA+ID4gSXQgZG9lc24ndCBoYXJtIGlmIFBURSBpcyBy ZWFkIGJlZm9yZSBpbnZhbGlkYXRlX2NvdW50LCB0aGlzIGlzIGJlY2F1c2U6Cj4gPiA+IAo+ID4g PiAxKSBUaGlzIHNwZWN1bGF0aW9uIGlzIHNlcmlhbGl6ZWQgd2l0aCBpbnZhbGlkYXRlX3Jhbmdl X2VuZCgpIGJlY2F1c2Ugb2YgdGhlCj4gPiA+IHNwaW5sb2NrCj4gPiA+IAo+ID4gPiAyKSBUaGlz IHNwZWN1bGF0aW9uIGNhbiBvbmx5IG1ha2UgZWZmZWN0IHdoZW4gd2UgcmVhZCBpbnZhbGlkYXRl X2NvdW50IGFzCj4gPiA+IHplcm8uCj4gPiA+IAo+ID4gPiAzKSBUaGlzIG1lYW5zIHRoZSBzcGVj dWxhdGlvbiBpcyBkb25lIGFmdGVyIHRoZSBsYXN0IGludmFsaWRhdGVfcmFuZ2VfZW5kKCkKPiA+ ID4gYW5kIGJlY2F1c2Ugb2YgdGhlIHNwaW5sb2NrLCB3aGVuIHdlIGVudGVyIHRoZSBjcml0aWNh bCBzZWN0aW9uIG9mIHNwaW5sb2NrCj4gPiA+IGluIHByZWZldGNoLCB3ZSBjYW4gbm90IHNlZSBh bnkgc3RhbGUgUFRFIHRoYXQgd2FzIHVubWFwcGVkIGJlZm9yZS4KPiA+ID4gCj4gPiA+IEFtIEkg d3Jvbmc/Cj4gPiA+IAo+ID4gPiBUaGFua3MKPiA+IE9LIEkgdGhpbmsgeW91IGFyZSByaWdodC4g U29ycnkgaXQgdG9vayBtZSBhIHdoaWxlIHRvIGZpZ3VyZSBvdXQuCj4gCj4gCj4gTm8gcHJvYmxl bS4gU28gZG8geW91IHdhbnQgbWUgdG8gc2VuZCBhIFYyIG9mIHRoZSBmaXhlcyAoZS5nIHdpdGgg dGhlCj4gY29udmVyc2lvbiBmcm9tIHN5bmNocm9uaXplX3JjdSgpIHRvIGtmcmVlX3JjdSgpKS4g T3IgeW91IHdhbnQgc29tZXRoaW5nCj4gZWxzZS4gKGUuZyByZXZlcnQgb3IgYSBjb25maWcgb3B0 aW9uKT8KPiAKPiBUaGFua3MKClBscyBwb3N0IFYyIGFuZCBJJ2xsIGRvIG15IGJlc3QgdG8gZG8g YSB0aG9yb3VnaCByZXZpZXcuICBXZSBjYW4gdGhlbgpkZWNpZGUsIGlmIHdlIGZpbmQgbW9yZSBp c3N1ZXMgdGhlbiBwYXRjaCByZXZlcnQgbWFrZXMgbW9yZSBzZW5zZSBJTUhPLgpJZiB3ZSBkb24n dCBsZXQncyBrZWVwIGl0IGluIGFuZCBpZiBpc3N1ZXMgc3VyZmFjZSBjbG9zZSB0byByZWxlYXNl CndlIGNhbiBmbGlwIHRoZSBjb25maWcgb3B0aW9uLgoKCgotLSAKTVNUCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxp bmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3Rz LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==