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=-5.4 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 B33C3C5DF60 for ; Thu, 7 Nov 2019 20:56:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 726902166E for ; Thu, 7 Nov 2019 20:56:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=nvidia.com header.i=@nvidia.com header.b="JYP9fwhl" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725893AbfKGU4s (ORCPT ); Thu, 7 Nov 2019 15:56:48 -0500 Received: from hqemgate15.nvidia.com ([216.228.121.64]:14349 "EHLO hqemgate15.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725818AbfKGU4r (ORCPT ); Thu, 7 Nov 2019 15:56:47 -0500 Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate15.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Thu, 07 Nov 2019 12:55:44 -0800 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Thu, 07 Nov 2019 12:56:45 -0800 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Thu, 07 Nov 2019 12:56:45 -0800 Received: from [10.2.174.146] (10.124.1.5) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Thu, 7 Nov 2019 20:56:40 +0000 Subject: Re: [PATCH v2 02/15] mm/mmu_notifier: add an interval tree notifier To: Jason Gunthorpe CC: "linux-mm@kvack.org" , Jerome Glisse , Ralph Campbell , "Felix.Kuehling@amd.com" , "linux-rdma@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , "amd-gfx@lists.freedesktop.org" , Alex Deucher , Ben Skeggs , Boris Ostrovsky , =?UTF-8?Q?Christian_K=c3=b6nig?= , David Zhou , "Dennis Dalessandro" , Juergen Gross , Mike Marciniszyn , Oleksandr Andrushchenko , Petr Cvek , Stefano Stabellini , "nouveau@lists.freedesktop.org" , "xen-devel@lists.xenproject.org" , "Christoph Hellwig" , Andrea Arcangeli , "Michal Hocko" References: <20191028201032.6352-1-jgg@ziepe.ca> <20191028201032.6352-3-jgg@ziepe.ca> <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> <20191107200604.GB21728@mellanox.com> X-Nvconfidentiality: public From: John Hubbard Message-ID: <9dc2b3c7-f945-b645-b3a3-313a21d2fdfc@nvidia.com> Date: Thu, 7 Nov 2019 12:53:56 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20191107200604.GB21728@mellanox.com> X-Originating-IP: [10.124.1.5] X-ClientProxiedBy: HQMAIL101.nvidia.com (172.20.187.10) To HQMAIL107.nvidia.com (172.20.187.13) Content-Type: text/plain; charset="utf-8"; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1573160145; bh=0o7ET/y25KDp83qUXLZmAimWzQOXiF76Ve9Y+FzALFM=; h=X-PGP-Universal:Subject:To:CC:References:X-Nvconfidentiality:From: Message-ID:Date:User-Agent:MIME-Version:In-Reply-To: X-Originating-IP:X-ClientProxiedBy:Content-Type:Content-Language: Content-Transfer-Encoding; b=JYP9fwhlxIm5SsWjFushBYq1+VcYPhITepY0rqKtsp43p7cbnw2DVntkJ2D7ZXjN9 9RFMy0+hTlJ0asJ6SsFHmIq2wiyqj/mDk7puyUOaOgRHDj21gGnWZHyzEORCxkYZLy 74a5AfKJh2kMafXBVhLtO6AvoPbuLMyIZGVSYKEJggnRxhufdbR6VdL4O2pQPpa+U1 jqgmSV6LJsRB5SIp7co1IbRQP4ckPA57lwPmdlgWmNauzyrbOExEmwpyHBMSTxwN4S 7EmycUtOJ+PIgA1H5cW9YZIpCVy2Aq2XVcoPj57OTL9kVR/s89nIgeqjdpFuNKHFgt wFwSrwWLRZ3Uw== Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org On 11/7/19 12:06 PM, Jason Gunthorpe wrote: ... >> >> Also, it is best moved down to be next to the new MNR structs, so that all the >> MNR stuff is in one group. > > I agree with Jerome, this enum is part of the 'struct > mmu_notifier_range' (ie the description of the invalidation) and it > doesn't really matter that only these new notifiers can be called with > this type, it is still part of the mmu_notifier_range. > OK. > The comment already says it only applies to the mmu_range_notifier > scheme.. > >>> #define MMU_NOTIFIER_RANGE_BLOCKABLE (1 << 0) >>> @@ -222,6 +228,26 @@ struct mmu_notifier { >>> unsigned int users; >>> }; >>> >> >> That should also be moved down, next to the new structs. > > Which this? I was referring to MMU_NOTIFIER_RANGE_BLOCKABLE, above. Trying to put all the new range notifier stuff in one place. But maybe not, if these are really not as separate as I thought. > >>> +/** >>> + * struct mmu_range_notifier_ops >>> + * @invalidate: Upon return the caller must stop using any SPTEs within this >>> + * range, this function can sleep. Return false if blocking was >>> + * required but range is non-blocking >>> + */ >> >> How about this (I'm not sure I fully understand the return value, though): >> >> /** >> * struct mmu_range_notifier_ops >> * @invalidate: Upon return the caller must stop using any SPTEs within this >> * range. >> * >> * This function is permitted to sleep. >> * >> * @Return: false if blocking was required, but @range is >> * non-blocking. >> * >> */ > > Is this kdoc format for function pointers? heh, I'm sort of winging it, I'm not sure how function pointers are supposed to be documented in kdoc. Actually the only key take-away here is to write "This function can sleep" as a separate sentence.. ... >> c) Rename new one. Ideas: >> >> struct mmu_interval_notifier >> struct mmu_range_intersection >> ...other ideas? > > This odd duality has already cause some confusion, but names here are > hard. mmu_interval_notifier is the best alternative I've heard. > > Changing this name is a lot of work - are we happy > 'mmu_interval_notifier' is the right choice? Yes, it's my favorite too. I'd vote for going with that. ... >> >> >> OK, this either needs more documentation and assertions, or a different >> approach. Because I see addition, subtraction, AND, OR and booleans >> all being applied to this field, and it's darn near hopeless to figure >> out whether or not it really is even or odd at the right times. > > This is a standard design for a seqlock scheme and follows the > existing design of the linux seq lock. > > The lower bit indicates the lock'd state and the upper bits indicate > the generation of the lock > > The operations on the lock itself are then: > seq |= 1 # Take the lock > seq++ # Release an acquired lock > seq & 1 # True if locked > > Which is how this is written Very nice, would you be open to putting that into (any) one of the comment headers? That's an unusually clear and concise description: /* * This is a standard design for a seqlock scheme and follows the * existing design of the linux seq lock. * * The lower bit indicates the lock'd state and the upper bits indicate * the generation of the lock * * The operations on the lock itself are then: * seq |= 1 # Take the lock * seq++ # Release an acquired lock * seq & 1 # True if locked */ > >> Different approach: why not just add a mmn_mm->is_invalidating >> member variable? It's not like you're short of space in that struct. > > Splitting it makes alot of stuff more complex and unnatural. > OK, agreed. > The ops above could be put in inline wrappers, but they only occur > only in functions already called mn_itree_inv_start_range() and > mn_itree_inv_end() and mn_itree_is_invalidating(). > > There is the one 'take the lock' outlier in > __mmu_range_notifier_insert() though > >>> +static void mn_itree_inv_end(struct mmu_notifier_mm *mmn_mm) >>> +{ >>> + struct mmu_range_notifier *mrn; >>> + struct hlist_node *next; >>> + bool need_wake = false; >>> + >>> + spin_lock(&mmn_mm->lock); >>> + if (--mmn_mm->active_invalidate_ranges || >>> + !mn_itree_is_invalidating(mmn_mm)) { >>> + spin_unlock(&mmn_mm->lock); >>> + return; >>> + } >>> + >>> + mmn_mm->invalidate_seq++; >> >> Is this the right place for an assertion that this is now an even value? > > Yes, but I'm reluctant to add such a runtime check on this fastish path.. > How about a comment? Sure. > >>> + need_wake = true; >>> + >>> + /* >>> + * The inv_end incorporates a deferred mechanism like >>> + * rtnl_lock(). Adds and removes are queued until the final inv_end >> >> Let me point out that rtnl_lock() itself is a one-liner that calls mutex_lock(). >> But I suppose if one studies that file closely there is more. :) > > Lets change that to rtnl_unlock() then Thanks :) ... >>> + * mrn->invalidate_seq is always set to an odd value. This ensures >> >> This claim just looks wrong the first N times one reads the code, given that >> there is mmu_range_set_seq() to set it to an arbitrary value! Maybe >> you mean > > mmu_range_set_seq() is NOT to be used to set to an arbitary value, it > must only be used to set to the value provided in the invalidate() > callback and that value is always odd. Lets make this super clear: > > /* > * mrn->invalidate_seq must always be set to an odd value via > * mmu_range_set_seq() using the provided cur_seq from > * mn_itree_inv_start_range(). This ensures that if seq does wrap we > * will always clear the below sleep in some reasonable time as > * mmn_mm->invalidate_seq is even in the idle state. > */ > OK, that helps a lot. ... >>> + mrn->invalidate_seq = mmn_mm->invalidate_seq - 1; >> >> Ohhh, checkmate. I lose. Why is *subtracting* the right thing to do >> for seq numbers here? I'm acutely unhappy trying to figure this out. >> I suspect it's another unfortunate side effect of trying to use the >> lower bit of the seq number (even/odd) for something else. > > No, this is actually done for the seq number itself. We need to > generate a seq number that is != the current invalidate_seq as this > new mrn is not invalidating. > > The best seq to use is one that the invalidate_seq will not reach for > a long time, ie 'invalidate_seq + MAX' which is expressed as -1 > > The even/odd thing just takes care of itself naturally here as > invalidate_seq is guarenteed even and -1 creates both an odd mrn value > and a good seq number. > > The algorithm would actually work correctly if this was > 'mrn->invalidate_seq = 1', but occasionally things would block when > they don't need to block. > > Lets add a comment: > > /* > * The starting seq for a mrn not under invalidation should be > * odd, not equal to the current invalidate_seq and > * invalidate_seq should not 'wrap' to the new seq any time > * soon. > */ Very helpful. How about this additional tweak: /* * The starting seq for a mrn not under invalidation should be * odd, not equal to the current invalidate_seq and * invalidate_seq should not 'wrap' to the new seq any time * soon. Subtracting 1 from the current (even) value achieves that. */ > >>> +int mmu_range_notifier_insert(struct mmu_range_notifier *mrn, >>> + unsigned long start, unsigned long length, >>> + struct mm_struct *mm) >>> +{ >>> + struct mmu_notifier_mm *mmn_mm; >>> + int ret; >> >> Hmmm, I think a later patch improperly changes the above to "int ret = 0;". >> I'll check on that. It's correct here, though. > > Looks OK in my tree? Nope, that's how I found it. The top of your mmu_notifier branch has this: int __mmu_notifier_invalidate_range_start(struct mmu_notifier_range *range) { struct mmu_notifier_mm *mmn_mm = range->mm->mmu_notifier_mm; int ret = 0; if (mmn_mm->has_interval) { ret = mn_itree_invalidate(mmn_mm, range); if (ret) return ret; } if (!hlist_empty(&mmn_mm->list)) return mn_hlist_invalidate_range_start(mmn_mm, range); return 0; } > >>> + might_lock(&mm->mmap_sem); >>> + >>> + mmn_mm = smp_load_acquire(&mm->mmu_notifier_mm); >> >> What does the above pair with? Should have a comment that specifies that. > > smp_load_acquire() always pairs with smp_store_release() to the same > memory, there is only one store, is a comment really needed? > > Below are the comment updates I made, thanks! > > Jason > > diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h > index 51b92ba013ddce..065c95002e9602 100644 > --- a/include/linux/mmu_notifier.h > +++ b/include/linux/mmu_notifier.h > @@ -302,15 +302,15 @@ void mmu_range_notifier_remove(struct mmu_range_notifier *mrn); > /** > * mmu_range_set_seq - Save the invalidation sequence > * @mrn - The mrn passed to invalidate > - * @cur_seq - The cur_seq passed to invalidate > + * @cur_seq - The cur_seq passed to the invalidate() callback > * > * This must be called unconditionally from the invalidate callback of a > * struct mmu_range_notifier_ops under the same lock that is used to call > * mmu_range_read_retry(). It updates the sequence number for later use by > - * mmu_range_read_retry(). > + * mmu_range_read_retry(). The provided cur_seq will always be odd. > * > - * If the user does not call mmu_range_read_begin() or mmu_range_read_retry() > - * then this call is not required. > + * If the caller does not call mmu_range_read_begin() or > + * mmu_range_read_retry() then this call is not required. > */ > static inline void mmu_range_set_seq(struct mmu_range_notifier *mrn, > unsigned long cur_seq) > @@ -348,8 +348,9 @@ static inline bool mmu_range_read_retry(struct mmu_range_notifier *mrn, > * collided with this lock and a future mmu_range_read_retry() will return > * true. > * > - * False is not reliable and only suggests a collision has not happened. It > - * can be called many times and does not have to hold the user provided lock. > + * False is not reliable and only suggests a collision may not have > + * occured. It can be called many times and does not have to hold the user > + * provided lock. > * > * This call can be used as part of loops and other expensive operations to > * expedite a retry. > diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c > index 2b7485919ecfeb..afe1e2d94183f8 100644 > --- a/mm/mmu_notifier.c > +++ b/mm/mmu_notifier.c > @@ -51,7 +51,8 @@ struct mmu_notifier_mm { > * This is a collision-retry read-side/write-side 'lock', a lot like a > * seqcount, however this allows multiple write-sides to hold it at > * once. Conceptually the write side is protecting the values of the PTEs in > - * this mm, such that PTES cannot be read into SPTEs while any writer exists. > + * this mm, such that PTES cannot be read into SPTEs (shadow PTEs) while any > + * writer exists. > * > * Note that the core mm creates nested invalidate_range_start()/end() regions > * within the same thread, and runs invalidate_range_start()/end() in parallel > @@ -64,12 +65,13 @@ struct mmu_notifier_mm { > * > * The write side has two states, fully excluded: > * - mm->active_invalidate_ranges != 0 > - * - mnn->invalidate_seq & 1 == True > + * - mnn->invalidate_seq & 1 == True (odd) > * - some range on the mm_struct is being invalidated > * - the itree is not allowed to change > * > * And partially excluded: > * - mm->active_invalidate_ranges != 0 > + * - mnn->invalidate_seq & 1 == False (even) > * - some range on the mm_struct is being invalidated > * - the itree is allowed to change > * > @@ -131,12 +133,13 @@ static void mn_itree_inv_end(struct mmu_notifier_mm *mmn_mm) > return; > } > > + /* Make invalidate_seq even */ > mmn_mm->invalidate_seq++; > need_wake = true; > > /* > * The inv_end incorporates a deferred mechanism like > - * rtnl_lock(). Adds and removes are queued until the final inv_end > + * rtnl_unlock(). Adds and removes are queued until the final inv_end > * happens then they are progressed. This arrangement for tree updates > * is used to avoid using a blocking lock during > * invalidate_range_start. > @@ -230,10 +233,11 @@ unsigned long mmu_range_read_begin(struct mmu_range_notifier *mrn) > spin_unlock(&mmn_mm->lock); > > /* > - * mrn->invalidate_seq is always set to an odd value. This ensures > - * that if seq does wrap we will always clear the below sleep in some > - * reasonable time as mmn_mm->invalidate_seq is even in the idle > - * state. > + * mrn->invalidate_seq must always be set to an odd value via > + * mmu_range_set_seq() using the provided cur_seq from > + * mn_itree_inv_start_range(). This ensures that if seq does wrap we > + * will always clear the below sleep in some reasonable time as > + * mmn_mm->invalidate_seq is even in the idle state. > */ > lock_map_acquire(&__mmu_notifier_invalidate_range_start_map); > lock_map_release(&__mmu_notifier_invalidate_range_start_map); > @@ -892,6 +896,12 @@ static int __mmu_range_notifier_insert(struct mmu_range_notifier *mrn, > mrn->invalidate_seq = mmn_mm->invalidate_seq; > } else { > WARN_ON(mn_itree_is_invalidating(mmn_mm)); > + /* > + * The starting seq for a mrn not under invalidation should be > + * odd, not equal to the current invalidate_seq and > + * invalidate_seq should not 'wrap' to the new seq any time > + * soon. > + */ > mrn->invalidate_seq = mmn_mm->invalidate_seq - 1; > interval_tree_insert(&mrn->interval_tree, &mmn_mm->itree); > } > Looks good. We're just polishing up minor points now, so you can add: Reviewed-by: John Hubbard thanks, -- John Hubbard NVIDIA From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Hubbard Subject: Re: [PATCH v2 02/15] mm/mmu_notifier: add an interval tree notifier Date: Thu, 7 Nov 2019 12:53:56 -0800 Message-ID: <9dc2b3c7-f945-b645-b3a3-313a21d2fdfc@nvidia.com> References: <20191028201032.6352-1-jgg@ziepe.ca> <20191028201032.6352-3-jgg@ziepe.ca> <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> <20191107200604.GB21728@mellanox.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20191107200604.GB21728@mellanox.com> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jason Gunthorpe Cc: "nouveau@lists.freedesktop.org" , "dri-devel@lists.freedesktop.org" , Michal Hocko , "linux-mm@kvack.org" , Andrea Arcangeli , Stefano Stabellini , Oleksandr Andrushchenko , "linux-rdma@vger.kernel.org" , "amd-gfx@lists.freedesktop.org" , Christoph Hellwig , Ben Skeggs , "xen-devel@lists.xenproject.org" , Ralph Campbell , Jerome Glisse , Boris Ostrovsky , Petr Cvek , Juergen Gross , Mike Marciniszyn , Dennis Dalessandro List-Id: nouveau.vger.kernel.org T24gMTEvNy8xOSAxMjowNiBQTSwgSmFzb24gR3VudGhvcnBlIHdyb3RlOgouLi4KPj4KPj4gQWxz bywgaXQgaXMgYmVzdCBtb3ZlZCBkb3duIHRvIGJlIG5leHQgdG8gdGhlIG5ldyBNTlIgc3RydWN0 cywgc28gdGhhdCBhbGwgdGhlCj4+IE1OUiBzdHVmZiBpcyBpbiBvbmUgZ3JvdXAuCj4gCj4gSSBh Z3JlZSB3aXRoIEplcm9tZSwgdGhpcyBlbnVtIGlzIHBhcnQgb2YgdGhlICdzdHJ1Y3QKPiBtbXVf bm90aWZpZXJfcmFuZ2UnIChpZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGludmFsaWRhdGlvbikg YW5kIGl0Cj4gZG9lc24ndCByZWFsbHkgbWF0dGVyIHRoYXQgb25seSB0aGVzZSBuZXcgbm90aWZp ZXJzIGNhbiBiZSBjYWxsZWQgd2l0aAo+IHRoaXMgdHlwZSwgaXQgaXMgc3RpbGwgcGFydCBvZiB0 aGUgbW11X25vdGlmaWVyX3JhbmdlLgo+IAoKT0suCgo+IFRoZSBjb21tZW50IGFscmVhZHkgc2F5 cyBpdCBvbmx5IGFwcGxpZXMgdG8gdGhlIG1tdV9yYW5nZV9ub3RpZmllcgo+IHNjaGVtZS4uCj4g Cj4+PiAgICNkZWZpbmUgTU1VX05PVElGSUVSX1JBTkdFX0JMT0NLQUJMRSAoMSA8PCAwKQo+Pj4g QEAgLTIyMiw2ICsyMjgsMjYgQEAgc3RydWN0IG1tdV9ub3RpZmllciB7Cj4+PiAgIAl1bnNpZ25l ZCBpbnQgdXNlcnM7Cj4+PiAgIH07Cj4+PiAgIAo+Pgo+PiBUaGF0IHNob3VsZCBhbHNvIGJlIG1v dmVkIGRvd24sIG5leHQgdG8gdGhlIG5ldyBzdHJ1Y3RzLgo+IAo+IFdoaWNoIHRoaXM/CgpJIHdh cyByZWZlcnJpbmcgdG8gTU1VX05PVElGSUVSX1JBTkdFX0JMT0NLQUJMRSwgYWJvdmUuIFRyeWlu Zwp0byBwdXQgYWxsIHRoZSBuZXcgcmFuZ2Ugbm90aWZpZXIgc3R1ZmYgaW4gb25lIHBsYWNlLiBC dXQgbWF5YmUgbm90LAppZiB0aGVzZSBhcmUgcmVhbGx5IG5vdCBhcyBzZXBhcmF0ZSBhcyBJIHRo b3VnaHQuCgo+IAo+Pj4gKy8qKgo+Pj4gKyAqIHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXJfb3Bz Cj4+PiArICogQGludmFsaWRhdGU6IFVwb24gcmV0dXJuIHRoZSBjYWxsZXIgbXVzdCBzdG9wIHVz aW5nIGFueSBTUFRFcyB3aXRoaW4gdGhpcwo+Pj4gKyAqICAgICAgICAgICAgICByYW5nZSwgdGhp cyBmdW5jdGlvbiBjYW4gc2xlZXAuIFJldHVybiBmYWxzZSBpZiBibG9ja2luZyB3YXMKPj4+ICsg KiAgICAgICAgICAgICAgcmVxdWlyZWQgYnV0IHJhbmdlIGlzIG5vbi1ibG9ja2luZwo+Pj4gKyAq Lwo+Pgo+PiBIb3cgYWJvdXQgdGhpcyAoSSdtIG5vdCBzdXJlIEkgZnVsbHkgdW5kZXJzdGFuZCB0 aGUgcmV0dXJuIHZhbHVlLCB0aG91Z2gpOgo+Pgo+PiAvKioKPj4gICAqIHN0cnVjdCBtbXVfcmFu Z2Vfbm90aWZpZXJfb3BzCj4+ICAgKiBAaW52YWxpZGF0ZTogVXBvbiByZXR1cm4gdGhlIGNhbGxl ciBtdXN0IHN0b3AgdXNpbmcgYW55IFNQVEVzIHdpdGhpbiB0aGlzCj4+ICAgKiAJCXJhbmdlLgo+ PiAgICoKPj4gICAqIAkJVGhpcyBmdW5jdGlvbiBpcyBwZXJtaXR0ZWQgdG8gc2xlZXAuCj4+ICAg Kgo+PiAgICogICAgICAJQFJldHVybjogZmFsc2UgaWYgYmxvY2tpbmcgd2FzIHJlcXVpcmVkLCBi dXQgQHJhbmdlIGlzCj4+ICAgKgkJCW5vbi1ibG9ja2luZy4KPj4gICAqCj4+ICAgKi8KPiAKPiBJ cyB0aGlzIGtkb2MgZm9ybWF0IGZvciBmdW5jdGlvbiBwb2ludGVycz8KCmhlaCwgSSdtIHNvcnQg b2Ygd2luZ2luZyBpdCwgSSdtIG5vdCBzdXJlIGhvdyBmdW5jdGlvbiBwb2ludGVycyBhcmUgc3Vw cG9zZWQKdG8gYmUgZG9jdW1lbnRlZCBpbiBrZG9jLiBBY3R1YWxseSB0aGUgb25seSBrZXkgdGFr ZS1hd2F5IGhlcmUgaXMgdG8gd3JpdGUKCiJUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcCIKCmFzIGEg c2VwYXJhdGUgc2VudGVuY2UuLgoKLi4uCj4+IGMpIFJlbmFtZSBuZXcgb25lLiBJZGVhczoKPj4K Pj4gICAgICBzdHJ1Y3QgbW11X2ludGVydmFsX25vdGlmaWVyCj4+ICAgICAgc3RydWN0IG1tdV9y YW5nZV9pbnRlcnNlY3Rpb24KPj4gICAgICAuLi5vdGhlciBpZGVhcz8KPiAKPiBUaGlzIG9kZCBk dWFsaXR5IGhhcyBhbHJlYWR5IGNhdXNlIHNvbWUgY29uZnVzaW9uLCBidXQgbmFtZXMgaGVyZSBh cmUKPiBoYXJkLiAgbW11X2ludGVydmFsX25vdGlmaWVyIGlzIHRoZSBiZXN0IGFsdGVybmF0aXZl IEkndmUgaGVhcmQuCj4gCj4gQ2hhbmdpbmcgdGhpcyBuYW1lIGlzIGEgbG90IG9mIHdvcmsgLSBh cmUgd2UgaGFwcHkKPiAnbW11X2ludGVydmFsX25vdGlmaWVyJyBpcyB0aGUgcmlnaHQgY2hvaWNl PwoKClllcywgaXQncyBteSBmYXZvcml0ZSB0b28uIEknZCB2b3RlIGZvciBnb2luZyB3aXRoIHRo YXQuCgouLi4KPj4KPj4KPj4gT0ssIHRoaXMgZWl0aGVyIG5lZWRzIG1vcmUgZG9jdW1lbnRhdGlv biBhbmQgYXNzZXJ0aW9ucywgb3IgYSBkaWZmZXJlbnQKPj4gYXBwcm9hY2guIEJlY2F1c2UgSSBz ZWUgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBBTkQsIE9SIGFuZCBib29sZWFucwo+PiBhbGwgYmVp bmcgYXBwbGllZCB0byB0aGlzIGZpZWxkLCBhbmQgaXQncyBkYXJuIG5lYXIgaG9wZWxlc3MgdG8g ZmlndXJlCj4+IG91dCB3aGV0aGVyIG9yIG5vdCBpdCByZWFsbHkgaXMgZXZlbiBvciBvZGQgYXQg dGhlIHJpZ2h0IHRpbWVzLgo+IAo+IFRoaXMgaXMgYSBzdGFuZGFyZCBkZXNpZ24gZm9yIGEgc2Vx bG9jayBzY2hlbWUgYW5kIGZvbGxvd3MgdGhlCj4gZXhpc3RpbmcgZGVzaWduIG9mIHRoZSBsaW51 eCBzZXEgbG9jay4KPiAKPiBUaGUgbG93ZXIgYml0IGluZGljYXRlcyB0aGUgbG9jaydkIHN0YXRl IGFuZCB0aGUgdXBwZXIgYml0cyBpbmRpY2F0ZQo+IHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBsb2Nr Cj4gCj4gVGhlIG9wZXJhdGlvbnMgb24gdGhlIGxvY2sgaXRzZWxmIGFyZSB0aGVuOgo+ICAgICBz ZXEgfD0gMSAgIyBUYWtlIHRoZSBsb2NrCj4gICAgIHNlcSsrICAgICAjIFJlbGVhc2UgYW4gYWNx dWlyZWQgbG9jawo+ICAgICBzZXEgJiAxICAgIyBUcnVlIGlmIGxvY2tlZAo+IAo+IFdoaWNoIGlz IGhvdyB0aGlzIGlzIHdyaXR0ZW4KClZlcnkgbmljZSwgd291bGQgeW91IGJlIG9wZW4gdG8gcHV0 dGluZyB0aGF0IGludG8gKGFueSkgb25lIG9mIHRoZSBjb21tZW50CmhlYWRlcnM/IFRoYXQncyBh biB1bnVzdWFsbHkgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb246CgovKgogICogVGhpcyBp cyBhIHN0YW5kYXJkIGRlc2lnbiBmb3IgYSBzZXFsb2NrIHNjaGVtZSBhbmQgZm9sbG93cyB0aGUK ICAqIGV4aXN0aW5nIGRlc2lnbiBvZiB0aGUgbGludXggc2VxIGxvY2suCiAgKgogICogVGhlIGxv d2VyIGJpdCBpbmRpY2F0ZXMgdGhlIGxvY2snZCBzdGF0ZSBhbmQgdGhlIHVwcGVyIGJpdHMgaW5k aWNhdGUKICAqIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBsb2NrCiAgKgogICogVGhlIG9wZXJhdGlv bnMgb24gdGhlIGxvY2sgaXRzZWxmIGFyZSB0aGVuOgogICogICAgc2VxIHw9IDEgICMgVGFrZSB0 aGUgbG9jawogICogICAgc2VxKysgICAgICMgUmVsZWFzZSBhbiBhY3F1aXJlZCBsb2NrCiAgKiAg ICBzZXEgJiAxICAgIyBUcnVlIGlmIGxvY2tlZAogICovCgoKPiAKPj4gRGlmZmVyZW50IGFwcHJv YWNoOiB3aHkgbm90IGp1c3QgYWRkIGEgbW1uX21tLT5pc19pbnZhbGlkYXRpbmcKPj4gbWVtYmVy IHZhcmlhYmxlPyBJdCdzIG5vdCBsaWtlIHlvdSdyZSBzaG9ydCBvZiBzcGFjZSBpbiB0aGF0IHN0 cnVjdC4KPiAKPiBTcGxpdHRpbmcgaXQgbWFrZXMgYWxvdCBvZiBzdHVmZiBtb3JlIGNvbXBsZXgg YW5kIHVubmF0dXJhbC4KPiAKCk9LLCBhZ3JlZWQuCgo+IFRoZSBvcHMgYWJvdmUgY291bGQgYmUg cHV0IGluIGlubGluZSB3cmFwcGVycywgYnV0IHRoZXkgb25seSBvY2N1cgo+IG9ubHkgaW4gZnVu Y3Rpb25zIGFscmVhZHkgY2FsbGVkIG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpIGFuZAo+IG1u X2l0cmVlX2ludl9lbmQoKSBhbmQgbW5faXRyZWVfaXNfaW52YWxpZGF0aW5nKCkuCj4gCj4gVGhl cmUgaXMgdGhlIG9uZSAndGFrZSB0aGUgbG9jaycgb3V0bGllciBpbgo+IF9fbW11X3JhbmdlX25v dGlmaWVyX2luc2VydCgpIHRob3VnaAo+IAo+Pj4gK3N0YXRpYyB2b2lkIG1uX2l0cmVlX2ludl9l bmQoc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tKQo+Pj4gK3sKPj4+ICsJc3RydWN0IG1t dV9yYW5nZV9ub3RpZmllciAqbXJuOwo+Pj4gKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dDsKPj4+ ICsJYm9vbCBuZWVkX3dha2UgPSBmYWxzZTsKPj4+ICsKPj4+ICsJc3Bpbl9sb2NrKCZtbW5fbW0t PmxvY2spOwo+Pj4gKwlpZiAoLS1tbW5fbW0tPmFjdGl2ZV9pbnZhbGlkYXRlX3JhbmdlcyB8fAo+ Pj4gKwkgICAgIW1uX2l0cmVlX2lzX2ludmFsaWRhdGluZyhtbW5fbW0pKSB7Cj4+PiArCQlzcGlu X3VubG9jaygmbW1uX21tLT5sb2NrKTsKPj4+ICsJCXJldHVybjsKPj4+ICsJfQo+Pj4gKwo+Pj4g KwltbW5fbW0tPmludmFsaWRhdGVfc2VxKys7Cj4+Cj4+IElzIHRoaXMgdGhlIHJpZ2h0IHBsYWNl IGZvciBhbiBhc3NlcnRpb24gdGhhdCB0aGlzIGlzIG5vdyBhbiBldmVuIHZhbHVlPwo+IAo+IFll cywgYnV0IEknbSByZWx1Y3RhbnQgdG8gYWRkIHN1Y2ggYSBydW50aW1lIGNoZWNrIG9uIHRoaXMg ZmFzdGlzaCBwYXRoLi4KPiBIb3cgYWJvdXQgYSBjb21tZW50PwoKU3VyZS4KCj4gCj4+PiArCW5l ZWRfd2FrZSA9IHRydWU7Cj4+PiArCj4+PiArCS8qCj4+PiArCSAqIFRoZSBpbnZfZW5kIGluY29y cG9yYXRlcyBhIGRlZmVycmVkIG1lY2hhbmlzbSBsaWtlCj4+PiArCSAqIHJ0bmxfbG9jaygpLiBB ZGRzIGFuZCByZW1vdmVzIGFyZSBxdWV1ZWQgdW50aWwgdGhlIGZpbmFsIGludl9lbmQKPj4KPj4g TGV0IG1lIHBvaW50IG91dCB0aGF0IHJ0bmxfbG9jaygpIGl0c2VsZiBpcyBhIG9uZS1saW5lciB0 aGF0IGNhbGxzIG11dGV4X2xvY2soKS4KPj4gQnV0IEkgc3VwcG9zZSBpZiBvbmUgc3R1ZGllcyB0 aGF0IGZpbGUgY2xvc2VseSB0aGVyZSBpcyBtb3JlLiA6KQo+IAo+IExldHMgY2hhbmdlIHRoYXQg dG8gcnRubF91bmxvY2soKSB0aGVuCgoKVGhhbmtzIDopCgoKLi4uCj4+PiArCSAqIG1ybi0+aW52 YWxpZGF0ZV9zZXEgaXMgYWx3YXlzIHNldCB0byBhbiBvZGQgdmFsdWUuIFRoaXMgZW5zdXJlcwo+ Pgo+PiBUaGlzIGNsYWltIGp1c3QgbG9va3Mgd3JvbmcgdGhlIGZpcnN0IE4gdGltZXMgb25lIHJl YWRzIHRoZSBjb2RlLCBnaXZlbiB0aGF0Cj4+IHRoZXJlIGlzIG1tdV9yYW5nZV9zZXRfc2VxKCkg dG8gc2V0IGl0IHRvIGFuIGFyYml0cmFyeSB2YWx1ZSEgIE1heWJlCj4+IHlvdSBtZWFuCj4gCj4g bW11X3JhbmdlX3NldF9zZXEoKSBpcyBOT1QgdG8gYmUgdXNlZCB0byBzZXQgdG8gYW4gYXJiaXRh cnkgdmFsdWUsIGl0Cj4gbXVzdCBvbmx5IGJlIHVzZWQgdG8gc2V0IHRvIHRoZSB2YWx1ZSBwcm92 aWRlZCBpbiB0aGUgaW52YWxpZGF0ZSgpCj4gY2FsbGJhY2sgYW5kIHRoYXQgdmFsdWUgaXMgYWx3 YXlzIG9kZC4gTGV0cyBtYWtlIHRoaXMgc3VwZXIgY2xlYXI6Cj4gCj4gCS8qCj4gCSAqIG1ybi0+ aW52YWxpZGF0ZV9zZXEgbXVzdCBhbHdheXMgYmUgc2V0IHRvIGFuIG9kZCB2YWx1ZSB2aWEKPiAJ ICogbW11X3JhbmdlX3NldF9zZXEoKSB1c2luZyB0aGUgcHJvdmlkZWQgY3VyX3NlcSBmcm9tCj4g CSAqIG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpLiBUaGlzIGVuc3VyZXMgdGhhdCBpZiBzZXEg ZG9lcyB3cmFwIHdlCj4gCSAqIHdpbGwgYWx3YXlzIGNsZWFyIHRoZSBiZWxvdyBzbGVlcCBpbiBz b21lIHJlYXNvbmFibGUgdGltZSBhcwo+IAkgKiBtbW5fbW0tPmludmFsaWRhdGVfc2VxIGlzIGV2 ZW4gaW4gdGhlIGlkbGUgc3RhdGUuCj4gCSAqLwo+IAoKT0ssIHRoYXQgaGVscHMgYSBsb3QuCgou Li4KPj4+ICsJCW1ybi0+aW52YWxpZGF0ZV9zZXEgPSBtbW5fbW0tPmludmFsaWRhdGVfc2VxIC0g MTsKPj4KPj4gT2hoaCwgY2hlY2ttYXRlLiBJIGxvc2UuIFdoeSBpcyAqc3VidHJhY3RpbmcqIHRo ZSByaWdodCB0aGluZyB0byBkbwo+PiBmb3Igc2VxIG51bWJlcnMgaGVyZT8gIEknbSBhY3V0ZWx5 IHVuaGFwcHkgdHJ5aW5nIHRvIGZpZ3VyZSB0aGlzIG91dC4KPj4gSSBzdXNwZWN0IGl0J3MgYW5v dGhlciB1bmZvcnR1bmF0ZSBzaWRlIGVmZmVjdCBvZiB0cnlpbmcgdG8gdXNlIHRoZQo+PiBsb3dl ciBiaXQgb2YgdGhlIHNlcSBudW1iZXIgKGV2ZW4vb2RkKSBmb3Igc29tZXRoaW5nIGVsc2UuCj4g Cj4gTm8sIHRoaXMgaXMgYWN0dWFsbHkgZG9uZSBmb3IgdGhlIHNlcSBudW1iZXIgaXRzZWxmLiBX ZSBuZWVkIHRvCj4gZ2VuZXJhdGUgYSBzZXEgbnVtYmVyIHRoYXQgaXMgIT0gdGhlIGN1cnJlbnQg aW52YWxpZGF0ZV9zZXEgYXMgdGhpcwo+IG5ldyBtcm4gaXMgbm90IGludmFsaWRhdGluZy4KPiAK PiBUaGUgYmVzdCBzZXEgdG8gdXNlIGlzIG9uZSB0aGF0IHRoZSBpbnZhbGlkYXRlX3NlcSB3aWxs IG5vdCByZWFjaCBmb3IKPiBhIGxvbmcgdGltZSwgaWUgJ2ludmFsaWRhdGVfc2VxICsgTUFYJyB3 aGljaCBpcyBleHByZXNzZWQgYXMgLTEKPiAKPiBUaGUgZXZlbi9vZGQgdGhpbmcganVzdCB0YWtl cyBjYXJlIG9mIGl0c2VsZiBuYXR1cmFsbHkgaGVyZSBhcwo+IGludmFsaWRhdGVfc2VxIGlzIGd1 YXJlbnRlZWQgZXZlbiBhbmQgLTEgY3JlYXRlcyBib3RoIGFuIG9kZCBtcm4gdmFsdWUKPiBhbmQg YSBnb29kIHNlcSBudW1iZXIuCj4gCj4gVGhlIGFsZ29yaXRobSB3b3VsZCBhY3R1YWxseSB3b3Jr IGNvcnJlY3RseSBpZiB0aGlzIHdhcwo+ICdtcm4tPmludmFsaWRhdGVfc2VxID0gMScsIGJ1dCBv Y2Nhc2lvbmFsbHkgdGhpbmdzIHdvdWxkIGJsb2NrIHdoZW4KPiB0aGV5IGRvbid0IG5lZWQgdG8g YmxvY2suCj4gCj4gTGV0cyBhZGQgYSBjb21tZW50Ogo+IAo+IAkJLyoKPiAJCSAqIFRoZSBzdGFy dGluZyBzZXEgZm9yIGEgbXJuIG5vdCB1bmRlciBpbnZhbGlkYXRpb24gc2hvdWxkIGJlCj4gCQkg KiBvZGQsIG5vdCBlcXVhbCB0byB0aGUgY3VycmVudCBpbnZhbGlkYXRlX3NlcSBhbmQKPiAJCSAq IGludmFsaWRhdGVfc2VxIHNob3VsZCBub3QgJ3dyYXAnIHRvIHRoZSBuZXcgc2VxIGFueSB0aW1l Cj4gCQkgKiBzb29uLgo+IAkJICovCgpWZXJ5IGhlbHBmdWwuIEhvdyBhYm91dCB0aGlzIGFkZGl0 aW9uYWwgdHdlYWs6CgovKgogICogVGhlIHN0YXJ0aW5nIHNlcSBmb3IgYSBtcm4gbm90IHVuZGVy IGludmFsaWRhdGlvbiBzaG91bGQgYmUKICAqIG9kZCwgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50 IGludmFsaWRhdGVfc2VxIGFuZAogICogaW52YWxpZGF0ZV9zZXEgc2hvdWxkIG5vdCAnd3JhcCcg dG8gdGhlIG5ldyBzZXEgYW55IHRpbWUKICAqIHNvb24uIFN1YnRyYWN0aW5nIDEgZnJvbSB0aGUg Y3VycmVudCAoZXZlbikgdmFsdWUgYWNoaWV2ZXMgdGhhdC4KICAqLwoKCj4gCj4+PiAraW50IG1t dV9yYW5nZV9ub3RpZmllcl9pbnNlcnQoc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuLAo+ Pj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLAo+ Pj4gKwkJCSAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQo+Pj4gK3sKPj4+ICsJc3RydWN0IG1t dV9ub3RpZmllcl9tbSAqbW1uX21tOwo+Pj4gKwlpbnQgcmV0Owo+Pgo+PiBIbW1tLCBJIHRoaW5r IGEgbGF0ZXIgcGF0Y2ggaW1wcm9wZXJseSBjaGFuZ2VzIHRoZSBhYm92ZSB0byAiaW50IHJldCA9 IDA7Ii4KPj4gSSdsbCBjaGVjayBvbiB0aGF0LiBJdCdzIGNvcnJlY3QgaGVyZSwgdGhvdWdoLgo+ IAo+IExvb2tzIE9LIGluIG15IHRyZWU/CgpOb3BlLCB0aGF0J3MgaG93IEkgZm91bmQgaXQuIFRo ZSB0b3Agb2YgeW91ciBtbXVfbm90aWZpZXIgYnJhbmNoIGhhcyB0aGlzOgoKaW50IF9fbW11X25v dGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSAq cmFuZ2UpCnsKICAgICAgICAgc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tID0gcmFuZ2Ut Pm1tLT5tbXVfbm90aWZpZXJfbW07CiAgICAgICAgIGludCByZXQgPSAwOwoKICAgICAgICAgaWYg KG1tbl9tbS0+aGFzX2ludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gbW5faXRyZWVf aW52YWxpZGF0ZShtbW5fbW0sIHJhbmdlKTsKICAgICAgICAgICAgICAgICBpZiAocmV0KQogICAg ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAo IWhsaXN0X2VtcHR5KCZtbW5fbW0tPmxpc3QpKQogICAgICAgICAgICAgICAgIHJldHVybiBtbl9o bGlzdF9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KG1tbl9tbSwgcmFuZ2UpOwogICAgICAgICByZXR1 cm4gMDsKfQoKCj4gCj4+PiArCW1pZ2h0X2xvY2soJm1tLT5tbWFwX3NlbSk7Cj4+PiArCj4+PiAr CW1tbl9tbSA9IHNtcF9sb2FkX2FjcXVpcmUoJm1tLT5tbXVfbm90aWZpZXJfbW0pOwo+Pgo+PiBX aGF0IGRvZXMgdGhlIGFib3ZlIHBhaXIgd2l0aD8gU2hvdWxkIGhhdmUgYSBjb21tZW50IHRoYXQg c3BlY2lmaWVzIHRoYXQuCj4gCj4gc21wX2xvYWRfYWNxdWlyZSgpIGFsd2F5cyBwYWlycyB3aXRo IHNtcF9zdG9yZV9yZWxlYXNlKCkgdG8gdGhlIHNhbWUKPiBtZW1vcnksIHRoZXJlIGlzIG9ubHkg b25lIHN0b3JlLCBpcyBhIGNvbW1lbnQgcmVhbGx5IG5lZWRlZD8KPiAKPiBCZWxvdyBhcmUgdGhl IGNvbW1lbnQgdXBkYXRlcyBJIG1hZGUsIHRoYW5rcyEKPiAKPiBKYXNvbgo+IAo+IGRpZmYgLS1n aXQgYS9pbmNsdWRlL2xpbnV4L21tdV9ub3RpZmllci5oIGIvaW5jbHVkZS9saW51eC9tbXVfbm90 aWZpZXIuaAo+IGluZGV4IDUxYjkyYmEwMTNkZGNlLi4wNjVjOTUwMDJlOTYwMiAxMDA2NDQKPiAt LS0gYS9pbmNsdWRlL2xpbnV4L21tdV9ub3RpZmllci5oCj4gKysrIGIvaW5jbHVkZS9saW51eC9t bXVfbm90aWZpZXIuaAo+IEBAIC0zMDIsMTUgKzMwMiwxNSBAQCB2b2lkIG1tdV9yYW5nZV9ub3Rp Zmllcl9yZW1vdmUoc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuKTsKPiAgIC8qKgo+ICAg ICogbW11X3JhbmdlX3NldF9zZXEgLSBTYXZlIHRoZSBpbnZhbGlkYXRpb24gc2VxdWVuY2UKPiAg ICAqIEBtcm4gLSBUaGUgbXJuIHBhc3NlZCB0byBpbnZhbGlkYXRlCj4gLSAqIEBjdXJfc2VxIC0g VGhlIGN1cl9zZXEgcGFzc2VkIHRvIGludmFsaWRhdGUKPiArICogQGN1cl9zZXEgLSBUaGUgY3Vy X3NlcSBwYXNzZWQgdG8gdGhlIGludmFsaWRhdGUoKSBjYWxsYmFjawo+ICAgICoKPiAgICAqIFRo aXMgbXVzdCBiZSBjYWxsZWQgdW5jb25kaXRpb25hbGx5IGZyb20gdGhlIGludmFsaWRhdGUgY2Fs bGJhY2sgb2YgYQo+ICAgICogc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllcl9vcHMgdW5kZXIgdGhl IHNhbWUgbG9jayB0aGF0IGlzIHVzZWQgdG8gY2FsbAo+ICAgICogbW11X3JhbmdlX3JlYWRfcmV0 cnkoKS4gSXQgdXBkYXRlcyB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciBsYXRlciB1c2UgYnkKPiAt ICogbW11X3JhbmdlX3JlYWRfcmV0cnkoKS4KPiArICogbW11X3JhbmdlX3JlYWRfcmV0cnkoKS4g VGhlIHByb3ZpZGVkIGN1cl9zZXEgd2lsbCBhbHdheXMgYmUgb2RkLgo+ICAgICoKPiAtICogSWYg dGhlIHVzZXIgZG9lcyBub3QgY2FsbCBtbXVfcmFuZ2VfcmVhZF9iZWdpbigpIG9yIG1tdV9yYW5n ZV9yZWFkX3JldHJ5KCkKPiAtICogdGhlbiB0aGlzIGNhbGwgaXMgbm90IHJlcXVpcmVkLgo+ICsg KiBJZiB0aGUgY2FsbGVyIGRvZXMgbm90IGNhbGwgbW11X3JhbmdlX3JlYWRfYmVnaW4oKSBvcgo+ ICsgKiBtbXVfcmFuZ2VfcmVhZF9yZXRyeSgpIHRoZW4gdGhpcyBjYWxsIGlzIG5vdCByZXF1aXJl ZC4KPiAgICAqLwo+ICAgc3RhdGljIGlubGluZSB2b2lkIG1tdV9yYW5nZV9zZXRfc2VxKHN0cnVj dCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiAgIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3Vy X3NlcSkKPiBAQCAtMzQ4LDggKzM0OCw5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBtbXVfcmFuZ2Vf cmVhZF9yZXRyeShzdHJ1Y3QgbW11X3JhbmdlX25vdGlmaWVyICptcm4sCj4gICAgKiBjb2xsaWRl ZCB3aXRoIHRoaXMgbG9jayBhbmQgYSBmdXR1cmUgbW11X3JhbmdlX3JlYWRfcmV0cnkoKSB3aWxs IHJldHVybgo+ICAgICogdHJ1ZS4KPiAgICAqCj4gLSAqIEZhbHNlIGlzIG5vdCByZWxpYWJsZSBh bmQgb25seSBzdWdnZXN0cyBhIGNvbGxpc2lvbiBoYXMgbm90IGhhcHBlbmVkLiBJdAo+IC0gKiBj YW4gYmUgY2FsbGVkIG1hbnkgdGltZXMgYW5kIGRvZXMgbm90IGhhdmUgdG8gaG9sZCB0aGUgdXNl ciBwcm92aWRlZCBsb2NrLgo+ICsgKiBGYWxzZSBpcyBub3QgcmVsaWFibGUgYW5kIG9ubHkgc3Vn Z2VzdHMgYSBjb2xsaXNpb24gbWF5IG5vdCBoYXZlCj4gKyAqIG9jY3VyZWQuIEl0IGNhbiBiZSBj YWxsZWQgbWFueSB0aW1lcyBhbmQgZG9lcyBub3QgaGF2ZSB0byBob2xkIHRoZSB1c2VyCj4gKyAq IHByb3ZpZGVkIGxvY2suCj4gICAgKgo+ICAgICogVGhpcyBjYWxsIGNhbiBiZSB1c2VkIGFzIHBh cnQgb2YgbG9vcHMgYW5kIG90aGVyIGV4cGVuc2l2ZSBvcGVyYXRpb25zIHRvCj4gICAgKiBleHBl ZGl0ZSBhIHJldHJ5Lgo+IGRpZmYgLS1naXQgYS9tbS9tbXVfbm90aWZpZXIuYyBiL21tL21tdV9u b3RpZmllci5jCj4gaW5kZXggMmI3NDg1OTE5ZWNmZWIuLmFmZTFlMmQ5NDE4M2Y4IDEwMDY0NAo+ IC0tLSBhL21tL21tdV9ub3RpZmllci5jCj4gKysrIGIvbW0vbW11X25vdGlmaWVyLmMKPiBAQCAt NTEsNyArNTEsOCBAQCBzdHJ1Y3QgbW11X25vdGlmaWVyX21tIHsKPiAgICAqIFRoaXMgaXMgYSBj b2xsaXNpb24tcmV0cnkgcmVhZC1zaWRlL3dyaXRlLXNpZGUgJ2xvY2snLCBhIGxvdCBsaWtlIGEK PiAgICAqIHNlcWNvdW50LCBob3dldmVyIHRoaXMgYWxsb3dzIG11bHRpcGxlIHdyaXRlLXNpZGVz IHRvIGhvbGQgaXQgYXQKPiAgICAqIG9uY2UuIENvbmNlcHR1YWxseSB0aGUgd3JpdGUgc2lkZSBp cyBwcm90ZWN0aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIFBURXMgaW4KPiAtICogdGhpcyBtbSwgc3Vj aCB0aGF0IFBURVMgY2Fubm90IGJlIHJlYWQgaW50byBTUFRFcyB3aGlsZSBhbnkgd3JpdGVyIGV4 aXN0cy4KPiArICogdGhpcyBtbSwgc3VjaCB0aGF0IFBURVMgY2Fubm90IGJlIHJlYWQgaW50byBT UFRFcyAoc2hhZG93IFBURXMpIHdoaWxlIGFueQo+ICsgKiB3cml0ZXIgZXhpc3RzLgo+ICAgICoK PiAgICAqIE5vdGUgdGhhdCB0aGUgY29yZSBtbSBjcmVhdGVzIG5lc3RlZCBpbnZhbGlkYXRlX3Jh bmdlX3N0YXJ0KCkvZW5kKCkgcmVnaW9ucwo+ICAgICogd2l0aGluIHRoZSBzYW1lIHRocmVhZCwg YW5kIHJ1bnMgaW52YWxpZGF0ZV9yYW5nZV9zdGFydCgpL2VuZCgpIGluIHBhcmFsbGVsCj4gQEAg LTY0LDEyICs2NSwxMyBAQCBzdHJ1Y3QgbW11X25vdGlmaWVyX21tIHsKPiAgICAqCj4gICAgKiBU aGUgd3JpdGUgc2lkZSBoYXMgdHdvIHN0YXRlcywgZnVsbHkgZXhjbHVkZWQ6Cj4gICAgKiAgLSBt bS0+YWN0aXZlX2ludmFsaWRhdGVfcmFuZ2VzICE9IDAKPiAtICogIC0gbW5uLT5pbnZhbGlkYXRl X3NlcSAmIDEgPT0gVHJ1ZQo+ICsgKiAgLSBtbm4tPmludmFsaWRhdGVfc2VxICYgMSA9PSBUcnVl IChvZGQpCj4gICAgKiAgLSBzb21lIHJhbmdlIG9uIHRoZSBtbV9zdHJ1Y3QgaXMgYmVpbmcgaW52 YWxpZGF0ZWQKPiAgICAqICAtIHRoZSBpdHJlZSBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UKPiAg ICAqCj4gICAgKiBBbmQgcGFydGlhbGx5IGV4Y2x1ZGVkOgo+ICAgICogIC0gbW0tPmFjdGl2ZV9p bnZhbGlkYXRlX3JhbmdlcyAhPSAwCj4gKyAqICAtIG1ubi0+aW52YWxpZGF0ZV9zZXEgJiAxID09 IEZhbHNlIChldmVuKQo+ICAgICogIC0gc29tZSByYW5nZSBvbiB0aGUgbW1fc3RydWN0IGlzIGJl aW5nIGludmFsaWRhdGVkCj4gICAgKiAgLSB0aGUgaXRyZWUgaXMgYWxsb3dlZCB0byBjaGFuZ2UK PiAgICAqCj4gQEAgLTEzMSwxMiArMTMzLDEzIEBAIHN0YXRpYyB2b2lkIG1uX2l0cmVlX2ludl9l bmQoc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tKQo+ICAgCQlyZXR1cm47Cj4gICAJfQo+ ICAgCj4gKwkvKiBNYWtlIGludmFsaWRhdGVfc2VxIGV2ZW4gKi8KPiAgIAltbW5fbW0tPmludmFs aWRhdGVfc2VxKys7Cj4gICAJbmVlZF93YWtlID0gdHJ1ZTsKPiAgIAo+ICAgCS8qCj4gICAJICog VGhlIGludl9lbmQgaW5jb3Jwb3JhdGVzIGEgZGVmZXJyZWQgbWVjaGFuaXNtIGxpa2UKPiAtCSAq IHJ0bmxfbG9jaygpLiBBZGRzIGFuZCByZW1vdmVzIGFyZSBxdWV1ZWQgdW50aWwgdGhlIGZpbmFs IGludl9lbmQKPiArCSAqIHJ0bmxfdW5sb2NrKCkuIEFkZHMgYW5kIHJlbW92ZXMgYXJlIHF1ZXVl ZCB1bnRpbCB0aGUgZmluYWwgaW52X2VuZAo+ICAgCSAqIGhhcHBlbnMgdGhlbiB0aGV5IGFyZSBw cm9ncmVzc2VkLiBUaGlzIGFycmFuZ2VtZW50IGZvciB0cmVlIHVwZGF0ZXMKPiAgIAkgKiBpcyB1 c2VkIHRvIGF2b2lkIHVzaW5nIGEgYmxvY2tpbmcgbG9jayBkdXJpbmcKPiAgIAkgKiBpbnZhbGlk YXRlX3JhbmdlX3N0YXJ0Lgo+IEBAIC0yMzAsMTAgKzIzMywxMSBAQCB1bnNpZ25lZCBsb25nIG1t dV9yYW5nZV9yZWFkX2JlZ2luKHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybikKPiAgIAlz cGluX3VubG9jaygmbW1uX21tLT5sb2NrKTsKPiAgIAo+ICAgCS8qCj4gLQkgKiBtcm4tPmludmFs aWRhdGVfc2VxIGlzIGFsd2F5cyBzZXQgdG8gYW4gb2RkIHZhbHVlLiBUaGlzIGVuc3VyZXMKPiAt CSAqIHRoYXQgaWYgc2VxIGRvZXMgd3JhcCB3ZSB3aWxsIGFsd2F5cyBjbGVhciB0aGUgYmVsb3cg c2xlZXAgaW4gc29tZQo+IC0JICogcmVhc29uYWJsZSB0aW1lIGFzIG1tbl9tbS0+aW52YWxpZGF0 ZV9zZXEgaXMgZXZlbiBpbiB0aGUgaWRsZQo+IC0JICogc3RhdGUuCj4gKwkgKiBtcm4tPmludmFs aWRhdGVfc2VxIG11c3QgYWx3YXlzIGJlIHNldCB0byBhbiBvZGQgdmFsdWUgdmlhCj4gKwkgKiBt bXVfcmFuZ2Vfc2V0X3NlcSgpIHVzaW5nIHRoZSBwcm92aWRlZCBjdXJfc2VxIGZyb20KPiArCSAq IG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpLiBUaGlzIGVuc3VyZXMgdGhhdCBpZiBzZXEgZG9l cyB3cmFwIHdlCj4gKwkgKiB3aWxsIGFsd2F5cyBjbGVhciB0aGUgYmVsb3cgc2xlZXAgaW4gc29t ZSByZWFzb25hYmxlIHRpbWUgYXMKPiArCSAqIG1tbl9tbS0+aW52YWxpZGF0ZV9zZXEgaXMgZXZl biBpbiB0aGUgaWRsZSBzdGF0ZS4KPiAgIAkgKi8KPiAgIAlsb2NrX21hcF9hY3F1aXJlKCZfX21t dV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0X21hcCk7Cj4gICAJbG9ja19tYXBfcmVs ZWFzZSgmX19tbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydF9tYXApOwo+IEBAIC04 OTIsNiArODk2LDEyIEBAIHN0YXRpYyBpbnQgX19tbXVfcmFuZ2Vfbm90aWZpZXJfaW5zZXJ0KHN0 cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiAgIAkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9 IG1tbl9tbS0+aW52YWxpZGF0ZV9zZXE7Cj4gICAJfSBlbHNlIHsKPiAgIAkJV0FSTl9PTihtbl9p dHJlZV9pc19pbnZhbGlkYXRpbmcobW1uX21tKSk7Cj4gKwkJLyoKPiArCQkgKiBUaGUgc3RhcnRp bmcgc2VxIGZvciBhIG1ybiBub3QgdW5kZXIgaW52YWxpZGF0aW9uIHNob3VsZCBiZQo+ICsJCSAq IG9kZCwgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50IGludmFsaWRhdGVfc2VxIGFuZAo+ICsJCSAq IGludmFsaWRhdGVfc2VxIHNob3VsZCBub3QgJ3dyYXAnIHRvIHRoZSBuZXcgc2VxIGFueSB0aW1l Cj4gKwkJICogc29vbi4KPiArCQkgKi8KPiAgIAkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9IG1tbl9t bS0+aW52YWxpZGF0ZV9zZXEgLSAxOwo+ICAgCQlpbnRlcnZhbF90cmVlX2luc2VydCgmbXJuLT5p bnRlcnZhbF90cmVlLCAmbW1uX21tLT5pdHJlZSk7Cj4gICAJfQo+IAoKTG9va3MgZ29vZC4gV2Un cmUganVzdCBwb2xpc2hpbmcgdXAgbWlub3IgcG9pbnRzIG5vdywgc28geW91IGNhbiBhZGQ6CgpS ZXZpZXdlZC1ieTogSm9obiBIdWJiYXJkIDxqaHViYmFyZEBudmlkaWEuY29tPgoKCgp0aGFua3Ms Ci0tIApKb2huIEh1YmJhcmQKTlZJRElBCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbA== 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=-5.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 5FA0FC5DF60 for ; Thu, 7 Nov 2019 20:56:47 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 3A9462087E for ; Thu, 7 Nov 2019 20:56:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3A9462087E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=nvidia.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A58F26E52A; Thu, 7 Nov 2019 20:56:46 +0000 (UTC) Received: from hqemgate15.nvidia.com (hqemgate15.nvidia.com [216.228.121.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7618B6E52A; Thu, 7 Nov 2019 20:56:45 +0000 (UTC) Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate15.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Thu, 07 Nov 2019 12:55:44 -0800 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Thu, 07 Nov 2019 12:56:45 -0800 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Thu, 07 Nov 2019 12:56:45 -0800 Received: from [10.2.174.146] (10.124.1.5) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Thu, 7 Nov 2019 20:56:40 +0000 Subject: Re: [PATCH v2 02/15] mm/mmu_notifier: add an interval tree notifier To: Jason Gunthorpe References: <20191028201032.6352-1-jgg@ziepe.ca> <20191028201032.6352-3-jgg@ziepe.ca> <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> <20191107200604.GB21728@mellanox.com> X-Nvconfidentiality: public From: John Hubbard Message-ID: <9dc2b3c7-f945-b645-b3a3-313a21d2fdfc@nvidia.com> Date: Thu, 7 Nov 2019 12:53:56 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20191107200604.GB21728@mellanox.com> X-Originating-IP: [10.124.1.5] X-ClientProxiedBy: HQMAIL101.nvidia.com (172.20.187.10) To HQMAIL107.nvidia.com (172.20.187.13) Content-Language: en-US X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1573160145; bh=0o7ET/y25KDp83qUXLZmAimWzQOXiF76Ve9Y+FzALFM=; h=X-PGP-Universal:Subject:To:CC:References:X-Nvconfidentiality:From: Message-ID:Date:User-Agent:MIME-Version:In-Reply-To: X-Originating-IP:X-ClientProxiedBy:Content-Type:Content-Language: Content-Transfer-Encoding; b=JYP9fwhlxIm5SsWjFushBYq1+VcYPhITepY0rqKtsp43p7cbnw2DVntkJ2D7ZXjN9 9RFMy0+hTlJ0asJ6SsFHmIq2wiyqj/mDk7puyUOaOgRHDj21gGnWZHyzEORCxkYZLy 74a5AfKJh2kMafXBVhLtO6AvoPbuLMyIZGVSYKEJggnRxhufdbR6VdL4O2pQPpa+U1 jqgmSV6LJsRB5SIp7co1IbRQP4ckPA57lwPmdlgWmNauzyrbOExEmwpyHBMSTxwN4S 7EmycUtOJ+PIgA1H5cW9YZIpCVy2Aq2XVcoPj57OTL9kVR/s89nIgeqjdpFuNKHFgt wFwSrwWLRZ3Uw== X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "nouveau@lists.freedesktop.org" , "dri-devel@lists.freedesktop.org" , Michal Hocko , "linux-mm@kvack.org" , Andrea Arcangeli , Stefano Stabellini , Oleksandr Andrushchenko , "linux-rdma@vger.kernel.org" , "amd-gfx@lists.freedesktop.org" , Christoph Hellwig , Ben Skeggs , "xen-devel@lists.xenproject.org" , Ralph Campbell , Jerome Glisse , Boris Ostrovsky , Petr Cvek , Juergen Gross , Mike Marciniszyn , Dennis Dalessandro , =?UTF-8?Q?Christian_K=c3=b6nig?= , Alex Deucher , "Felix.Kuehling@amd.com" Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191107205356.Boc7I5uTVYXfST-Ob5eeWzEZOy5iMnEIeNShp-xITCQ@z> T24gMTEvNy8xOSAxMjowNiBQTSwgSmFzb24gR3VudGhvcnBlIHdyb3RlOgouLi4KPj4KPj4gQWxz bywgaXQgaXMgYmVzdCBtb3ZlZCBkb3duIHRvIGJlIG5leHQgdG8gdGhlIG5ldyBNTlIgc3RydWN0 cywgc28gdGhhdCBhbGwgdGhlCj4+IE1OUiBzdHVmZiBpcyBpbiBvbmUgZ3JvdXAuCj4gCj4gSSBh Z3JlZSB3aXRoIEplcm9tZSwgdGhpcyBlbnVtIGlzIHBhcnQgb2YgdGhlICdzdHJ1Y3QKPiBtbXVf bm90aWZpZXJfcmFuZ2UnIChpZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGludmFsaWRhdGlvbikg YW5kIGl0Cj4gZG9lc24ndCByZWFsbHkgbWF0dGVyIHRoYXQgb25seSB0aGVzZSBuZXcgbm90aWZp ZXJzIGNhbiBiZSBjYWxsZWQgd2l0aAo+IHRoaXMgdHlwZSwgaXQgaXMgc3RpbGwgcGFydCBvZiB0 aGUgbW11X25vdGlmaWVyX3JhbmdlLgo+IAoKT0suCgo+IFRoZSBjb21tZW50IGFscmVhZHkgc2F5 cyBpdCBvbmx5IGFwcGxpZXMgdG8gdGhlIG1tdV9yYW5nZV9ub3RpZmllcgo+IHNjaGVtZS4uCj4g Cj4+PiAgICNkZWZpbmUgTU1VX05PVElGSUVSX1JBTkdFX0JMT0NLQUJMRSAoMSA8PCAwKQo+Pj4g QEAgLTIyMiw2ICsyMjgsMjYgQEAgc3RydWN0IG1tdV9ub3RpZmllciB7Cj4+PiAgIAl1bnNpZ25l ZCBpbnQgdXNlcnM7Cj4+PiAgIH07Cj4+PiAgIAo+Pgo+PiBUaGF0IHNob3VsZCBhbHNvIGJlIG1v dmVkIGRvd24sIG5leHQgdG8gdGhlIG5ldyBzdHJ1Y3RzLgo+IAo+IFdoaWNoIHRoaXM/CgpJIHdh cyByZWZlcnJpbmcgdG8gTU1VX05PVElGSUVSX1JBTkdFX0JMT0NLQUJMRSwgYWJvdmUuIFRyeWlu Zwp0byBwdXQgYWxsIHRoZSBuZXcgcmFuZ2Ugbm90aWZpZXIgc3R1ZmYgaW4gb25lIHBsYWNlLiBC dXQgbWF5YmUgbm90LAppZiB0aGVzZSBhcmUgcmVhbGx5IG5vdCBhcyBzZXBhcmF0ZSBhcyBJIHRo b3VnaHQuCgo+IAo+Pj4gKy8qKgo+Pj4gKyAqIHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXJfb3Bz Cj4+PiArICogQGludmFsaWRhdGU6IFVwb24gcmV0dXJuIHRoZSBjYWxsZXIgbXVzdCBzdG9wIHVz aW5nIGFueSBTUFRFcyB3aXRoaW4gdGhpcwo+Pj4gKyAqICAgICAgICAgICAgICByYW5nZSwgdGhp cyBmdW5jdGlvbiBjYW4gc2xlZXAuIFJldHVybiBmYWxzZSBpZiBibG9ja2luZyB3YXMKPj4+ICsg KiAgICAgICAgICAgICAgcmVxdWlyZWQgYnV0IHJhbmdlIGlzIG5vbi1ibG9ja2luZwo+Pj4gKyAq Lwo+Pgo+PiBIb3cgYWJvdXQgdGhpcyAoSSdtIG5vdCBzdXJlIEkgZnVsbHkgdW5kZXJzdGFuZCB0 aGUgcmV0dXJuIHZhbHVlLCB0aG91Z2gpOgo+Pgo+PiAvKioKPj4gICAqIHN0cnVjdCBtbXVfcmFu Z2Vfbm90aWZpZXJfb3BzCj4+ICAgKiBAaW52YWxpZGF0ZTogVXBvbiByZXR1cm4gdGhlIGNhbGxl ciBtdXN0IHN0b3AgdXNpbmcgYW55IFNQVEVzIHdpdGhpbiB0aGlzCj4+ICAgKiAJCXJhbmdlLgo+ PiAgICoKPj4gICAqIAkJVGhpcyBmdW5jdGlvbiBpcyBwZXJtaXR0ZWQgdG8gc2xlZXAuCj4+ICAg Kgo+PiAgICogICAgICAJQFJldHVybjogZmFsc2UgaWYgYmxvY2tpbmcgd2FzIHJlcXVpcmVkLCBi dXQgQHJhbmdlIGlzCj4+ICAgKgkJCW5vbi1ibG9ja2luZy4KPj4gICAqCj4+ICAgKi8KPiAKPiBJ cyB0aGlzIGtkb2MgZm9ybWF0IGZvciBmdW5jdGlvbiBwb2ludGVycz8KCmhlaCwgSSdtIHNvcnQg b2Ygd2luZ2luZyBpdCwgSSdtIG5vdCBzdXJlIGhvdyBmdW5jdGlvbiBwb2ludGVycyBhcmUgc3Vw cG9zZWQKdG8gYmUgZG9jdW1lbnRlZCBpbiBrZG9jLiBBY3R1YWxseSB0aGUgb25seSBrZXkgdGFr ZS1hd2F5IGhlcmUgaXMgdG8gd3JpdGUKCiJUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcCIKCmFzIGEg c2VwYXJhdGUgc2VudGVuY2UuLgoKLi4uCj4+IGMpIFJlbmFtZSBuZXcgb25lLiBJZGVhczoKPj4K Pj4gICAgICBzdHJ1Y3QgbW11X2ludGVydmFsX25vdGlmaWVyCj4+ICAgICAgc3RydWN0IG1tdV9y YW5nZV9pbnRlcnNlY3Rpb24KPj4gICAgICAuLi5vdGhlciBpZGVhcz8KPiAKPiBUaGlzIG9kZCBk dWFsaXR5IGhhcyBhbHJlYWR5IGNhdXNlIHNvbWUgY29uZnVzaW9uLCBidXQgbmFtZXMgaGVyZSBh cmUKPiBoYXJkLiAgbW11X2ludGVydmFsX25vdGlmaWVyIGlzIHRoZSBiZXN0IGFsdGVybmF0aXZl IEkndmUgaGVhcmQuCj4gCj4gQ2hhbmdpbmcgdGhpcyBuYW1lIGlzIGEgbG90IG9mIHdvcmsgLSBh cmUgd2UgaGFwcHkKPiAnbW11X2ludGVydmFsX25vdGlmaWVyJyBpcyB0aGUgcmlnaHQgY2hvaWNl PwoKClllcywgaXQncyBteSBmYXZvcml0ZSB0b28uIEknZCB2b3RlIGZvciBnb2luZyB3aXRoIHRo YXQuCgouLi4KPj4KPj4KPj4gT0ssIHRoaXMgZWl0aGVyIG5lZWRzIG1vcmUgZG9jdW1lbnRhdGlv biBhbmQgYXNzZXJ0aW9ucywgb3IgYSBkaWZmZXJlbnQKPj4gYXBwcm9hY2guIEJlY2F1c2UgSSBz ZWUgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBBTkQsIE9SIGFuZCBib29sZWFucwo+PiBhbGwgYmVp bmcgYXBwbGllZCB0byB0aGlzIGZpZWxkLCBhbmQgaXQncyBkYXJuIG5lYXIgaG9wZWxlc3MgdG8g ZmlndXJlCj4+IG91dCB3aGV0aGVyIG9yIG5vdCBpdCByZWFsbHkgaXMgZXZlbiBvciBvZGQgYXQg dGhlIHJpZ2h0IHRpbWVzLgo+IAo+IFRoaXMgaXMgYSBzdGFuZGFyZCBkZXNpZ24gZm9yIGEgc2Vx bG9jayBzY2hlbWUgYW5kIGZvbGxvd3MgdGhlCj4gZXhpc3RpbmcgZGVzaWduIG9mIHRoZSBsaW51 eCBzZXEgbG9jay4KPiAKPiBUaGUgbG93ZXIgYml0IGluZGljYXRlcyB0aGUgbG9jaydkIHN0YXRl IGFuZCB0aGUgdXBwZXIgYml0cyBpbmRpY2F0ZQo+IHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBsb2Nr Cj4gCj4gVGhlIG9wZXJhdGlvbnMgb24gdGhlIGxvY2sgaXRzZWxmIGFyZSB0aGVuOgo+ICAgICBz ZXEgfD0gMSAgIyBUYWtlIHRoZSBsb2NrCj4gICAgIHNlcSsrICAgICAjIFJlbGVhc2UgYW4gYWNx dWlyZWQgbG9jawo+ICAgICBzZXEgJiAxICAgIyBUcnVlIGlmIGxvY2tlZAo+IAo+IFdoaWNoIGlz IGhvdyB0aGlzIGlzIHdyaXR0ZW4KClZlcnkgbmljZSwgd291bGQgeW91IGJlIG9wZW4gdG8gcHV0 dGluZyB0aGF0IGludG8gKGFueSkgb25lIG9mIHRoZSBjb21tZW50CmhlYWRlcnM/IFRoYXQncyBh biB1bnVzdWFsbHkgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb246CgovKgogICogVGhpcyBp cyBhIHN0YW5kYXJkIGRlc2lnbiBmb3IgYSBzZXFsb2NrIHNjaGVtZSBhbmQgZm9sbG93cyB0aGUK ICAqIGV4aXN0aW5nIGRlc2lnbiBvZiB0aGUgbGludXggc2VxIGxvY2suCiAgKgogICogVGhlIGxv d2VyIGJpdCBpbmRpY2F0ZXMgdGhlIGxvY2snZCBzdGF0ZSBhbmQgdGhlIHVwcGVyIGJpdHMgaW5k aWNhdGUKICAqIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBsb2NrCiAgKgogICogVGhlIG9wZXJhdGlv bnMgb24gdGhlIGxvY2sgaXRzZWxmIGFyZSB0aGVuOgogICogICAgc2VxIHw9IDEgICMgVGFrZSB0 aGUgbG9jawogICogICAgc2VxKysgICAgICMgUmVsZWFzZSBhbiBhY3F1aXJlZCBsb2NrCiAgKiAg ICBzZXEgJiAxICAgIyBUcnVlIGlmIGxvY2tlZAogICovCgoKPiAKPj4gRGlmZmVyZW50IGFwcHJv YWNoOiB3aHkgbm90IGp1c3QgYWRkIGEgbW1uX21tLT5pc19pbnZhbGlkYXRpbmcKPj4gbWVtYmVy IHZhcmlhYmxlPyBJdCdzIG5vdCBsaWtlIHlvdSdyZSBzaG9ydCBvZiBzcGFjZSBpbiB0aGF0IHN0 cnVjdC4KPiAKPiBTcGxpdHRpbmcgaXQgbWFrZXMgYWxvdCBvZiBzdHVmZiBtb3JlIGNvbXBsZXgg YW5kIHVubmF0dXJhbC4KPiAKCk9LLCBhZ3JlZWQuCgo+IFRoZSBvcHMgYWJvdmUgY291bGQgYmUg cHV0IGluIGlubGluZSB3cmFwcGVycywgYnV0IHRoZXkgb25seSBvY2N1cgo+IG9ubHkgaW4gZnVu Y3Rpb25zIGFscmVhZHkgY2FsbGVkIG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpIGFuZAo+IG1u X2l0cmVlX2ludl9lbmQoKSBhbmQgbW5faXRyZWVfaXNfaW52YWxpZGF0aW5nKCkuCj4gCj4gVGhl cmUgaXMgdGhlIG9uZSAndGFrZSB0aGUgbG9jaycgb3V0bGllciBpbgo+IF9fbW11X3JhbmdlX25v dGlmaWVyX2luc2VydCgpIHRob3VnaAo+IAo+Pj4gK3N0YXRpYyB2b2lkIG1uX2l0cmVlX2ludl9l bmQoc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tKQo+Pj4gK3sKPj4+ICsJc3RydWN0IG1t dV9yYW5nZV9ub3RpZmllciAqbXJuOwo+Pj4gKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dDsKPj4+ ICsJYm9vbCBuZWVkX3dha2UgPSBmYWxzZTsKPj4+ICsKPj4+ICsJc3Bpbl9sb2NrKCZtbW5fbW0t PmxvY2spOwo+Pj4gKwlpZiAoLS1tbW5fbW0tPmFjdGl2ZV9pbnZhbGlkYXRlX3JhbmdlcyB8fAo+ Pj4gKwkgICAgIW1uX2l0cmVlX2lzX2ludmFsaWRhdGluZyhtbW5fbW0pKSB7Cj4+PiArCQlzcGlu X3VubG9jaygmbW1uX21tLT5sb2NrKTsKPj4+ICsJCXJldHVybjsKPj4+ICsJfQo+Pj4gKwo+Pj4g KwltbW5fbW0tPmludmFsaWRhdGVfc2VxKys7Cj4+Cj4+IElzIHRoaXMgdGhlIHJpZ2h0IHBsYWNl IGZvciBhbiBhc3NlcnRpb24gdGhhdCB0aGlzIGlzIG5vdyBhbiBldmVuIHZhbHVlPwo+IAo+IFll cywgYnV0IEknbSByZWx1Y3RhbnQgdG8gYWRkIHN1Y2ggYSBydW50aW1lIGNoZWNrIG9uIHRoaXMg ZmFzdGlzaCBwYXRoLi4KPiBIb3cgYWJvdXQgYSBjb21tZW50PwoKU3VyZS4KCj4gCj4+PiArCW5l ZWRfd2FrZSA9IHRydWU7Cj4+PiArCj4+PiArCS8qCj4+PiArCSAqIFRoZSBpbnZfZW5kIGluY29y cG9yYXRlcyBhIGRlZmVycmVkIG1lY2hhbmlzbSBsaWtlCj4+PiArCSAqIHJ0bmxfbG9jaygpLiBB ZGRzIGFuZCByZW1vdmVzIGFyZSBxdWV1ZWQgdW50aWwgdGhlIGZpbmFsIGludl9lbmQKPj4KPj4g TGV0IG1lIHBvaW50IG91dCB0aGF0IHJ0bmxfbG9jaygpIGl0c2VsZiBpcyBhIG9uZS1saW5lciB0 aGF0IGNhbGxzIG11dGV4X2xvY2soKS4KPj4gQnV0IEkgc3VwcG9zZSBpZiBvbmUgc3R1ZGllcyB0 aGF0IGZpbGUgY2xvc2VseSB0aGVyZSBpcyBtb3JlLiA6KQo+IAo+IExldHMgY2hhbmdlIHRoYXQg dG8gcnRubF91bmxvY2soKSB0aGVuCgoKVGhhbmtzIDopCgoKLi4uCj4+PiArCSAqIG1ybi0+aW52 YWxpZGF0ZV9zZXEgaXMgYWx3YXlzIHNldCB0byBhbiBvZGQgdmFsdWUuIFRoaXMgZW5zdXJlcwo+ Pgo+PiBUaGlzIGNsYWltIGp1c3QgbG9va3Mgd3JvbmcgdGhlIGZpcnN0IE4gdGltZXMgb25lIHJl YWRzIHRoZSBjb2RlLCBnaXZlbiB0aGF0Cj4+IHRoZXJlIGlzIG1tdV9yYW5nZV9zZXRfc2VxKCkg dG8gc2V0IGl0IHRvIGFuIGFyYml0cmFyeSB2YWx1ZSEgIE1heWJlCj4+IHlvdSBtZWFuCj4gCj4g bW11X3JhbmdlX3NldF9zZXEoKSBpcyBOT1QgdG8gYmUgdXNlZCB0byBzZXQgdG8gYW4gYXJiaXRh cnkgdmFsdWUsIGl0Cj4gbXVzdCBvbmx5IGJlIHVzZWQgdG8gc2V0IHRvIHRoZSB2YWx1ZSBwcm92 aWRlZCBpbiB0aGUgaW52YWxpZGF0ZSgpCj4gY2FsbGJhY2sgYW5kIHRoYXQgdmFsdWUgaXMgYWx3 YXlzIG9kZC4gTGV0cyBtYWtlIHRoaXMgc3VwZXIgY2xlYXI6Cj4gCj4gCS8qCj4gCSAqIG1ybi0+ aW52YWxpZGF0ZV9zZXEgbXVzdCBhbHdheXMgYmUgc2V0IHRvIGFuIG9kZCB2YWx1ZSB2aWEKPiAJ ICogbW11X3JhbmdlX3NldF9zZXEoKSB1c2luZyB0aGUgcHJvdmlkZWQgY3VyX3NlcSBmcm9tCj4g CSAqIG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpLiBUaGlzIGVuc3VyZXMgdGhhdCBpZiBzZXEg ZG9lcyB3cmFwIHdlCj4gCSAqIHdpbGwgYWx3YXlzIGNsZWFyIHRoZSBiZWxvdyBzbGVlcCBpbiBz b21lIHJlYXNvbmFibGUgdGltZSBhcwo+IAkgKiBtbW5fbW0tPmludmFsaWRhdGVfc2VxIGlzIGV2 ZW4gaW4gdGhlIGlkbGUgc3RhdGUuCj4gCSAqLwo+IAoKT0ssIHRoYXQgaGVscHMgYSBsb3QuCgou Li4KPj4+ICsJCW1ybi0+aW52YWxpZGF0ZV9zZXEgPSBtbW5fbW0tPmludmFsaWRhdGVfc2VxIC0g MTsKPj4KPj4gT2hoaCwgY2hlY2ttYXRlLiBJIGxvc2UuIFdoeSBpcyAqc3VidHJhY3RpbmcqIHRo ZSByaWdodCB0aGluZyB0byBkbwo+PiBmb3Igc2VxIG51bWJlcnMgaGVyZT8gIEknbSBhY3V0ZWx5 IHVuaGFwcHkgdHJ5aW5nIHRvIGZpZ3VyZSB0aGlzIG91dC4KPj4gSSBzdXNwZWN0IGl0J3MgYW5v dGhlciB1bmZvcnR1bmF0ZSBzaWRlIGVmZmVjdCBvZiB0cnlpbmcgdG8gdXNlIHRoZQo+PiBsb3dl ciBiaXQgb2YgdGhlIHNlcSBudW1iZXIgKGV2ZW4vb2RkKSBmb3Igc29tZXRoaW5nIGVsc2UuCj4g Cj4gTm8sIHRoaXMgaXMgYWN0dWFsbHkgZG9uZSBmb3IgdGhlIHNlcSBudW1iZXIgaXRzZWxmLiBX ZSBuZWVkIHRvCj4gZ2VuZXJhdGUgYSBzZXEgbnVtYmVyIHRoYXQgaXMgIT0gdGhlIGN1cnJlbnQg aW52YWxpZGF0ZV9zZXEgYXMgdGhpcwo+IG5ldyBtcm4gaXMgbm90IGludmFsaWRhdGluZy4KPiAK PiBUaGUgYmVzdCBzZXEgdG8gdXNlIGlzIG9uZSB0aGF0IHRoZSBpbnZhbGlkYXRlX3NlcSB3aWxs IG5vdCByZWFjaCBmb3IKPiBhIGxvbmcgdGltZSwgaWUgJ2ludmFsaWRhdGVfc2VxICsgTUFYJyB3 aGljaCBpcyBleHByZXNzZWQgYXMgLTEKPiAKPiBUaGUgZXZlbi9vZGQgdGhpbmcganVzdCB0YWtl cyBjYXJlIG9mIGl0c2VsZiBuYXR1cmFsbHkgaGVyZSBhcwo+IGludmFsaWRhdGVfc2VxIGlzIGd1 YXJlbnRlZWQgZXZlbiBhbmQgLTEgY3JlYXRlcyBib3RoIGFuIG9kZCBtcm4gdmFsdWUKPiBhbmQg YSBnb29kIHNlcSBudW1iZXIuCj4gCj4gVGhlIGFsZ29yaXRobSB3b3VsZCBhY3R1YWxseSB3b3Jr IGNvcnJlY3RseSBpZiB0aGlzIHdhcwo+ICdtcm4tPmludmFsaWRhdGVfc2VxID0gMScsIGJ1dCBv Y2Nhc2lvbmFsbHkgdGhpbmdzIHdvdWxkIGJsb2NrIHdoZW4KPiB0aGV5IGRvbid0IG5lZWQgdG8g YmxvY2suCj4gCj4gTGV0cyBhZGQgYSBjb21tZW50Ogo+IAo+IAkJLyoKPiAJCSAqIFRoZSBzdGFy dGluZyBzZXEgZm9yIGEgbXJuIG5vdCB1bmRlciBpbnZhbGlkYXRpb24gc2hvdWxkIGJlCj4gCQkg KiBvZGQsIG5vdCBlcXVhbCB0byB0aGUgY3VycmVudCBpbnZhbGlkYXRlX3NlcSBhbmQKPiAJCSAq IGludmFsaWRhdGVfc2VxIHNob3VsZCBub3QgJ3dyYXAnIHRvIHRoZSBuZXcgc2VxIGFueSB0aW1l Cj4gCQkgKiBzb29uLgo+IAkJICovCgpWZXJ5IGhlbHBmdWwuIEhvdyBhYm91dCB0aGlzIGFkZGl0 aW9uYWwgdHdlYWs6CgovKgogICogVGhlIHN0YXJ0aW5nIHNlcSBmb3IgYSBtcm4gbm90IHVuZGVy IGludmFsaWRhdGlvbiBzaG91bGQgYmUKICAqIG9kZCwgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50 IGludmFsaWRhdGVfc2VxIGFuZAogICogaW52YWxpZGF0ZV9zZXEgc2hvdWxkIG5vdCAnd3JhcCcg dG8gdGhlIG5ldyBzZXEgYW55IHRpbWUKICAqIHNvb24uIFN1YnRyYWN0aW5nIDEgZnJvbSB0aGUg Y3VycmVudCAoZXZlbikgdmFsdWUgYWNoaWV2ZXMgdGhhdC4KICAqLwoKCj4gCj4+PiAraW50IG1t dV9yYW5nZV9ub3RpZmllcl9pbnNlcnQoc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuLAo+ Pj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLAo+ Pj4gKwkJCSAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQo+Pj4gK3sKPj4+ICsJc3RydWN0IG1t dV9ub3RpZmllcl9tbSAqbW1uX21tOwo+Pj4gKwlpbnQgcmV0Owo+Pgo+PiBIbW1tLCBJIHRoaW5r IGEgbGF0ZXIgcGF0Y2ggaW1wcm9wZXJseSBjaGFuZ2VzIHRoZSBhYm92ZSB0byAiaW50IHJldCA9 IDA7Ii4KPj4gSSdsbCBjaGVjayBvbiB0aGF0LiBJdCdzIGNvcnJlY3QgaGVyZSwgdGhvdWdoLgo+ IAo+IExvb2tzIE9LIGluIG15IHRyZWU/CgpOb3BlLCB0aGF0J3MgaG93IEkgZm91bmQgaXQuIFRo ZSB0b3Agb2YgeW91ciBtbXVfbm90aWZpZXIgYnJhbmNoIGhhcyB0aGlzOgoKaW50IF9fbW11X25v dGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSAq cmFuZ2UpCnsKICAgICAgICAgc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tID0gcmFuZ2Ut Pm1tLT5tbXVfbm90aWZpZXJfbW07CiAgICAgICAgIGludCByZXQgPSAwOwoKICAgICAgICAgaWYg KG1tbl9tbS0+aGFzX2ludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gbW5faXRyZWVf aW52YWxpZGF0ZShtbW5fbW0sIHJhbmdlKTsKICAgICAgICAgICAgICAgICBpZiAocmV0KQogICAg ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAo IWhsaXN0X2VtcHR5KCZtbW5fbW0tPmxpc3QpKQogICAgICAgICAgICAgICAgIHJldHVybiBtbl9o bGlzdF9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KG1tbl9tbSwgcmFuZ2UpOwogICAgICAgICByZXR1 cm4gMDsKfQoKCj4gCj4+PiArCW1pZ2h0X2xvY2soJm1tLT5tbWFwX3NlbSk7Cj4+PiArCj4+PiAr CW1tbl9tbSA9IHNtcF9sb2FkX2FjcXVpcmUoJm1tLT5tbXVfbm90aWZpZXJfbW0pOwo+Pgo+PiBX aGF0IGRvZXMgdGhlIGFib3ZlIHBhaXIgd2l0aD8gU2hvdWxkIGhhdmUgYSBjb21tZW50IHRoYXQg c3BlY2lmaWVzIHRoYXQuCj4gCj4gc21wX2xvYWRfYWNxdWlyZSgpIGFsd2F5cyBwYWlycyB3aXRo IHNtcF9zdG9yZV9yZWxlYXNlKCkgdG8gdGhlIHNhbWUKPiBtZW1vcnksIHRoZXJlIGlzIG9ubHkg b25lIHN0b3JlLCBpcyBhIGNvbW1lbnQgcmVhbGx5IG5lZWRlZD8KPiAKPiBCZWxvdyBhcmUgdGhl IGNvbW1lbnQgdXBkYXRlcyBJIG1hZGUsIHRoYW5rcyEKPiAKPiBKYXNvbgo+IAo+IGRpZmYgLS1n aXQgYS9pbmNsdWRlL2xpbnV4L21tdV9ub3RpZmllci5oIGIvaW5jbHVkZS9saW51eC9tbXVfbm90 aWZpZXIuaAo+IGluZGV4IDUxYjkyYmEwMTNkZGNlLi4wNjVjOTUwMDJlOTYwMiAxMDA2NDQKPiAt LS0gYS9pbmNsdWRlL2xpbnV4L21tdV9ub3RpZmllci5oCj4gKysrIGIvaW5jbHVkZS9saW51eC9t bXVfbm90aWZpZXIuaAo+IEBAIC0zMDIsMTUgKzMwMiwxNSBAQCB2b2lkIG1tdV9yYW5nZV9ub3Rp Zmllcl9yZW1vdmUoc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuKTsKPiAgIC8qKgo+ICAg ICogbW11X3JhbmdlX3NldF9zZXEgLSBTYXZlIHRoZSBpbnZhbGlkYXRpb24gc2VxdWVuY2UKPiAg ICAqIEBtcm4gLSBUaGUgbXJuIHBhc3NlZCB0byBpbnZhbGlkYXRlCj4gLSAqIEBjdXJfc2VxIC0g VGhlIGN1cl9zZXEgcGFzc2VkIHRvIGludmFsaWRhdGUKPiArICogQGN1cl9zZXEgLSBUaGUgY3Vy X3NlcSBwYXNzZWQgdG8gdGhlIGludmFsaWRhdGUoKSBjYWxsYmFjawo+ICAgICoKPiAgICAqIFRo aXMgbXVzdCBiZSBjYWxsZWQgdW5jb25kaXRpb25hbGx5IGZyb20gdGhlIGludmFsaWRhdGUgY2Fs bGJhY2sgb2YgYQo+ICAgICogc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllcl9vcHMgdW5kZXIgdGhl IHNhbWUgbG9jayB0aGF0IGlzIHVzZWQgdG8gY2FsbAo+ICAgICogbW11X3JhbmdlX3JlYWRfcmV0 cnkoKS4gSXQgdXBkYXRlcyB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciBsYXRlciB1c2UgYnkKPiAt ICogbW11X3JhbmdlX3JlYWRfcmV0cnkoKS4KPiArICogbW11X3JhbmdlX3JlYWRfcmV0cnkoKS4g VGhlIHByb3ZpZGVkIGN1cl9zZXEgd2lsbCBhbHdheXMgYmUgb2RkLgo+ICAgICoKPiAtICogSWYg dGhlIHVzZXIgZG9lcyBub3QgY2FsbCBtbXVfcmFuZ2VfcmVhZF9iZWdpbigpIG9yIG1tdV9yYW5n ZV9yZWFkX3JldHJ5KCkKPiAtICogdGhlbiB0aGlzIGNhbGwgaXMgbm90IHJlcXVpcmVkLgo+ICsg KiBJZiB0aGUgY2FsbGVyIGRvZXMgbm90IGNhbGwgbW11X3JhbmdlX3JlYWRfYmVnaW4oKSBvcgo+ ICsgKiBtbXVfcmFuZ2VfcmVhZF9yZXRyeSgpIHRoZW4gdGhpcyBjYWxsIGlzIG5vdCByZXF1aXJl ZC4KPiAgICAqLwo+ICAgc3RhdGljIGlubGluZSB2b2lkIG1tdV9yYW5nZV9zZXRfc2VxKHN0cnVj dCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiAgIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3Vy X3NlcSkKPiBAQCAtMzQ4LDggKzM0OCw5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBtbXVfcmFuZ2Vf cmVhZF9yZXRyeShzdHJ1Y3QgbW11X3JhbmdlX25vdGlmaWVyICptcm4sCj4gICAgKiBjb2xsaWRl ZCB3aXRoIHRoaXMgbG9jayBhbmQgYSBmdXR1cmUgbW11X3JhbmdlX3JlYWRfcmV0cnkoKSB3aWxs IHJldHVybgo+ICAgICogdHJ1ZS4KPiAgICAqCj4gLSAqIEZhbHNlIGlzIG5vdCByZWxpYWJsZSBh bmQgb25seSBzdWdnZXN0cyBhIGNvbGxpc2lvbiBoYXMgbm90IGhhcHBlbmVkLiBJdAo+IC0gKiBj YW4gYmUgY2FsbGVkIG1hbnkgdGltZXMgYW5kIGRvZXMgbm90IGhhdmUgdG8gaG9sZCB0aGUgdXNl ciBwcm92aWRlZCBsb2NrLgo+ICsgKiBGYWxzZSBpcyBub3QgcmVsaWFibGUgYW5kIG9ubHkgc3Vn Z2VzdHMgYSBjb2xsaXNpb24gbWF5IG5vdCBoYXZlCj4gKyAqIG9jY3VyZWQuIEl0IGNhbiBiZSBj YWxsZWQgbWFueSB0aW1lcyBhbmQgZG9lcyBub3QgaGF2ZSB0byBob2xkIHRoZSB1c2VyCj4gKyAq IHByb3ZpZGVkIGxvY2suCj4gICAgKgo+ICAgICogVGhpcyBjYWxsIGNhbiBiZSB1c2VkIGFzIHBh cnQgb2YgbG9vcHMgYW5kIG90aGVyIGV4cGVuc2l2ZSBvcGVyYXRpb25zIHRvCj4gICAgKiBleHBl ZGl0ZSBhIHJldHJ5Lgo+IGRpZmYgLS1naXQgYS9tbS9tbXVfbm90aWZpZXIuYyBiL21tL21tdV9u b3RpZmllci5jCj4gaW5kZXggMmI3NDg1OTE5ZWNmZWIuLmFmZTFlMmQ5NDE4M2Y4IDEwMDY0NAo+ IC0tLSBhL21tL21tdV9ub3RpZmllci5jCj4gKysrIGIvbW0vbW11X25vdGlmaWVyLmMKPiBAQCAt NTEsNyArNTEsOCBAQCBzdHJ1Y3QgbW11X25vdGlmaWVyX21tIHsKPiAgICAqIFRoaXMgaXMgYSBj b2xsaXNpb24tcmV0cnkgcmVhZC1zaWRlL3dyaXRlLXNpZGUgJ2xvY2snLCBhIGxvdCBsaWtlIGEK PiAgICAqIHNlcWNvdW50LCBob3dldmVyIHRoaXMgYWxsb3dzIG11bHRpcGxlIHdyaXRlLXNpZGVz IHRvIGhvbGQgaXQgYXQKPiAgICAqIG9uY2UuIENvbmNlcHR1YWxseSB0aGUgd3JpdGUgc2lkZSBp cyBwcm90ZWN0aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIFBURXMgaW4KPiAtICogdGhpcyBtbSwgc3Vj aCB0aGF0IFBURVMgY2Fubm90IGJlIHJlYWQgaW50byBTUFRFcyB3aGlsZSBhbnkgd3JpdGVyIGV4 aXN0cy4KPiArICogdGhpcyBtbSwgc3VjaCB0aGF0IFBURVMgY2Fubm90IGJlIHJlYWQgaW50byBT UFRFcyAoc2hhZG93IFBURXMpIHdoaWxlIGFueQo+ICsgKiB3cml0ZXIgZXhpc3RzLgo+ICAgICoK PiAgICAqIE5vdGUgdGhhdCB0aGUgY29yZSBtbSBjcmVhdGVzIG5lc3RlZCBpbnZhbGlkYXRlX3Jh bmdlX3N0YXJ0KCkvZW5kKCkgcmVnaW9ucwo+ICAgICogd2l0aGluIHRoZSBzYW1lIHRocmVhZCwg YW5kIHJ1bnMgaW52YWxpZGF0ZV9yYW5nZV9zdGFydCgpL2VuZCgpIGluIHBhcmFsbGVsCj4gQEAg LTY0LDEyICs2NSwxMyBAQCBzdHJ1Y3QgbW11X25vdGlmaWVyX21tIHsKPiAgICAqCj4gICAgKiBU aGUgd3JpdGUgc2lkZSBoYXMgdHdvIHN0YXRlcywgZnVsbHkgZXhjbHVkZWQ6Cj4gICAgKiAgLSBt bS0+YWN0aXZlX2ludmFsaWRhdGVfcmFuZ2VzICE9IDAKPiAtICogIC0gbW5uLT5pbnZhbGlkYXRl X3NlcSAmIDEgPT0gVHJ1ZQo+ICsgKiAgLSBtbm4tPmludmFsaWRhdGVfc2VxICYgMSA9PSBUcnVl IChvZGQpCj4gICAgKiAgLSBzb21lIHJhbmdlIG9uIHRoZSBtbV9zdHJ1Y3QgaXMgYmVpbmcgaW52 YWxpZGF0ZWQKPiAgICAqICAtIHRoZSBpdHJlZSBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UKPiAg ICAqCj4gICAgKiBBbmQgcGFydGlhbGx5IGV4Y2x1ZGVkOgo+ICAgICogIC0gbW0tPmFjdGl2ZV9p bnZhbGlkYXRlX3JhbmdlcyAhPSAwCj4gKyAqICAtIG1ubi0+aW52YWxpZGF0ZV9zZXEgJiAxID09 IEZhbHNlIChldmVuKQo+ICAgICogIC0gc29tZSByYW5nZSBvbiB0aGUgbW1fc3RydWN0IGlzIGJl aW5nIGludmFsaWRhdGVkCj4gICAgKiAgLSB0aGUgaXRyZWUgaXMgYWxsb3dlZCB0byBjaGFuZ2UK PiAgICAqCj4gQEAgLTEzMSwxMiArMTMzLDEzIEBAIHN0YXRpYyB2b2lkIG1uX2l0cmVlX2ludl9l bmQoc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tKQo+ICAgCQlyZXR1cm47Cj4gICAJfQo+ ICAgCj4gKwkvKiBNYWtlIGludmFsaWRhdGVfc2VxIGV2ZW4gKi8KPiAgIAltbW5fbW0tPmludmFs aWRhdGVfc2VxKys7Cj4gICAJbmVlZF93YWtlID0gdHJ1ZTsKPiAgIAo+ICAgCS8qCj4gICAJICog VGhlIGludl9lbmQgaW5jb3Jwb3JhdGVzIGEgZGVmZXJyZWQgbWVjaGFuaXNtIGxpa2UKPiAtCSAq IHJ0bmxfbG9jaygpLiBBZGRzIGFuZCByZW1vdmVzIGFyZSBxdWV1ZWQgdW50aWwgdGhlIGZpbmFs IGludl9lbmQKPiArCSAqIHJ0bmxfdW5sb2NrKCkuIEFkZHMgYW5kIHJlbW92ZXMgYXJlIHF1ZXVl ZCB1bnRpbCB0aGUgZmluYWwgaW52X2VuZAo+ICAgCSAqIGhhcHBlbnMgdGhlbiB0aGV5IGFyZSBw cm9ncmVzc2VkLiBUaGlzIGFycmFuZ2VtZW50IGZvciB0cmVlIHVwZGF0ZXMKPiAgIAkgKiBpcyB1 c2VkIHRvIGF2b2lkIHVzaW5nIGEgYmxvY2tpbmcgbG9jayBkdXJpbmcKPiAgIAkgKiBpbnZhbGlk YXRlX3JhbmdlX3N0YXJ0Lgo+IEBAIC0yMzAsMTAgKzIzMywxMSBAQCB1bnNpZ25lZCBsb25nIG1t dV9yYW5nZV9yZWFkX2JlZ2luKHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybikKPiAgIAlz cGluX3VubG9jaygmbW1uX21tLT5sb2NrKTsKPiAgIAo+ICAgCS8qCj4gLQkgKiBtcm4tPmludmFs aWRhdGVfc2VxIGlzIGFsd2F5cyBzZXQgdG8gYW4gb2RkIHZhbHVlLiBUaGlzIGVuc3VyZXMKPiAt CSAqIHRoYXQgaWYgc2VxIGRvZXMgd3JhcCB3ZSB3aWxsIGFsd2F5cyBjbGVhciB0aGUgYmVsb3cg c2xlZXAgaW4gc29tZQo+IC0JICogcmVhc29uYWJsZSB0aW1lIGFzIG1tbl9tbS0+aW52YWxpZGF0 ZV9zZXEgaXMgZXZlbiBpbiB0aGUgaWRsZQo+IC0JICogc3RhdGUuCj4gKwkgKiBtcm4tPmludmFs aWRhdGVfc2VxIG11c3QgYWx3YXlzIGJlIHNldCB0byBhbiBvZGQgdmFsdWUgdmlhCj4gKwkgKiBt bXVfcmFuZ2Vfc2V0X3NlcSgpIHVzaW5nIHRoZSBwcm92aWRlZCBjdXJfc2VxIGZyb20KPiArCSAq IG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpLiBUaGlzIGVuc3VyZXMgdGhhdCBpZiBzZXEgZG9l cyB3cmFwIHdlCj4gKwkgKiB3aWxsIGFsd2F5cyBjbGVhciB0aGUgYmVsb3cgc2xlZXAgaW4gc29t ZSByZWFzb25hYmxlIHRpbWUgYXMKPiArCSAqIG1tbl9tbS0+aW52YWxpZGF0ZV9zZXEgaXMgZXZl biBpbiB0aGUgaWRsZSBzdGF0ZS4KPiAgIAkgKi8KPiAgIAlsb2NrX21hcF9hY3F1aXJlKCZfX21t dV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0X21hcCk7Cj4gICAJbG9ja19tYXBfcmVs ZWFzZSgmX19tbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydF9tYXApOwo+IEBAIC04 OTIsNiArODk2LDEyIEBAIHN0YXRpYyBpbnQgX19tbXVfcmFuZ2Vfbm90aWZpZXJfaW5zZXJ0KHN0 cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiAgIAkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9 IG1tbl9tbS0+aW52YWxpZGF0ZV9zZXE7Cj4gICAJfSBlbHNlIHsKPiAgIAkJV0FSTl9PTihtbl9p dHJlZV9pc19pbnZhbGlkYXRpbmcobW1uX21tKSk7Cj4gKwkJLyoKPiArCQkgKiBUaGUgc3RhcnRp bmcgc2VxIGZvciBhIG1ybiBub3QgdW5kZXIgaW52YWxpZGF0aW9uIHNob3VsZCBiZQo+ICsJCSAq IG9kZCwgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50IGludmFsaWRhdGVfc2VxIGFuZAo+ICsJCSAq IGludmFsaWRhdGVfc2VxIHNob3VsZCBub3QgJ3dyYXAnIHRvIHRoZSBuZXcgc2VxIGFueSB0aW1l Cj4gKwkJICogc29vbi4KPiArCQkgKi8KPiAgIAkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9IG1tbl9t bS0+aW52YWxpZGF0ZV9zZXEgLSAxOwo+ICAgCQlpbnRlcnZhbF90cmVlX2luc2VydCgmbXJuLT5p bnRlcnZhbF90cmVlLCAmbW1uX21tLT5pdHJlZSk7Cj4gICAJfQo+IAoKTG9va3MgZ29vZC4gV2Un cmUganVzdCBwb2xpc2hpbmcgdXAgbWlub3IgcG9pbnRzIG5vdywgc28geW91IGNhbiBhZGQ6CgpS ZXZpZXdlZC1ieTogSm9obiBIdWJiYXJkIDxqaHViYmFyZEBudmlkaWEuY29tPgoKCgp0aGFua3Ms Ci0tIApKb2huIEh1YmJhcmQKTlZJRElBCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbA== 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=-5.0 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 DB587C43331 for ; Thu, 7 Nov 2019 20:57:39 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (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 992AB2087E for ; Thu, 7 Nov 2019 20:57:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=nvidia.com header.i=@nvidia.com header.b="JYP9fwhl" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 992AB2087E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=nvidia.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iSoq4-00030L-SJ; Thu, 07 Nov 2019 20:57:08 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iSoq3-00030G-ES for xen-devel@lists.xenproject.org; Thu, 07 Nov 2019 20:57:07 +0000 X-Inumbo-ID: 1c113834-01a1-11ea-a1cb-12813bfff9fa Received: from hqemgate15.nvidia.com (unknown [216.228.121.64]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 1c113834-01a1-11ea-a1cb-12813bfff9fa; Thu, 07 Nov 2019 20:56:46 +0000 (UTC) Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate15.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Thu, 07 Nov 2019 12:55:44 -0800 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Thu, 07 Nov 2019 12:56:45 -0800 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Thu, 07 Nov 2019 12:56:45 -0800 Received: from [10.2.174.146] (10.124.1.5) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Thu, 7 Nov 2019 20:56:40 +0000 To: Jason Gunthorpe References: <20191028201032.6352-1-jgg@ziepe.ca> <20191028201032.6352-3-jgg@ziepe.ca> <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> <20191107200604.GB21728@mellanox.com> X-Nvconfidentiality: public From: John Hubbard Message-ID: <9dc2b3c7-f945-b645-b3a3-313a21d2fdfc@nvidia.com> Date: Thu, 7 Nov 2019 12:53:56 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20191107200604.GB21728@mellanox.com> X-Originating-IP: [10.124.1.5] X-ClientProxiedBy: HQMAIL101.nvidia.com (172.20.187.10) To HQMAIL107.nvidia.com (172.20.187.13) Content-Language: en-US DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1573160145; bh=0o7ET/y25KDp83qUXLZmAimWzQOXiF76Ve9Y+FzALFM=; h=X-PGP-Universal:Subject:To:CC:References:X-Nvconfidentiality:From: Message-ID:Date:User-Agent:MIME-Version:In-Reply-To: X-Originating-IP:X-ClientProxiedBy:Content-Type:Content-Language: Content-Transfer-Encoding; b=JYP9fwhlxIm5SsWjFushBYq1+VcYPhITepY0rqKtsp43p7cbnw2DVntkJ2D7ZXjN9 9RFMy0+hTlJ0asJ6SsFHmIq2wiyqj/mDk7puyUOaOgRHDj21gGnWZHyzEORCxkYZLy 74a5AfKJh2kMafXBVhLtO6AvoPbuLMyIZGVSYKEJggnRxhufdbR6VdL4O2pQPpa+U1 jqgmSV6LJsRB5SIp7co1IbRQP4ckPA57lwPmdlgWmNauzyrbOExEmwpyHBMSTxwN4S 7EmycUtOJ+PIgA1H5cW9YZIpCVy2Aq2XVcoPj57OTL9kVR/s89nIgeqjdpFuNKHFgt wFwSrwWLRZ3Uw== Subject: Re: [Xen-devel] [PATCH v2 02/15] mm/mmu_notifier: add an interval tree notifier X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: "nouveau@lists.freedesktop.org" , "dri-devel@lists.freedesktop.org" , Michal Hocko , "linux-mm@kvack.org" , Andrea Arcangeli , David Zhou , Stefano Stabellini , Oleksandr Andrushchenko , "linux-rdma@vger.kernel.org" , "amd-gfx@lists.freedesktop.org" , Christoph Hellwig , Ben Skeggs , "xen-devel@lists.xenproject.org" , Ralph Campbell , Jerome Glisse , Boris Ostrovsky , Petr Cvek , Juergen Gross , Mike Marciniszyn , Dennis Dalessandro , =?UTF-8?Q?Christian_K=c3=b6nig?= , Alex Deucher , "Felix.Kuehling@amd.com" Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" T24gMTEvNy8xOSAxMjowNiBQTSwgSmFzb24gR3VudGhvcnBlIHdyb3RlOgouLi4KPj4KPj4gQWxz bywgaXQgaXMgYmVzdCBtb3ZlZCBkb3duIHRvIGJlIG5leHQgdG8gdGhlIG5ldyBNTlIgc3RydWN0 cywgc28gdGhhdCBhbGwgdGhlCj4+IE1OUiBzdHVmZiBpcyBpbiBvbmUgZ3JvdXAuCj4gCj4gSSBh Z3JlZSB3aXRoIEplcm9tZSwgdGhpcyBlbnVtIGlzIHBhcnQgb2YgdGhlICdzdHJ1Y3QKPiBtbXVf bm90aWZpZXJfcmFuZ2UnIChpZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGludmFsaWRhdGlvbikg YW5kIGl0Cj4gZG9lc24ndCByZWFsbHkgbWF0dGVyIHRoYXQgb25seSB0aGVzZSBuZXcgbm90aWZp ZXJzIGNhbiBiZSBjYWxsZWQgd2l0aAo+IHRoaXMgdHlwZSwgaXQgaXMgc3RpbGwgcGFydCBvZiB0 aGUgbW11X25vdGlmaWVyX3JhbmdlLgo+IAoKT0suCgo+IFRoZSBjb21tZW50IGFscmVhZHkgc2F5 cyBpdCBvbmx5IGFwcGxpZXMgdG8gdGhlIG1tdV9yYW5nZV9ub3RpZmllcgo+IHNjaGVtZS4uCj4g Cj4+PiAgICNkZWZpbmUgTU1VX05PVElGSUVSX1JBTkdFX0JMT0NLQUJMRSAoMSA8PCAwKQo+Pj4g QEAgLTIyMiw2ICsyMjgsMjYgQEAgc3RydWN0IG1tdV9ub3RpZmllciB7Cj4+PiAgIAl1bnNpZ25l ZCBpbnQgdXNlcnM7Cj4+PiAgIH07Cj4+PiAgIAo+Pgo+PiBUaGF0IHNob3VsZCBhbHNvIGJlIG1v dmVkIGRvd24sIG5leHQgdG8gdGhlIG5ldyBzdHJ1Y3RzLgo+IAo+IFdoaWNoIHRoaXM/CgpJIHdh cyByZWZlcnJpbmcgdG8gTU1VX05PVElGSUVSX1JBTkdFX0JMT0NLQUJMRSwgYWJvdmUuIFRyeWlu Zwp0byBwdXQgYWxsIHRoZSBuZXcgcmFuZ2Ugbm90aWZpZXIgc3R1ZmYgaW4gb25lIHBsYWNlLiBC dXQgbWF5YmUgbm90LAppZiB0aGVzZSBhcmUgcmVhbGx5IG5vdCBhcyBzZXBhcmF0ZSBhcyBJIHRo b3VnaHQuCgo+IAo+Pj4gKy8qKgo+Pj4gKyAqIHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXJfb3Bz Cj4+PiArICogQGludmFsaWRhdGU6IFVwb24gcmV0dXJuIHRoZSBjYWxsZXIgbXVzdCBzdG9wIHVz aW5nIGFueSBTUFRFcyB3aXRoaW4gdGhpcwo+Pj4gKyAqICAgICAgICAgICAgICByYW5nZSwgdGhp cyBmdW5jdGlvbiBjYW4gc2xlZXAuIFJldHVybiBmYWxzZSBpZiBibG9ja2luZyB3YXMKPj4+ICsg KiAgICAgICAgICAgICAgcmVxdWlyZWQgYnV0IHJhbmdlIGlzIG5vbi1ibG9ja2luZwo+Pj4gKyAq Lwo+Pgo+PiBIb3cgYWJvdXQgdGhpcyAoSSdtIG5vdCBzdXJlIEkgZnVsbHkgdW5kZXJzdGFuZCB0 aGUgcmV0dXJuIHZhbHVlLCB0aG91Z2gpOgo+Pgo+PiAvKioKPj4gICAqIHN0cnVjdCBtbXVfcmFu Z2Vfbm90aWZpZXJfb3BzCj4+ICAgKiBAaW52YWxpZGF0ZTogVXBvbiByZXR1cm4gdGhlIGNhbGxl ciBtdXN0IHN0b3AgdXNpbmcgYW55IFNQVEVzIHdpdGhpbiB0aGlzCj4+ICAgKiAJCXJhbmdlLgo+ PiAgICoKPj4gICAqIAkJVGhpcyBmdW5jdGlvbiBpcyBwZXJtaXR0ZWQgdG8gc2xlZXAuCj4+ICAg Kgo+PiAgICogICAgICAJQFJldHVybjogZmFsc2UgaWYgYmxvY2tpbmcgd2FzIHJlcXVpcmVkLCBi dXQgQHJhbmdlIGlzCj4+ICAgKgkJCW5vbi1ibG9ja2luZy4KPj4gICAqCj4+ICAgKi8KPiAKPiBJ cyB0aGlzIGtkb2MgZm9ybWF0IGZvciBmdW5jdGlvbiBwb2ludGVycz8KCmhlaCwgSSdtIHNvcnQg b2Ygd2luZ2luZyBpdCwgSSdtIG5vdCBzdXJlIGhvdyBmdW5jdGlvbiBwb2ludGVycyBhcmUgc3Vw cG9zZWQKdG8gYmUgZG9jdW1lbnRlZCBpbiBrZG9jLiBBY3R1YWxseSB0aGUgb25seSBrZXkgdGFr ZS1hd2F5IGhlcmUgaXMgdG8gd3JpdGUKCiJUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcCIKCmFzIGEg c2VwYXJhdGUgc2VudGVuY2UuLgoKLi4uCj4+IGMpIFJlbmFtZSBuZXcgb25lLiBJZGVhczoKPj4K Pj4gICAgICBzdHJ1Y3QgbW11X2ludGVydmFsX25vdGlmaWVyCj4+ICAgICAgc3RydWN0IG1tdV9y YW5nZV9pbnRlcnNlY3Rpb24KPj4gICAgICAuLi5vdGhlciBpZGVhcz8KPiAKPiBUaGlzIG9kZCBk dWFsaXR5IGhhcyBhbHJlYWR5IGNhdXNlIHNvbWUgY29uZnVzaW9uLCBidXQgbmFtZXMgaGVyZSBh cmUKPiBoYXJkLiAgbW11X2ludGVydmFsX25vdGlmaWVyIGlzIHRoZSBiZXN0IGFsdGVybmF0aXZl IEkndmUgaGVhcmQuCj4gCj4gQ2hhbmdpbmcgdGhpcyBuYW1lIGlzIGEgbG90IG9mIHdvcmsgLSBh cmUgd2UgaGFwcHkKPiAnbW11X2ludGVydmFsX25vdGlmaWVyJyBpcyB0aGUgcmlnaHQgY2hvaWNl PwoKClllcywgaXQncyBteSBmYXZvcml0ZSB0b28uIEknZCB2b3RlIGZvciBnb2luZyB3aXRoIHRo YXQuCgouLi4KPj4KPj4KPj4gT0ssIHRoaXMgZWl0aGVyIG5lZWRzIG1vcmUgZG9jdW1lbnRhdGlv biBhbmQgYXNzZXJ0aW9ucywgb3IgYSBkaWZmZXJlbnQKPj4gYXBwcm9hY2guIEJlY2F1c2UgSSBz ZWUgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBBTkQsIE9SIGFuZCBib29sZWFucwo+PiBhbGwgYmVp bmcgYXBwbGllZCB0byB0aGlzIGZpZWxkLCBhbmQgaXQncyBkYXJuIG5lYXIgaG9wZWxlc3MgdG8g ZmlndXJlCj4+IG91dCB3aGV0aGVyIG9yIG5vdCBpdCByZWFsbHkgaXMgZXZlbiBvciBvZGQgYXQg dGhlIHJpZ2h0IHRpbWVzLgo+IAo+IFRoaXMgaXMgYSBzdGFuZGFyZCBkZXNpZ24gZm9yIGEgc2Vx bG9jayBzY2hlbWUgYW5kIGZvbGxvd3MgdGhlCj4gZXhpc3RpbmcgZGVzaWduIG9mIHRoZSBsaW51 eCBzZXEgbG9jay4KPiAKPiBUaGUgbG93ZXIgYml0IGluZGljYXRlcyB0aGUgbG9jaydkIHN0YXRl IGFuZCB0aGUgdXBwZXIgYml0cyBpbmRpY2F0ZQo+IHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBsb2Nr Cj4gCj4gVGhlIG9wZXJhdGlvbnMgb24gdGhlIGxvY2sgaXRzZWxmIGFyZSB0aGVuOgo+ICAgICBz ZXEgfD0gMSAgIyBUYWtlIHRoZSBsb2NrCj4gICAgIHNlcSsrICAgICAjIFJlbGVhc2UgYW4gYWNx dWlyZWQgbG9jawo+ICAgICBzZXEgJiAxICAgIyBUcnVlIGlmIGxvY2tlZAo+IAo+IFdoaWNoIGlz IGhvdyB0aGlzIGlzIHdyaXR0ZW4KClZlcnkgbmljZSwgd291bGQgeW91IGJlIG9wZW4gdG8gcHV0 dGluZyB0aGF0IGludG8gKGFueSkgb25lIG9mIHRoZSBjb21tZW50CmhlYWRlcnM/IFRoYXQncyBh biB1bnVzdWFsbHkgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb246CgovKgogICogVGhpcyBp cyBhIHN0YW5kYXJkIGRlc2lnbiBmb3IgYSBzZXFsb2NrIHNjaGVtZSBhbmQgZm9sbG93cyB0aGUK ICAqIGV4aXN0aW5nIGRlc2lnbiBvZiB0aGUgbGludXggc2VxIGxvY2suCiAgKgogICogVGhlIGxv d2VyIGJpdCBpbmRpY2F0ZXMgdGhlIGxvY2snZCBzdGF0ZSBhbmQgdGhlIHVwcGVyIGJpdHMgaW5k aWNhdGUKICAqIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBsb2NrCiAgKgogICogVGhlIG9wZXJhdGlv bnMgb24gdGhlIGxvY2sgaXRzZWxmIGFyZSB0aGVuOgogICogICAgc2VxIHw9IDEgICMgVGFrZSB0 aGUgbG9jawogICogICAgc2VxKysgICAgICMgUmVsZWFzZSBhbiBhY3F1aXJlZCBsb2NrCiAgKiAg ICBzZXEgJiAxICAgIyBUcnVlIGlmIGxvY2tlZAogICovCgoKPiAKPj4gRGlmZmVyZW50IGFwcHJv YWNoOiB3aHkgbm90IGp1c3QgYWRkIGEgbW1uX21tLT5pc19pbnZhbGlkYXRpbmcKPj4gbWVtYmVy IHZhcmlhYmxlPyBJdCdzIG5vdCBsaWtlIHlvdSdyZSBzaG9ydCBvZiBzcGFjZSBpbiB0aGF0IHN0 cnVjdC4KPiAKPiBTcGxpdHRpbmcgaXQgbWFrZXMgYWxvdCBvZiBzdHVmZiBtb3JlIGNvbXBsZXgg YW5kIHVubmF0dXJhbC4KPiAKCk9LLCBhZ3JlZWQuCgo+IFRoZSBvcHMgYWJvdmUgY291bGQgYmUg cHV0IGluIGlubGluZSB3cmFwcGVycywgYnV0IHRoZXkgb25seSBvY2N1cgo+IG9ubHkgaW4gZnVu Y3Rpb25zIGFscmVhZHkgY2FsbGVkIG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpIGFuZAo+IG1u X2l0cmVlX2ludl9lbmQoKSBhbmQgbW5faXRyZWVfaXNfaW52YWxpZGF0aW5nKCkuCj4gCj4gVGhl cmUgaXMgdGhlIG9uZSAndGFrZSB0aGUgbG9jaycgb3V0bGllciBpbgo+IF9fbW11X3JhbmdlX25v dGlmaWVyX2luc2VydCgpIHRob3VnaAo+IAo+Pj4gK3N0YXRpYyB2b2lkIG1uX2l0cmVlX2ludl9l bmQoc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tKQo+Pj4gK3sKPj4+ICsJc3RydWN0IG1t dV9yYW5nZV9ub3RpZmllciAqbXJuOwo+Pj4gKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dDsKPj4+ ICsJYm9vbCBuZWVkX3dha2UgPSBmYWxzZTsKPj4+ICsKPj4+ICsJc3Bpbl9sb2NrKCZtbW5fbW0t PmxvY2spOwo+Pj4gKwlpZiAoLS1tbW5fbW0tPmFjdGl2ZV9pbnZhbGlkYXRlX3JhbmdlcyB8fAo+ Pj4gKwkgICAgIW1uX2l0cmVlX2lzX2ludmFsaWRhdGluZyhtbW5fbW0pKSB7Cj4+PiArCQlzcGlu X3VubG9jaygmbW1uX21tLT5sb2NrKTsKPj4+ICsJCXJldHVybjsKPj4+ICsJfQo+Pj4gKwo+Pj4g KwltbW5fbW0tPmludmFsaWRhdGVfc2VxKys7Cj4+Cj4+IElzIHRoaXMgdGhlIHJpZ2h0IHBsYWNl IGZvciBhbiBhc3NlcnRpb24gdGhhdCB0aGlzIGlzIG5vdyBhbiBldmVuIHZhbHVlPwo+IAo+IFll cywgYnV0IEknbSByZWx1Y3RhbnQgdG8gYWRkIHN1Y2ggYSBydW50aW1lIGNoZWNrIG9uIHRoaXMg ZmFzdGlzaCBwYXRoLi4KPiBIb3cgYWJvdXQgYSBjb21tZW50PwoKU3VyZS4KCj4gCj4+PiArCW5l ZWRfd2FrZSA9IHRydWU7Cj4+PiArCj4+PiArCS8qCj4+PiArCSAqIFRoZSBpbnZfZW5kIGluY29y cG9yYXRlcyBhIGRlZmVycmVkIG1lY2hhbmlzbSBsaWtlCj4+PiArCSAqIHJ0bmxfbG9jaygpLiBB ZGRzIGFuZCByZW1vdmVzIGFyZSBxdWV1ZWQgdW50aWwgdGhlIGZpbmFsIGludl9lbmQKPj4KPj4g TGV0IG1lIHBvaW50IG91dCB0aGF0IHJ0bmxfbG9jaygpIGl0c2VsZiBpcyBhIG9uZS1saW5lciB0 aGF0IGNhbGxzIG11dGV4X2xvY2soKS4KPj4gQnV0IEkgc3VwcG9zZSBpZiBvbmUgc3R1ZGllcyB0 aGF0IGZpbGUgY2xvc2VseSB0aGVyZSBpcyBtb3JlLiA6KQo+IAo+IExldHMgY2hhbmdlIHRoYXQg dG8gcnRubF91bmxvY2soKSB0aGVuCgoKVGhhbmtzIDopCgoKLi4uCj4+PiArCSAqIG1ybi0+aW52 YWxpZGF0ZV9zZXEgaXMgYWx3YXlzIHNldCB0byBhbiBvZGQgdmFsdWUuIFRoaXMgZW5zdXJlcwo+ Pgo+PiBUaGlzIGNsYWltIGp1c3QgbG9va3Mgd3JvbmcgdGhlIGZpcnN0IE4gdGltZXMgb25lIHJl YWRzIHRoZSBjb2RlLCBnaXZlbiB0aGF0Cj4+IHRoZXJlIGlzIG1tdV9yYW5nZV9zZXRfc2VxKCkg dG8gc2V0IGl0IHRvIGFuIGFyYml0cmFyeSB2YWx1ZSEgIE1heWJlCj4+IHlvdSBtZWFuCj4gCj4g bW11X3JhbmdlX3NldF9zZXEoKSBpcyBOT1QgdG8gYmUgdXNlZCB0byBzZXQgdG8gYW4gYXJiaXRh cnkgdmFsdWUsIGl0Cj4gbXVzdCBvbmx5IGJlIHVzZWQgdG8gc2V0IHRvIHRoZSB2YWx1ZSBwcm92 aWRlZCBpbiB0aGUgaW52YWxpZGF0ZSgpCj4gY2FsbGJhY2sgYW5kIHRoYXQgdmFsdWUgaXMgYWx3 YXlzIG9kZC4gTGV0cyBtYWtlIHRoaXMgc3VwZXIgY2xlYXI6Cj4gCj4gCS8qCj4gCSAqIG1ybi0+ aW52YWxpZGF0ZV9zZXEgbXVzdCBhbHdheXMgYmUgc2V0IHRvIGFuIG9kZCB2YWx1ZSB2aWEKPiAJ ICogbW11X3JhbmdlX3NldF9zZXEoKSB1c2luZyB0aGUgcHJvdmlkZWQgY3VyX3NlcSBmcm9tCj4g CSAqIG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpLiBUaGlzIGVuc3VyZXMgdGhhdCBpZiBzZXEg ZG9lcyB3cmFwIHdlCj4gCSAqIHdpbGwgYWx3YXlzIGNsZWFyIHRoZSBiZWxvdyBzbGVlcCBpbiBz b21lIHJlYXNvbmFibGUgdGltZSBhcwo+IAkgKiBtbW5fbW0tPmludmFsaWRhdGVfc2VxIGlzIGV2 ZW4gaW4gdGhlIGlkbGUgc3RhdGUuCj4gCSAqLwo+IAoKT0ssIHRoYXQgaGVscHMgYSBsb3QuCgou Li4KPj4+ICsJCW1ybi0+aW52YWxpZGF0ZV9zZXEgPSBtbW5fbW0tPmludmFsaWRhdGVfc2VxIC0g MTsKPj4KPj4gT2hoaCwgY2hlY2ttYXRlLiBJIGxvc2UuIFdoeSBpcyAqc3VidHJhY3RpbmcqIHRo ZSByaWdodCB0aGluZyB0byBkbwo+PiBmb3Igc2VxIG51bWJlcnMgaGVyZT8gIEknbSBhY3V0ZWx5 IHVuaGFwcHkgdHJ5aW5nIHRvIGZpZ3VyZSB0aGlzIG91dC4KPj4gSSBzdXNwZWN0IGl0J3MgYW5v dGhlciB1bmZvcnR1bmF0ZSBzaWRlIGVmZmVjdCBvZiB0cnlpbmcgdG8gdXNlIHRoZQo+PiBsb3dl ciBiaXQgb2YgdGhlIHNlcSBudW1iZXIgKGV2ZW4vb2RkKSBmb3Igc29tZXRoaW5nIGVsc2UuCj4g Cj4gTm8sIHRoaXMgaXMgYWN0dWFsbHkgZG9uZSBmb3IgdGhlIHNlcSBudW1iZXIgaXRzZWxmLiBX ZSBuZWVkIHRvCj4gZ2VuZXJhdGUgYSBzZXEgbnVtYmVyIHRoYXQgaXMgIT0gdGhlIGN1cnJlbnQg aW52YWxpZGF0ZV9zZXEgYXMgdGhpcwo+IG5ldyBtcm4gaXMgbm90IGludmFsaWRhdGluZy4KPiAK PiBUaGUgYmVzdCBzZXEgdG8gdXNlIGlzIG9uZSB0aGF0IHRoZSBpbnZhbGlkYXRlX3NlcSB3aWxs IG5vdCByZWFjaCBmb3IKPiBhIGxvbmcgdGltZSwgaWUgJ2ludmFsaWRhdGVfc2VxICsgTUFYJyB3 aGljaCBpcyBleHByZXNzZWQgYXMgLTEKPiAKPiBUaGUgZXZlbi9vZGQgdGhpbmcganVzdCB0YWtl cyBjYXJlIG9mIGl0c2VsZiBuYXR1cmFsbHkgaGVyZSBhcwo+IGludmFsaWRhdGVfc2VxIGlzIGd1 YXJlbnRlZWQgZXZlbiBhbmQgLTEgY3JlYXRlcyBib3RoIGFuIG9kZCBtcm4gdmFsdWUKPiBhbmQg YSBnb29kIHNlcSBudW1iZXIuCj4gCj4gVGhlIGFsZ29yaXRobSB3b3VsZCBhY3R1YWxseSB3b3Jr IGNvcnJlY3RseSBpZiB0aGlzIHdhcwo+ICdtcm4tPmludmFsaWRhdGVfc2VxID0gMScsIGJ1dCBv Y2Nhc2lvbmFsbHkgdGhpbmdzIHdvdWxkIGJsb2NrIHdoZW4KPiB0aGV5IGRvbid0IG5lZWQgdG8g YmxvY2suCj4gCj4gTGV0cyBhZGQgYSBjb21tZW50Ogo+IAo+IAkJLyoKPiAJCSAqIFRoZSBzdGFy dGluZyBzZXEgZm9yIGEgbXJuIG5vdCB1bmRlciBpbnZhbGlkYXRpb24gc2hvdWxkIGJlCj4gCQkg KiBvZGQsIG5vdCBlcXVhbCB0byB0aGUgY3VycmVudCBpbnZhbGlkYXRlX3NlcSBhbmQKPiAJCSAq IGludmFsaWRhdGVfc2VxIHNob3VsZCBub3QgJ3dyYXAnIHRvIHRoZSBuZXcgc2VxIGFueSB0aW1l Cj4gCQkgKiBzb29uLgo+IAkJICovCgpWZXJ5IGhlbHBmdWwuIEhvdyBhYm91dCB0aGlzIGFkZGl0 aW9uYWwgdHdlYWs6CgovKgogICogVGhlIHN0YXJ0aW5nIHNlcSBmb3IgYSBtcm4gbm90IHVuZGVy IGludmFsaWRhdGlvbiBzaG91bGQgYmUKICAqIG9kZCwgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50 IGludmFsaWRhdGVfc2VxIGFuZAogICogaW52YWxpZGF0ZV9zZXEgc2hvdWxkIG5vdCAnd3JhcCcg dG8gdGhlIG5ldyBzZXEgYW55IHRpbWUKICAqIHNvb24uIFN1YnRyYWN0aW5nIDEgZnJvbSB0aGUg Y3VycmVudCAoZXZlbikgdmFsdWUgYWNoaWV2ZXMgdGhhdC4KICAqLwoKCj4gCj4+PiAraW50IG1t dV9yYW5nZV9ub3RpZmllcl9pbnNlcnQoc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuLAo+ Pj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLAo+ Pj4gKwkJCSAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQo+Pj4gK3sKPj4+ICsJc3RydWN0IG1t dV9ub3RpZmllcl9tbSAqbW1uX21tOwo+Pj4gKwlpbnQgcmV0Owo+Pgo+PiBIbW1tLCBJIHRoaW5r IGEgbGF0ZXIgcGF0Y2ggaW1wcm9wZXJseSBjaGFuZ2VzIHRoZSBhYm92ZSB0byAiaW50IHJldCA9 IDA7Ii4KPj4gSSdsbCBjaGVjayBvbiB0aGF0LiBJdCdzIGNvcnJlY3QgaGVyZSwgdGhvdWdoLgo+ IAo+IExvb2tzIE9LIGluIG15IHRyZWU/CgpOb3BlLCB0aGF0J3MgaG93IEkgZm91bmQgaXQuIFRo ZSB0b3Agb2YgeW91ciBtbXVfbm90aWZpZXIgYnJhbmNoIGhhcyB0aGlzOgoKaW50IF9fbW11X25v dGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSAq cmFuZ2UpCnsKICAgICAgICAgc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tID0gcmFuZ2Ut Pm1tLT5tbXVfbm90aWZpZXJfbW07CiAgICAgICAgIGludCByZXQgPSAwOwoKICAgICAgICAgaWYg KG1tbl9tbS0+aGFzX2ludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gbW5faXRyZWVf aW52YWxpZGF0ZShtbW5fbW0sIHJhbmdlKTsKICAgICAgICAgICAgICAgICBpZiAocmV0KQogICAg ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAo IWhsaXN0X2VtcHR5KCZtbW5fbW0tPmxpc3QpKQogICAgICAgICAgICAgICAgIHJldHVybiBtbl9o bGlzdF9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KG1tbl9tbSwgcmFuZ2UpOwogICAgICAgICByZXR1 cm4gMDsKfQoKCj4gCj4+PiArCW1pZ2h0X2xvY2soJm1tLT5tbWFwX3NlbSk7Cj4+PiArCj4+PiAr CW1tbl9tbSA9IHNtcF9sb2FkX2FjcXVpcmUoJm1tLT5tbXVfbm90aWZpZXJfbW0pOwo+Pgo+PiBX aGF0IGRvZXMgdGhlIGFib3ZlIHBhaXIgd2l0aD8gU2hvdWxkIGhhdmUgYSBjb21tZW50IHRoYXQg c3BlY2lmaWVzIHRoYXQuCj4gCj4gc21wX2xvYWRfYWNxdWlyZSgpIGFsd2F5cyBwYWlycyB3aXRo IHNtcF9zdG9yZV9yZWxlYXNlKCkgdG8gdGhlIHNhbWUKPiBtZW1vcnksIHRoZXJlIGlzIG9ubHkg b25lIHN0b3JlLCBpcyBhIGNvbW1lbnQgcmVhbGx5IG5lZWRlZD8KPiAKPiBCZWxvdyBhcmUgdGhl IGNvbW1lbnQgdXBkYXRlcyBJIG1hZGUsIHRoYW5rcyEKPiAKPiBKYXNvbgo+IAo+IGRpZmYgLS1n aXQgYS9pbmNsdWRlL2xpbnV4L21tdV9ub3RpZmllci5oIGIvaW5jbHVkZS9saW51eC9tbXVfbm90 aWZpZXIuaAo+IGluZGV4IDUxYjkyYmEwMTNkZGNlLi4wNjVjOTUwMDJlOTYwMiAxMDA2NDQKPiAt LS0gYS9pbmNsdWRlL2xpbnV4L21tdV9ub3RpZmllci5oCj4gKysrIGIvaW5jbHVkZS9saW51eC9t bXVfbm90aWZpZXIuaAo+IEBAIC0zMDIsMTUgKzMwMiwxNSBAQCB2b2lkIG1tdV9yYW5nZV9ub3Rp Zmllcl9yZW1vdmUoc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuKTsKPiAgIC8qKgo+ICAg ICogbW11X3JhbmdlX3NldF9zZXEgLSBTYXZlIHRoZSBpbnZhbGlkYXRpb24gc2VxdWVuY2UKPiAg ICAqIEBtcm4gLSBUaGUgbXJuIHBhc3NlZCB0byBpbnZhbGlkYXRlCj4gLSAqIEBjdXJfc2VxIC0g VGhlIGN1cl9zZXEgcGFzc2VkIHRvIGludmFsaWRhdGUKPiArICogQGN1cl9zZXEgLSBUaGUgY3Vy X3NlcSBwYXNzZWQgdG8gdGhlIGludmFsaWRhdGUoKSBjYWxsYmFjawo+ICAgICoKPiAgICAqIFRo aXMgbXVzdCBiZSBjYWxsZWQgdW5jb25kaXRpb25hbGx5IGZyb20gdGhlIGludmFsaWRhdGUgY2Fs bGJhY2sgb2YgYQo+ICAgICogc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllcl9vcHMgdW5kZXIgdGhl IHNhbWUgbG9jayB0aGF0IGlzIHVzZWQgdG8gY2FsbAo+ICAgICogbW11X3JhbmdlX3JlYWRfcmV0 cnkoKS4gSXQgdXBkYXRlcyB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciBsYXRlciB1c2UgYnkKPiAt ICogbW11X3JhbmdlX3JlYWRfcmV0cnkoKS4KPiArICogbW11X3JhbmdlX3JlYWRfcmV0cnkoKS4g VGhlIHByb3ZpZGVkIGN1cl9zZXEgd2lsbCBhbHdheXMgYmUgb2RkLgo+ICAgICoKPiAtICogSWYg dGhlIHVzZXIgZG9lcyBub3QgY2FsbCBtbXVfcmFuZ2VfcmVhZF9iZWdpbigpIG9yIG1tdV9yYW5n ZV9yZWFkX3JldHJ5KCkKPiAtICogdGhlbiB0aGlzIGNhbGwgaXMgbm90IHJlcXVpcmVkLgo+ICsg KiBJZiB0aGUgY2FsbGVyIGRvZXMgbm90IGNhbGwgbW11X3JhbmdlX3JlYWRfYmVnaW4oKSBvcgo+ ICsgKiBtbXVfcmFuZ2VfcmVhZF9yZXRyeSgpIHRoZW4gdGhpcyBjYWxsIGlzIG5vdCByZXF1aXJl ZC4KPiAgICAqLwo+ICAgc3RhdGljIGlubGluZSB2b2lkIG1tdV9yYW5nZV9zZXRfc2VxKHN0cnVj dCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiAgIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3Vy X3NlcSkKPiBAQCAtMzQ4LDggKzM0OCw5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBtbXVfcmFuZ2Vf cmVhZF9yZXRyeShzdHJ1Y3QgbW11X3JhbmdlX25vdGlmaWVyICptcm4sCj4gICAgKiBjb2xsaWRl ZCB3aXRoIHRoaXMgbG9jayBhbmQgYSBmdXR1cmUgbW11X3JhbmdlX3JlYWRfcmV0cnkoKSB3aWxs IHJldHVybgo+ICAgICogdHJ1ZS4KPiAgICAqCj4gLSAqIEZhbHNlIGlzIG5vdCByZWxpYWJsZSBh bmQgb25seSBzdWdnZXN0cyBhIGNvbGxpc2lvbiBoYXMgbm90IGhhcHBlbmVkLiBJdAo+IC0gKiBj YW4gYmUgY2FsbGVkIG1hbnkgdGltZXMgYW5kIGRvZXMgbm90IGhhdmUgdG8gaG9sZCB0aGUgdXNl ciBwcm92aWRlZCBsb2NrLgo+ICsgKiBGYWxzZSBpcyBub3QgcmVsaWFibGUgYW5kIG9ubHkgc3Vn Z2VzdHMgYSBjb2xsaXNpb24gbWF5IG5vdCBoYXZlCj4gKyAqIG9jY3VyZWQuIEl0IGNhbiBiZSBj YWxsZWQgbWFueSB0aW1lcyBhbmQgZG9lcyBub3QgaGF2ZSB0byBob2xkIHRoZSB1c2VyCj4gKyAq IHByb3ZpZGVkIGxvY2suCj4gICAgKgo+ICAgICogVGhpcyBjYWxsIGNhbiBiZSB1c2VkIGFzIHBh cnQgb2YgbG9vcHMgYW5kIG90aGVyIGV4cGVuc2l2ZSBvcGVyYXRpb25zIHRvCj4gICAgKiBleHBl ZGl0ZSBhIHJldHJ5Lgo+IGRpZmYgLS1naXQgYS9tbS9tbXVfbm90aWZpZXIuYyBiL21tL21tdV9u b3RpZmllci5jCj4gaW5kZXggMmI3NDg1OTE5ZWNmZWIuLmFmZTFlMmQ5NDE4M2Y4IDEwMDY0NAo+ IC0tLSBhL21tL21tdV9ub3RpZmllci5jCj4gKysrIGIvbW0vbW11X25vdGlmaWVyLmMKPiBAQCAt NTEsNyArNTEsOCBAQCBzdHJ1Y3QgbW11X25vdGlmaWVyX21tIHsKPiAgICAqIFRoaXMgaXMgYSBj b2xsaXNpb24tcmV0cnkgcmVhZC1zaWRlL3dyaXRlLXNpZGUgJ2xvY2snLCBhIGxvdCBsaWtlIGEK PiAgICAqIHNlcWNvdW50LCBob3dldmVyIHRoaXMgYWxsb3dzIG11bHRpcGxlIHdyaXRlLXNpZGVz IHRvIGhvbGQgaXQgYXQKPiAgICAqIG9uY2UuIENvbmNlcHR1YWxseSB0aGUgd3JpdGUgc2lkZSBp cyBwcm90ZWN0aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIFBURXMgaW4KPiAtICogdGhpcyBtbSwgc3Vj aCB0aGF0IFBURVMgY2Fubm90IGJlIHJlYWQgaW50byBTUFRFcyB3aGlsZSBhbnkgd3JpdGVyIGV4 aXN0cy4KPiArICogdGhpcyBtbSwgc3VjaCB0aGF0IFBURVMgY2Fubm90IGJlIHJlYWQgaW50byBT UFRFcyAoc2hhZG93IFBURXMpIHdoaWxlIGFueQo+ICsgKiB3cml0ZXIgZXhpc3RzLgo+ICAgICoK PiAgICAqIE5vdGUgdGhhdCB0aGUgY29yZSBtbSBjcmVhdGVzIG5lc3RlZCBpbnZhbGlkYXRlX3Jh bmdlX3N0YXJ0KCkvZW5kKCkgcmVnaW9ucwo+ICAgICogd2l0aGluIHRoZSBzYW1lIHRocmVhZCwg YW5kIHJ1bnMgaW52YWxpZGF0ZV9yYW5nZV9zdGFydCgpL2VuZCgpIGluIHBhcmFsbGVsCj4gQEAg LTY0LDEyICs2NSwxMyBAQCBzdHJ1Y3QgbW11X25vdGlmaWVyX21tIHsKPiAgICAqCj4gICAgKiBU aGUgd3JpdGUgc2lkZSBoYXMgdHdvIHN0YXRlcywgZnVsbHkgZXhjbHVkZWQ6Cj4gICAgKiAgLSBt bS0+YWN0aXZlX2ludmFsaWRhdGVfcmFuZ2VzICE9IDAKPiAtICogIC0gbW5uLT5pbnZhbGlkYXRl X3NlcSAmIDEgPT0gVHJ1ZQo+ICsgKiAgLSBtbm4tPmludmFsaWRhdGVfc2VxICYgMSA9PSBUcnVl IChvZGQpCj4gICAgKiAgLSBzb21lIHJhbmdlIG9uIHRoZSBtbV9zdHJ1Y3QgaXMgYmVpbmcgaW52 YWxpZGF0ZWQKPiAgICAqICAtIHRoZSBpdHJlZSBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UKPiAg ICAqCj4gICAgKiBBbmQgcGFydGlhbGx5IGV4Y2x1ZGVkOgo+ICAgICogIC0gbW0tPmFjdGl2ZV9p bnZhbGlkYXRlX3JhbmdlcyAhPSAwCj4gKyAqICAtIG1ubi0+aW52YWxpZGF0ZV9zZXEgJiAxID09 IEZhbHNlIChldmVuKQo+ICAgICogIC0gc29tZSByYW5nZSBvbiB0aGUgbW1fc3RydWN0IGlzIGJl aW5nIGludmFsaWRhdGVkCj4gICAgKiAgLSB0aGUgaXRyZWUgaXMgYWxsb3dlZCB0byBjaGFuZ2UK PiAgICAqCj4gQEAgLTEzMSwxMiArMTMzLDEzIEBAIHN0YXRpYyB2b2lkIG1uX2l0cmVlX2ludl9l bmQoc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tKQo+ICAgCQlyZXR1cm47Cj4gICAJfQo+ ICAgCj4gKwkvKiBNYWtlIGludmFsaWRhdGVfc2VxIGV2ZW4gKi8KPiAgIAltbW5fbW0tPmludmFs aWRhdGVfc2VxKys7Cj4gICAJbmVlZF93YWtlID0gdHJ1ZTsKPiAgIAo+ICAgCS8qCj4gICAJICog VGhlIGludl9lbmQgaW5jb3Jwb3JhdGVzIGEgZGVmZXJyZWQgbWVjaGFuaXNtIGxpa2UKPiAtCSAq IHJ0bmxfbG9jaygpLiBBZGRzIGFuZCByZW1vdmVzIGFyZSBxdWV1ZWQgdW50aWwgdGhlIGZpbmFs IGludl9lbmQKPiArCSAqIHJ0bmxfdW5sb2NrKCkuIEFkZHMgYW5kIHJlbW92ZXMgYXJlIHF1ZXVl ZCB1bnRpbCB0aGUgZmluYWwgaW52X2VuZAo+ICAgCSAqIGhhcHBlbnMgdGhlbiB0aGV5IGFyZSBw cm9ncmVzc2VkLiBUaGlzIGFycmFuZ2VtZW50IGZvciB0cmVlIHVwZGF0ZXMKPiAgIAkgKiBpcyB1 c2VkIHRvIGF2b2lkIHVzaW5nIGEgYmxvY2tpbmcgbG9jayBkdXJpbmcKPiAgIAkgKiBpbnZhbGlk YXRlX3JhbmdlX3N0YXJ0Lgo+IEBAIC0yMzAsMTAgKzIzMywxMSBAQCB1bnNpZ25lZCBsb25nIG1t dV9yYW5nZV9yZWFkX2JlZ2luKHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybikKPiAgIAlz cGluX3VubG9jaygmbW1uX21tLT5sb2NrKTsKPiAgIAo+ICAgCS8qCj4gLQkgKiBtcm4tPmludmFs aWRhdGVfc2VxIGlzIGFsd2F5cyBzZXQgdG8gYW4gb2RkIHZhbHVlLiBUaGlzIGVuc3VyZXMKPiAt CSAqIHRoYXQgaWYgc2VxIGRvZXMgd3JhcCB3ZSB3aWxsIGFsd2F5cyBjbGVhciB0aGUgYmVsb3cg c2xlZXAgaW4gc29tZQo+IC0JICogcmVhc29uYWJsZSB0aW1lIGFzIG1tbl9tbS0+aW52YWxpZGF0 ZV9zZXEgaXMgZXZlbiBpbiB0aGUgaWRsZQo+IC0JICogc3RhdGUuCj4gKwkgKiBtcm4tPmludmFs aWRhdGVfc2VxIG11c3QgYWx3YXlzIGJlIHNldCB0byBhbiBvZGQgdmFsdWUgdmlhCj4gKwkgKiBt bXVfcmFuZ2Vfc2V0X3NlcSgpIHVzaW5nIHRoZSBwcm92aWRlZCBjdXJfc2VxIGZyb20KPiArCSAq IG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpLiBUaGlzIGVuc3VyZXMgdGhhdCBpZiBzZXEgZG9l cyB3cmFwIHdlCj4gKwkgKiB3aWxsIGFsd2F5cyBjbGVhciB0aGUgYmVsb3cgc2xlZXAgaW4gc29t ZSByZWFzb25hYmxlIHRpbWUgYXMKPiArCSAqIG1tbl9tbS0+aW52YWxpZGF0ZV9zZXEgaXMgZXZl biBpbiB0aGUgaWRsZSBzdGF0ZS4KPiAgIAkgKi8KPiAgIAlsb2NrX21hcF9hY3F1aXJlKCZfX21t dV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0X21hcCk7Cj4gICAJbG9ja19tYXBfcmVs ZWFzZSgmX19tbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydF9tYXApOwo+IEBAIC04 OTIsNiArODk2LDEyIEBAIHN0YXRpYyBpbnQgX19tbXVfcmFuZ2Vfbm90aWZpZXJfaW5zZXJ0KHN0 cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiAgIAkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9 IG1tbl9tbS0+aW52YWxpZGF0ZV9zZXE7Cj4gICAJfSBlbHNlIHsKPiAgIAkJV0FSTl9PTihtbl9p dHJlZV9pc19pbnZhbGlkYXRpbmcobW1uX21tKSk7Cj4gKwkJLyoKPiArCQkgKiBUaGUgc3RhcnRp bmcgc2VxIGZvciBhIG1ybiBub3QgdW5kZXIgaW52YWxpZGF0aW9uIHNob3VsZCBiZQo+ICsJCSAq IG9kZCwgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50IGludmFsaWRhdGVfc2VxIGFuZAo+ICsJCSAq IGludmFsaWRhdGVfc2VxIHNob3VsZCBub3QgJ3dyYXAnIHRvIHRoZSBuZXcgc2VxIGFueSB0aW1l Cj4gKwkJICogc29vbi4KPiArCQkgKi8KPiAgIAkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9IG1tbl9t bS0+aW52YWxpZGF0ZV9zZXEgLSAxOwo+ICAgCQlpbnRlcnZhbF90cmVlX2luc2VydCgmbXJuLT5p bnRlcnZhbF90cmVlLCAmbW1uX21tLT5pdHJlZSk7Cj4gICAJfQo+IAoKTG9va3MgZ29vZC4gV2Un cmUganVzdCBwb2xpc2hpbmcgdXAgbWlub3IgcG9pbnRzIG5vdywgc28geW91IGNhbiBhZGQ6CgpS ZXZpZXdlZC1ieTogSm9obiBIdWJiYXJkIDxqaHViYmFyZEBudmlkaWEuY29tPgoKCgp0aGFua3Ms Ci0tIApKb2huIEh1YmJhcmQKTlZJRElBCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54 ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4vbGlzdGlu Zm8veGVuLWRldmVs 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=-5.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 DAE4FC5DF60 for ; Thu, 7 Nov 2019 21:04:49 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 B1E7021D79 for ; Thu, 7 Nov 2019 21:04:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B1E7021D79 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=nvidia.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=amd-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 868306F7C8; Thu, 7 Nov 2019 21:04:49 +0000 (UTC) Received: from hqemgate15.nvidia.com (hqemgate15.nvidia.com [216.228.121.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7618B6E52A; Thu, 7 Nov 2019 20:56:45 +0000 (UTC) Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate15.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Thu, 07 Nov 2019 12:55:44 -0800 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Thu, 07 Nov 2019 12:56:45 -0800 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Thu, 07 Nov 2019 12:56:45 -0800 Received: from [10.2.174.146] (10.124.1.5) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Thu, 7 Nov 2019 20:56:40 +0000 Subject: Re: [PATCH v2 02/15] mm/mmu_notifier: add an interval tree notifier To: Jason Gunthorpe References: <20191028201032.6352-1-jgg@ziepe.ca> <20191028201032.6352-3-jgg@ziepe.ca> <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> <20191107200604.GB21728@mellanox.com> X-Nvconfidentiality: public From: John Hubbard Message-ID: <9dc2b3c7-f945-b645-b3a3-313a21d2fdfc@nvidia.com> Date: Thu, 7 Nov 2019 12:53:56 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20191107200604.GB21728@mellanox.com> X-Originating-IP: [10.124.1.5] X-ClientProxiedBy: HQMAIL101.nvidia.com (172.20.187.10) To HQMAIL107.nvidia.com (172.20.187.13) Content-Language: en-US X-Mailman-Approved-At: Thu, 07 Nov 2019 21:04:48 +0000 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1573160145; bh=0o7ET/y25KDp83qUXLZmAimWzQOXiF76Ve9Y+FzALFM=; h=X-PGP-Universal:Subject:To:CC:References:X-Nvconfidentiality:From: Message-ID:Date:User-Agent:MIME-Version:In-Reply-To: X-Originating-IP:X-ClientProxiedBy:Content-Type:Content-Language: Content-Transfer-Encoding; b=JYP9fwhlxIm5SsWjFushBYq1+VcYPhITepY0rqKtsp43p7cbnw2DVntkJ2D7ZXjN9 9RFMy0+hTlJ0asJ6SsFHmIq2wiyqj/mDk7puyUOaOgRHDj21gGnWZHyzEORCxkYZLy 74a5AfKJh2kMafXBVhLtO6AvoPbuLMyIZGVSYKEJggnRxhufdbR6VdL4O2pQPpa+U1 jqgmSV6LJsRB5SIp7co1IbRQP4ckPA57lwPmdlgWmNauzyrbOExEmwpyHBMSTxwN4S 7EmycUtOJ+PIgA1H5cW9YZIpCVy2Aq2XVcoPj57OTL9kVR/s89nIgeqjdpFuNKHFgt wFwSrwWLRZ3Uw== X-BeenThere: amd-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "nouveau@lists.freedesktop.org" , "dri-devel@lists.freedesktop.org" , Michal Hocko , "linux-mm@kvack.org" , Andrea Arcangeli , David Zhou , Stefano Stabellini , Oleksandr Andrushchenko , "linux-rdma@vger.kernel.org" , "amd-gfx@lists.freedesktop.org" , Christoph Hellwig , Ben Skeggs , "xen-devel@lists.xenproject.org" , Ralph Campbell , Jerome Glisse , Boris Ostrovsky , Petr Cvek , Juergen Gross , Mike Marciniszyn , Dennis Dalessandro , =?UTF-8?Q?Christian_K=c3=b6nig?= , Alex Deucher , "Felix.Kuehling@amd.com" Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: amd-gfx-bounces@lists.freedesktop.org Sender: "amd-gfx" Message-ID: <20191107205356.MyBEuB5UkudSa-pcqCL3qpC6IUztBKk-hdBcygC1JWs@z> T24gMTEvNy8xOSAxMjowNiBQTSwgSmFzb24gR3VudGhvcnBlIHdyb3RlOgouLi4KPj4KPj4gQWxz bywgaXQgaXMgYmVzdCBtb3ZlZCBkb3duIHRvIGJlIG5leHQgdG8gdGhlIG5ldyBNTlIgc3RydWN0 cywgc28gdGhhdCBhbGwgdGhlCj4+IE1OUiBzdHVmZiBpcyBpbiBvbmUgZ3JvdXAuCj4gCj4gSSBh Z3JlZSB3aXRoIEplcm9tZSwgdGhpcyBlbnVtIGlzIHBhcnQgb2YgdGhlICdzdHJ1Y3QKPiBtbXVf bm90aWZpZXJfcmFuZ2UnIChpZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGludmFsaWRhdGlvbikg YW5kIGl0Cj4gZG9lc24ndCByZWFsbHkgbWF0dGVyIHRoYXQgb25seSB0aGVzZSBuZXcgbm90aWZp ZXJzIGNhbiBiZSBjYWxsZWQgd2l0aAo+IHRoaXMgdHlwZSwgaXQgaXMgc3RpbGwgcGFydCBvZiB0 aGUgbW11X25vdGlmaWVyX3JhbmdlLgo+IAoKT0suCgo+IFRoZSBjb21tZW50IGFscmVhZHkgc2F5 cyBpdCBvbmx5IGFwcGxpZXMgdG8gdGhlIG1tdV9yYW5nZV9ub3RpZmllcgo+IHNjaGVtZS4uCj4g Cj4+PiAgICNkZWZpbmUgTU1VX05PVElGSUVSX1JBTkdFX0JMT0NLQUJMRSAoMSA8PCAwKQo+Pj4g QEAgLTIyMiw2ICsyMjgsMjYgQEAgc3RydWN0IG1tdV9ub3RpZmllciB7Cj4+PiAgIAl1bnNpZ25l ZCBpbnQgdXNlcnM7Cj4+PiAgIH07Cj4+PiAgIAo+Pgo+PiBUaGF0IHNob3VsZCBhbHNvIGJlIG1v dmVkIGRvd24sIG5leHQgdG8gdGhlIG5ldyBzdHJ1Y3RzLgo+IAo+IFdoaWNoIHRoaXM/CgpJIHdh cyByZWZlcnJpbmcgdG8gTU1VX05PVElGSUVSX1JBTkdFX0JMT0NLQUJMRSwgYWJvdmUuIFRyeWlu Zwp0byBwdXQgYWxsIHRoZSBuZXcgcmFuZ2Ugbm90aWZpZXIgc3R1ZmYgaW4gb25lIHBsYWNlLiBC dXQgbWF5YmUgbm90LAppZiB0aGVzZSBhcmUgcmVhbGx5IG5vdCBhcyBzZXBhcmF0ZSBhcyBJIHRo b3VnaHQuCgo+IAo+Pj4gKy8qKgo+Pj4gKyAqIHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXJfb3Bz Cj4+PiArICogQGludmFsaWRhdGU6IFVwb24gcmV0dXJuIHRoZSBjYWxsZXIgbXVzdCBzdG9wIHVz aW5nIGFueSBTUFRFcyB3aXRoaW4gdGhpcwo+Pj4gKyAqICAgICAgICAgICAgICByYW5nZSwgdGhp cyBmdW5jdGlvbiBjYW4gc2xlZXAuIFJldHVybiBmYWxzZSBpZiBibG9ja2luZyB3YXMKPj4+ICsg KiAgICAgICAgICAgICAgcmVxdWlyZWQgYnV0IHJhbmdlIGlzIG5vbi1ibG9ja2luZwo+Pj4gKyAq Lwo+Pgo+PiBIb3cgYWJvdXQgdGhpcyAoSSdtIG5vdCBzdXJlIEkgZnVsbHkgdW5kZXJzdGFuZCB0 aGUgcmV0dXJuIHZhbHVlLCB0aG91Z2gpOgo+Pgo+PiAvKioKPj4gICAqIHN0cnVjdCBtbXVfcmFu Z2Vfbm90aWZpZXJfb3BzCj4+ICAgKiBAaW52YWxpZGF0ZTogVXBvbiByZXR1cm4gdGhlIGNhbGxl ciBtdXN0IHN0b3AgdXNpbmcgYW55IFNQVEVzIHdpdGhpbiB0aGlzCj4+ICAgKiAJCXJhbmdlLgo+ PiAgICoKPj4gICAqIAkJVGhpcyBmdW5jdGlvbiBpcyBwZXJtaXR0ZWQgdG8gc2xlZXAuCj4+ICAg Kgo+PiAgICogICAgICAJQFJldHVybjogZmFsc2UgaWYgYmxvY2tpbmcgd2FzIHJlcXVpcmVkLCBi dXQgQHJhbmdlIGlzCj4+ICAgKgkJCW5vbi1ibG9ja2luZy4KPj4gICAqCj4+ICAgKi8KPiAKPiBJ cyB0aGlzIGtkb2MgZm9ybWF0IGZvciBmdW5jdGlvbiBwb2ludGVycz8KCmhlaCwgSSdtIHNvcnQg b2Ygd2luZ2luZyBpdCwgSSdtIG5vdCBzdXJlIGhvdyBmdW5jdGlvbiBwb2ludGVycyBhcmUgc3Vw cG9zZWQKdG8gYmUgZG9jdW1lbnRlZCBpbiBrZG9jLiBBY3R1YWxseSB0aGUgb25seSBrZXkgdGFr ZS1hd2F5IGhlcmUgaXMgdG8gd3JpdGUKCiJUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcCIKCmFzIGEg c2VwYXJhdGUgc2VudGVuY2UuLgoKLi4uCj4+IGMpIFJlbmFtZSBuZXcgb25lLiBJZGVhczoKPj4K Pj4gICAgICBzdHJ1Y3QgbW11X2ludGVydmFsX25vdGlmaWVyCj4+ICAgICAgc3RydWN0IG1tdV9y YW5nZV9pbnRlcnNlY3Rpb24KPj4gICAgICAuLi5vdGhlciBpZGVhcz8KPiAKPiBUaGlzIG9kZCBk dWFsaXR5IGhhcyBhbHJlYWR5IGNhdXNlIHNvbWUgY29uZnVzaW9uLCBidXQgbmFtZXMgaGVyZSBh cmUKPiBoYXJkLiAgbW11X2ludGVydmFsX25vdGlmaWVyIGlzIHRoZSBiZXN0IGFsdGVybmF0aXZl IEkndmUgaGVhcmQuCj4gCj4gQ2hhbmdpbmcgdGhpcyBuYW1lIGlzIGEgbG90IG9mIHdvcmsgLSBh cmUgd2UgaGFwcHkKPiAnbW11X2ludGVydmFsX25vdGlmaWVyJyBpcyB0aGUgcmlnaHQgY2hvaWNl PwoKClllcywgaXQncyBteSBmYXZvcml0ZSB0b28uIEknZCB2b3RlIGZvciBnb2luZyB3aXRoIHRo YXQuCgouLi4KPj4KPj4KPj4gT0ssIHRoaXMgZWl0aGVyIG5lZWRzIG1vcmUgZG9jdW1lbnRhdGlv biBhbmQgYXNzZXJ0aW9ucywgb3IgYSBkaWZmZXJlbnQKPj4gYXBwcm9hY2guIEJlY2F1c2UgSSBz ZWUgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBBTkQsIE9SIGFuZCBib29sZWFucwo+PiBhbGwgYmVp bmcgYXBwbGllZCB0byB0aGlzIGZpZWxkLCBhbmQgaXQncyBkYXJuIG5lYXIgaG9wZWxlc3MgdG8g ZmlndXJlCj4+IG91dCB3aGV0aGVyIG9yIG5vdCBpdCByZWFsbHkgaXMgZXZlbiBvciBvZGQgYXQg dGhlIHJpZ2h0IHRpbWVzLgo+IAo+IFRoaXMgaXMgYSBzdGFuZGFyZCBkZXNpZ24gZm9yIGEgc2Vx bG9jayBzY2hlbWUgYW5kIGZvbGxvd3MgdGhlCj4gZXhpc3RpbmcgZGVzaWduIG9mIHRoZSBsaW51 eCBzZXEgbG9jay4KPiAKPiBUaGUgbG93ZXIgYml0IGluZGljYXRlcyB0aGUgbG9jaydkIHN0YXRl IGFuZCB0aGUgdXBwZXIgYml0cyBpbmRpY2F0ZQo+IHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBsb2Nr Cj4gCj4gVGhlIG9wZXJhdGlvbnMgb24gdGhlIGxvY2sgaXRzZWxmIGFyZSB0aGVuOgo+ICAgICBz ZXEgfD0gMSAgIyBUYWtlIHRoZSBsb2NrCj4gICAgIHNlcSsrICAgICAjIFJlbGVhc2UgYW4gYWNx dWlyZWQgbG9jawo+ICAgICBzZXEgJiAxICAgIyBUcnVlIGlmIGxvY2tlZAo+IAo+IFdoaWNoIGlz IGhvdyB0aGlzIGlzIHdyaXR0ZW4KClZlcnkgbmljZSwgd291bGQgeW91IGJlIG9wZW4gdG8gcHV0 dGluZyB0aGF0IGludG8gKGFueSkgb25lIG9mIHRoZSBjb21tZW50CmhlYWRlcnM/IFRoYXQncyBh biB1bnVzdWFsbHkgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb246CgovKgogICogVGhpcyBp cyBhIHN0YW5kYXJkIGRlc2lnbiBmb3IgYSBzZXFsb2NrIHNjaGVtZSBhbmQgZm9sbG93cyB0aGUK ICAqIGV4aXN0aW5nIGRlc2lnbiBvZiB0aGUgbGludXggc2VxIGxvY2suCiAgKgogICogVGhlIGxv d2VyIGJpdCBpbmRpY2F0ZXMgdGhlIGxvY2snZCBzdGF0ZSBhbmQgdGhlIHVwcGVyIGJpdHMgaW5k aWNhdGUKICAqIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBsb2NrCiAgKgogICogVGhlIG9wZXJhdGlv bnMgb24gdGhlIGxvY2sgaXRzZWxmIGFyZSB0aGVuOgogICogICAgc2VxIHw9IDEgICMgVGFrZSB0 aGUgbG9jawogICogICAgc2VxKysgICAgICMgUmVsZWFzZSBhbiBhY3F1aXJlZCBsb2NrCiAgKiAg ICBzZXEgJiAxICAgIyBUcnVlIGlmIGxvY2tlZAogICovCgoKPiAKPj4gRGlmZmVyZW50IGFwcHJv YWNoOiB3aHkgbm90IGp1c3QgYWRkIGEgbW1uX21tLT5pc19pbnZhbGlkYXRpbmcKPj4gbWVtYmVy IHZhcmlhYmxlPyBJdCdzIG5vdCBsaWtlIHlvdSdyZSBzaG9ydCBvZiBzcGFjZSBpbiB0aGF0IHN0 cnVjdC4KPiAKPiBTcGxpdHRpbmcgaXQgbWFrZXMgYWxvdCBvZiBzdHVmZiBtb3JlIGNvbXBsZXgg YW5kIHVubmF0dXJhbC4KPiAKCk9LLCBhZ3JlZWQuCgo+IFRoZSBvcHMgYWJvdmUgY291bGQgYmUg cHV0IGluIGlubGluZSB3cmFwcGVycywgYnV0IHRoZXkgb25seSBvY2N1cgo+IG9ubHkgaW4gZnVu Y3Rpb25zIGFscmVhZHkgY2FsbGVkIG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpIGFuZAo+IG1u X2l0cmVlX2ludl9lbmQoKSBhbmQgbW5faXRyZWVfaXNfaW52YWxpZGF0aW5nKCkuCj4gCj4gVGhl cmUgaXMgdGhlIG9uZSAndGFrZSB0aGUgbG9jaycgb3V0bGllciBpbgo+IF9fbW11X3JhbmdlX25v dGlmaWVyX2luc2VydCgpIHRob3VnaAo+IAo+Pj4gK3N0YXRpYyB2b2lkIG1uX2l0cmVlX2ludl9l bmQoc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tKQo+Pj4gK3sKPj4+ICsJc3RydWN0IG1t dV9yYW5nZV9ub3RpZmllciAqbXJuOwo+Pj4gKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dDsKPj4+ ICsJYm9vbCBuZWVkX3dha2UgPSBmYWxzZTsKPj4+ICsKPj4+ICsJc3Bpbl9sb2NrKCZtbW5fbW0t PmxvY2spOwo+Pj4gKwlpZiAoLS1tbW5fbW0tPmFjdGl2ZV9pbnZhbGlkYXRlX3JhbmdlcyB8fAo+ Pj4gKwkgICAgIW1uX2l0cmVlX2lzX2ludmFsaWRhdGluZyhtbW5fbW0pKSB7Cj4+PiArCQlzcGlu X3VubG9jaygmbW1uX21tLT5sb2NrKTsKPj4+ICsJCXJldHVybjsKPj4+ICsJfQo+Pj4gKwo+Pj4g KwltbW5fbW0tPmludmFsaWRhdGVfc2VxKys7Cj4+Cj4+IElzIHRoaXMgdGhlIHJpZ2h0IHBsYWNl IGZvciBhbiBhc3NlcnRpb24gdGhhdCB0aGlzIGlzIG5vdyBhbiBldmVuIHZhbHVlPwo+IAo+IFll cywgYnV0IEknbSByZWx1Y3RhbnQgdG8gYWRkIHN1Y2ggYSBydW50aW1lIGNoZWNrIG9uIHRoaXMg ZmFzdGlzaCBwYXRoLi4KPiBIb3cgYWJvdXQgYSBjb21tZW50PwoKU3VyZS4KCj4gCj4+PiArCW5l ZWRfd2FrZSA9IHRydWU7Cj4+PiArCj4+PiArCS8qCj4+PiArCSAqIFRoZSBpbnZfZW5kIGluY29y cG9yYXRlcyBhIGRlZmVycmVkIG1lY2hhbmlzbSBsaWtlCj4+PiArCSAqIHJ0bmxfbG9jaygpLiBB ZGRzIGFuZCByZW1vdmVzIGFyZSBxdWV1ZWQgdW50aWwgdGhlIGZpbmFsIGludl9lbmQKPj4KPj4g TGV0IG1lIHBvaW50IG91dCB0aGF0IHJ0bmxfbG9jaygpIGl0c2VsZiBpcyBhIG9uZS1saW5lciB0 aGF0IGNhbGxzIG11dGV4X2xvY2soKS4KPj4gQnV0IEkgc3VwcG9zZSBpZiBvbmUgc3R1ZGllcyB0 aGF0IGZpbGUgY2xvc2VseSB0aGVyZSBpcyBtb3JlLiA6KQo+IAo+IExldHMgY2hhbmdlIHRoYXQg dG8gcnRubF91bmxvY2soKSB0aGVuCgoKVGhhbmtzIDopCgoKLi4uCj4+PiArCSAqIG1ybi0+aW52 YWxpZGF0ZV9zZXEgaXMgYWx3YXlzIHNldCB0byBhbiBvZGQgdmFsdWUuIFRoaXMgZW5zdXJlcwo+ Pgo+PiBUaGlzIGNsYWltIGp1c3QgbG9va3Mgd3JvbmcgdGhlIGZpcnN0IE4gdGltZXMgb25lIHJl YWRzIHRoZSBjb2RlLCBnaXZlbiB0aGF0Cj4+IHRoZXJlIGlzIG1tdV9yYW5nZV9zZXRfc2VxKCkg dG8gc2V0IGl0IHRvIGFuIGFyYml0cmFyeSB2YWx1ZSEgIE1heWJlCj4+IHlvdSBtZWFuCj4gCj4g bW11X3JhbmdlX3NldF9zZXEoKSBpcyBOT1QgdG8gYmUgdXNlZCB0byBzZXQgdG8gYW4gYXJiaXRh cnkgdmFsdWUsIGl0Cj4gbXVzdCBvbmx5IGJlIHVzZWQgdG8gc2V0IHRvIHRoZSB2YWx1ZSBwcm92 aWRlZCBpbiB0aGUgaW52YWxpZGF0ZSgpCj4gY2FsbGJhY2sgYW5kIHRoYXQgdmFsdWUgaXMgYWx3 YXlzIG9kZC4gTGV0cyBtYWtlIHRoaXMgc3VwZXIgY2xlYXI6Cj4gCj4gCS8qCj4gCSAqIG1ybi0+ aW52YWxpZGF0ZV9zZXEgbXVzdCBhbHdheXMgYmUgc2V0IHRvIGFuIG9kZCB2YWx1ZSB2aWEKPiAJ ICogbW11X3JhbmdlX3NldF9zZXEoKSB1c2luZyB0aGUgcHJvdmlkZWQgY3VyX3NlcSBmcm9tCj4g CSAqIG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpLiBUaGlzIGVuc3VyZXMgdGhhdCBpZiBzZXEg ZG9lcyB3cmFwIHdlCj4gCSAqIHdpbGwgYWx3YXlzIGNsZWFyIHRoZSBiZWxvdyBzbGVlcCBpbiBz b21lIHJlYXNvbmFibGUgdGltZSBhcwo+IAkgKiBtbW5fbW0tPmludmFsaWRhdGVfc2VxIGlzIGV2 ZW4gaW4gdGhlIGlkbGUgc3RhdGUuCj4gCSAqLwo+IAoKT0ssIHRoYXQgaGVscHMgYSBsb3QuCgou Li4KPj4+ICsJCW1ybi0+aW52YWxpZGF0ZV9zZXEgPSBtbW5fbW0tPmludmFsaWRhdGVfc2VxIC0g MTsKPj4KPj4gT2hoaCwgY2hlY2ttYXRlLiBJIGxvc2UuIFdoeSBpcyAqc3VidHJhY3RpbmcqIHRo ZSByaWdodCB0aGluZyB0byBkbwo+PiBmb3Igc2VxIG51bWJlcnMgaGVyZT8gIEknbSBhY3V0ZWx5 IHVuaGFwcHkgdHJ5aW5nIHRvIGZpZ3VyZSB0aGlzIG91dC4KPj4gSSBzdXNwZWN0IGl0J3MgYW5v dGhlciB1bmZvcnR1bmF0ZSBzaWRlIGVmZmVjdCBvZiB0cnlpbmcgdG8gdXNlIHRoZQo+PiBsb3dl ciBiaXQgb2YgdGhlIHNlcSBudW1iZXIgKGV2ZW4vb2RkKSBmb3Igc29tZXRoaW5nIGVsc2UuCj4g Cj4gTm8sIHRoaXMgaXMgYWN0dWFsbHkgZG9uZSBmb3IgdGhlIHNlcSBudW1iZXIgaXRzZWxmLiBX ZSBuZWVkIHRvCj4gZ2VuZXJhdGUgYSBzZXEgbnVtYmVyIHRoYXQgaXMgIT0gdGhlIGN1cnJlbnQg aW52YWxpZGF0ZV9zZXEgYXMgdGhpcwo+IG5ldyBtcm4gaXMgbm90IGludmFsaWRhdGluZy4KPiAK PiBUaGUgYmVzdCBzZXEgdG8gdXNlIGlzIG9uZSB0aGF0IHRoZSBpbnZhbGlkYXRlX3NlcSB3aWxs IG5vdCByZWFjaCBmb3IKPiBhIGxvbmcgdGltZSwgaWUgJ2ludmFsaWRhdGVfc2VxICsgTUFYJyB3 aGljaCBpcyBleHByZXNzZWQgYXMgLTEKPiAKPiBUaGUgZXZlbi9vZGQgdGhpbmcganVzdCB0YWtl cyBjYXJlIG9mIGl0c2VsZiBuYXR1cmFsbHkgaGVyZSBhcwo+IGludmFsaWRhdGVfc2VxIGlzIGd1 YXJlbnRlZWQgZXZlbiBhbmQgLTEgY3JlYXRlcyBib3RoIGFuIG9kZCBtcm4gdmFsdWUKPiBhbmQg YSBnb29kIHNlcSBudW1iZXIuCj4gCj4gVGhlIGFsZ29yaXRobSB3b3VsZCBhY3R1YWxseSB3b3Jr IGNvcnJlY3RseSBpZiB0aGlzIHdhcwo+ICdtcm4tPmludmFsaWRhdGVfc2VxID0gMScsIGJ1dCBv Y2Nhc2lvbmFsbHkgdGhpbmdzIHdvdWxkIGJsb2NrIHdoZW4KPiB0aGV5IGRvbid0IG5lZWQgdG8g YmxvY2suCj4gCj4gTGV0cyBhZGQgYSBjb21tZW50Ogo+IAo+IAkJLyoKPiAJCSAqIFRoZSBzdGFy dGluZyBzZXEgZm9yIGEgbXJuIG5vdCB1bmRlciBpbnZhbGlkYXRpb24gc2hvdWxkIGJlCj4gCQkg KiBvZGQsIG5vdCBlcXVhbCB0byB0aGUgY3VycmVudCBpbnZhbGlkYXRlX3NlcSBhbmQKPiAJCSAq IGludmFsaWRhdGVfc2VxIHNob3VsZCBub3QgJ3dyYXAnIHRvIHRoZSBuZXcgc2VxIGFueSB0aW1l Cj4gCQkgKiBzb29uLgo+IAkJICovCgpWZXJ5IGhlbHBmdWwuIEhvdyBhYm91dCB0aGlzIGFkZGl0 aW9uYWwgdHdlYWs6CgovKgogICogVGhlIHN0YXJ0aW5nIHNlcSBmb3IgYSBtcm4gbm90IHVuZGVy IGludmFsaWRhdGlvbiBzaG91bGQgYmUKICAqIG9kZCwgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50 IGludmFsaWRhdGVfc2VxIGFuZAogICogaW52YWxpZGF0ZV9zZXEgc2hvdWxkIG5vdCAnd3JhcCcg dG8gdGhlIG5ldyBzZXEgYW55IHRpbWUKICAqIHNvb24uIFN1YnRyYWN0aW5nIDEgZnJvbSB0aGUg Y3VycmVudCAoZXZlbikgdmFsdWUgYWNoaWV2ZXMgdGhhdC4KICAqLwoKCj4gCj4+PiAraW50IG1t dV9yYW5nZV9ub3RpZmllcl9pbnNlcnQoc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuLAo+ Pj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLAo+ Pj4gKwkJCSAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQo+Pj4gK3sKPj4+ICsJc3RydWN0IG1t dV9ub3RpZmllcl9tbSAqbW1uX21tOwo+Pj4gKwlpbnQgcmV0Owo+Pgo+PiBIbW1tLCBJIHRoaW5r IGEgbGF0ZXIgcGF0Y2ggaW1wcm9wZXJseSBjaGFuZ2VzIHRoZSBhYm92ZSB0byAiaW50IHJldCA9 IDA7Ii4KPj4gSSdsbCBjaGVjayBvbiB0aGF0LiBJdCdzIGNvcnJlY3QgaGVyZSwgdGhvdWdoLgo+ IAo+IExvb2tzIE9LIGluIG15IHRyZWU/CgpOb3BlLCB0aGF0J3MgaG93IEkgZm91bmQgaXQuIFRo ZSB0b3Agb2YgeW91ciBtbXVfbm90aWZpZXIgYnJhbmNoIGhhcyB0aGlzOgoKaW50IF9fbW11X25v dGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSAq cmFuZ2UpCnsKICAgICAgICAgc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tID0gcmFuZ2Ut Pm1tLT5tbXVfbm90aWZpZXJfbW07CiAgICAgICAgIGludCByZXQgPSAwOwoKICAgICAgICAgaWYg KG1tbl9tbS0+aGFzX2ludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gbW5faXRyZWVf aW52YWxpZGF0ZShtbW5fbW0sIHJhbmdlKTsKICAgICAgICAgICAgICAgICBpZiAocmV0KQogICAg ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAo IWhsaXN0X2VtcHR5KCZtbW5fbW0tPmxpc3QpKQogICAgICAgICAgICAgICAgIHJldHVybiBtbl9o bGlzdF9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KG1tbl9tbSwgcmFuZ2UpOwogICAgICAgICByZXR1 cm4gMDsKfQoKCj4gCj4+PiArCW1pZ2h0X2xvY2soJm1tLT5tbWFwX3NlbSk7Cj4+PiArCj4+PiAr CW1tbl9tbSA9IHNtcF9sb2FkX2FjcXVpcmUoJm1tLT5tbXVfbm90aWZpZXJfbW0pOwo+Pgo+PiBX aGF0IGRvZXMgdGhlIGFib3ZlIHBhaXIgd2l0aD8gU2hvdWxkIGhhdmUgYSBjb21tZW50IHRoYXQg c3BlY2lmaWVzIHRoYXQuCj4gCj4gc21wX2xvYWRfYWNxdWlyZSgpIGFsd2F5cyBwYWlycyB3aXRo IHNtcF9zdG9yZV9yZWxlYXNlKCkgdG8gdGhlIHNhbWUKPiBtZW1vcnksIHRoZXJlIGlzIG9ubHkg b25lIHN0b3JlLCBpcyBhIGNvbW1lbnQgcmVhbGx5IG5lZWRlZD8KPiAKPiBCZWxvdyBhcmUgdGhl IGNvbW1lbnQgdXBkYXRlcyBJIG1hZGUsIHRoYW5rcyEKPiAKPiBKYXNvbgo+IAo+IGRpZmYgLS1n aXQgYS9pbmNsdWRlL2xpbnV4L21tdV9ub3RpZmllci5oIGIvaW5jbHVkZS9saW51eC9tbXVfbm90 aWZpZXIuaAo+IGluZGV4IDUxYjkyYmEwMTNkZGNlLi4wNjVjOTUwMDJlOTYwMiAxMDA2NDQKPiAt LS0gYS9pbmNsdWRlL2xpbnV4L21tdV9ub3RpZmllci5oCj4gKysrIGIvaW5jbHVkZS9saW51eC9t bXVfbm90aWZpZXIuaAo+IEBAIC0zMDIsMTUgKzMwMiwxNSBAQCB2b2lkIG1tdV9yYW5nZV9ub3Rp Zmllcl9yZW1vdmUoc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuKTsKPiAgIC8qKgo+ICAg ICogbW11X3JhbmdlX3NldF9zZXEgLSBTYXZlIHRoZSBpbnZhbGlkYXRpb24gc2VxdWVuY2UKPiAg ICAqIEBtcm4gLSBUaGUgbXJuIHBhc3NlZCB0byBpbnZhbGlkYXRlCj4gLSAqIEBjdXJfc2VxIC0g VGhlIGN1cl9zZXEgcGFzc2VkIHRvIGludmFsaWRhdGUKPiArICogQGN1cl9zZXEgLSBUaGUgY3Vy X3NlcSBwYXNzZWQgdG8gdGhlIGludmFsaWRhdGUoKSBjYWxsYmFjawo+ICAgICoKPiAgICAqIFRo aXMgbXVzdCBiZSBjYWxsZWQgdW5jb25kaXRpb25hbGx5IGZyb20gdGhlIGludmFsaWRhdGUgY2Fs bGJhY2sgb2YgYQo+ICAgICogc3RydWN0IG1tdV9yYW5nZV9ub3RpZmllcl9vcHMgdW5kZXIgdGhl IHNhbWUgbG9jayB0aGF0IGlzIHVzZWQgdG8gY2FsbAo+ICAgICogbW11X3JhbmdlX3JlYWRfcmV0 cnkoKS4gSXQgdXBkYXRlcyB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciBsYXRlciB1c2UgYnkKPiAt ICogbW11X3JhbmdlX3JlYWRfcmV0cnkoKS4KPiArICogbW11X3JhbmdlX3JlYWRfcmV0cnkoKS4g VGhlIHByb3ZpZGVkIGN1cl9zZXEgd2lsbCBhbHdheXMgYmUgb2RkLgo+ICAgICoKPiAtICogSWYg dGhlIHVzZXIgZG9lcyBub3QgY2FsbCBtbXVfcmFuZ2VfcmVhZF9iZWdpbigpIG9yIG1tdV9yYW5n ZV9yZWFkX3JldHJ5KCkKPiAtICogdGhlbiB0aGlzIGNhbGwgaXMgbm90IHJlcXVpcmVkLgo+ICsg KiBJZiB0aGUgY2FsbGVyIGRvZXMgbm90IGNhbGwgbW11X3JhbmdlX3JlYWRfYmVnaW4oKSBvcgo+ ICsgKiBtbXVfcmFuZ2VfcmVhZF9yZXRyeSgpIHRoZW4gdGhpcyBjYWxsIGlzIG5vdCByZXF1aXJl ZC4KPiAgICAqLwo+ICAgc3RhdGljIGlubGluZSB2b2lkIG1tdV9yYW5nZV9zZXRfc2VxKHN0cnVj dCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiAgIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3Vy X3NlcSkKPiBAQCAtMzQ4LDggKzM0OCw5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBtbXVfcmFuZ2Vf cmVhZF9yZXRyeShzdHJ1Y3QgbW11X3JhbmdlX25vdGlmaWVyICptcm4sCj4gICAgKiBjb2xsaWRl ZCB3aXRoIHRoaXMgbG9jayBhbmQgYSBmdXR1cmUgbW11X3JhbmdlX3JlYWRfcmV0cnkoKSB3aWxs IHJldHVybgo+ICAgICogdHJ1ZS4KPiAgICAqCj4gLSAqIEZhbHNlIGlzIG5vdCByZWxpYWJsZSBh bmQgb25seSBzdWdnZXN0cyBhIGNvbGxpc2lvbiBoYXMgbm90IGhhcHBlbmVkLiBJdAo+IC0gKiBj YW4gYmUgY2FsbGVkIG1hbnkgdGltZXMgYW5kIGRvZXMgbm90IGhhdmUgdG8gaG9sZCB0aGUgdXNl ciBwcm92aWRlZCBsb2NrLgo+ICsgKiBGYWxzZSBpcyBub3QgcmVsaWFibGUgYW5kIG9ubHkgc3Vn Z2VzdHMgYSBjb2xsaXNpb24gbWF5IG5vdCBoYXZlCj4gKyAqIG9jY3VyZWQuIEl0IGNhbiBiZSBj YWxsZWQgbWFueSB0aW1lcyBhbmQgZG9lcyBub3QgaGF2ZSB0byBob2xkIHRoZSB1c2VyCj4gKyAq IHByb3ZpZGVkIGxvY2suCj4gICAgKgo+ICAgICogVGhpcyBjYWxsIGNhbiBiZSB1c2VkIGFzIHBh cnQgb2YgbG9vcHMgYW5kIG90aGVyIGV4cGVuc2l2ZSBvcGVyYXRpb25zIHRvCj4gICAgKiBleHBl ZGl0ZSBhIHJldHJ5Lgo+IGRpZmYgLS1naXQgYS9tbS9tbXVfbm90aWZpZXIuYyBiL21tL21tdV9u b3RpZmllci5jCj4gaW5kZXggMmI3NDg1OTE5ZWNmZWIuLmFmZTFlMmQ5NDE4M2Y4IDEwMDY0NAo+ IC0tLSBhL21tL21tdV9ub3RpZmllci5jCj4gKysrIGIvbW0vbW11X25vdGlmaWVyLmMKPiBAQCAt NTEsNyArNTEsOCBAQCBzdHJ1Y3QgbW11X25vdGlmaWVyX21tIHsKPiAgICAqIFRoaXMgaXMgYSBj b2xsaXNpb24tcmV0cnkgcmVhZC1zaWRlL3dyaXRlLXNpZGUgJ2xvY2snLCBhIGxvdCBsaWtlIGEK PiAgICAqIHNlcWNvdW50LCBob3dldmVyIHRoaXMgYWxsb3dzIG11bHRpcGxlIHdyaXRlLXNpZGVz IHRvIGhvbGQgaXQgYXQKPiAgICAqIG9uY2UuIENvbmNlcHR1YWxseSB0aGUgd3JpdGUgc2lkZSBp cyBwcm90ZWN0aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIFBURXMgaW4KPiAtICogdGhpcyBtbSwgc3Vj aCB0aGF0IFBURVMgY2Fubm90IGJlIHJlYWQgaW50byBTUFRFcyB3aGlsZSBhbnkgd3JpdGVyIGV4 aXN0cy4KPiArICogdGhpcyBtbSwgc3VjaCB0aGF0IFBURVMgY2Fubm90IGJlIHJlYWQgaW50byBT UFRFcyAoc2hhZG93IFBURXMpIHdoaWxlIGFueQo+ICsgKiB3cml0ZXIgZXhpc3RzLgo+ICAgICoK PiAgICAqIE5vdGUgdGhhdCB0aGUgY29yZSBtbSBjcmVhdGVzIG5lc3RlZCBpbnZhbGlkYXRlX3Jh bmdlX3N0YXJ0KCkvZW5kKCkgcmVnaW9ucwo+ICAgICogd2l0aGluIHRoZSBzYW1lIHRocmVhZCwg YW5kIHJ1bnMgaW52YWxpZGF0ZV9yYW5nZV9zdGFydCgpL2VuZCgpIGluIHBhcmFsbGVsCj4gQEAg LTY0LDEyICs2NSwxMyBAQCBzdHJ1Y3QgbW11X25vdGlmaWVyX21tIHsKPiAgICAqCj4gICAgKiBU aGUgd3JpdGUgc2lkZSBoYXMgdHdvIHN0YXRlcywgZnVsbHkgZXhjbHVkZWQ6Cj4gICAgKiAgLSBt bS0+YWN0aXZlX2ludmFsaWRhdGVfcmFuZ2VzICE9IDAKPiAtICogIC0gbW5uLT5pbnZhbGlkYXRl X3NlcSAmIDEgPT0gVHJ1ZQo+ICsgKiAgLSBtbm4tPmludmFsaWRhdGVfc2VxICYgMSA9PSBUcnVl IChvZGQpCj4gICAgKiAgLSBzb21lIHJhbmdlIG9uIHRoZSBtbV9zdHJ1Y3QgaXMgYmVpbmcgaW52 YWxpZGF0ZWQKPiAgICAqICAtIHRoZSBpdHJlZSBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UKPiAg ICAqCj4gICAgKiBBbmQgcGFydGlhbGx5IGV4Y2x1ZGVkOgo+ICAgICogIC0gbW0tPmFjdGl2ZV9p bnZhbGlkYXRlX3JhbmdlcyAhPSAwCj4gKyAqICAtIG1ubi0+aW52YWxpZGF0ZV9zZXEgJiAxID09 IEZhbHNlIChldmVuKQo+ICAgICogIC0gc29tZSByYW5nZSBvbiB0aGUgbW1fc3RydWN0IGlzIGJl aW5nIGludmFsaWRhdGVkCj4gICAgKiAgLSB0aGUgaXRyZWUgaXMgYWxsb3dlZCB0byBjaGFuZ2UK PiAgICAqCj4gQEAgLTEzMSwxMiArMTMzLDEzIEBAIHN0YXRpYyB2b2lkIG1uX2l0cmVlX2ludl9l bmQoc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tKQo+ICAgCQlyZXR1cm47Cj4gICAJfQo+ ICAgCj4gKwkvKiBNYWtlIGludmFsaWRhdGVfc2VxIGV2ZW4gKi8KPiAgIAltbW5fbW0tPmludmFs aWRhdGVfc2VxKys7Cj4gICAJbmVlZF93YWtlID0gdHJ1ZTsKPiAgIAo+ICAgCS8qCj4gICAJICog VGhlIGludl9lbmQgaW5jb3Jwb3JhdGVzIGEgZGVmZXJyZWQgbWVjaGFuaXNtIGxpa2UKPiAtCSAq IHJ0bmxfbG9jaygpLiBBZGRzIGFuZCByZW1vdmVzIGFyZSBxdWV1ZWQgdW50aWwgdGhlIGZpbmFs IGludl9lbmQKPiArCSAqIHJ0bmxfdW5sb2NrKCkuIEFkZHMgYW5kIHJlbW92ZXMgYXJlIHF1ZXVl ZCB1bnRpbCB0aGUgZmluYWwgaW52X2VuZAo+ICAgCSAqIGhhcHBlbnMgdGhlbiB0aGV5IGFyZSBw cm9ncmVzc2VkLiBUaGlzIGFycmFuZ2VtZW50IGZvciB0cmVlIHVwZGF0ZXMKPiAgIAkgKiBpcyB1 c2VkIHRvIGF2b2lkIHVzaW5nIGEgYmxvY2tpbmcgbG9jayBkdXJpbmcKPiAgIAkgKiBpbnZhbGlk YXRlX3JhbmdlX3N0YXJ0Lgo+IEBAIC0yMzAsMTAgKzIzMywxMSBAQCB1bnNpZ25lZCBsb25nIG1t dV9yYW5nZV9yZWFkX2JlZ2luKHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybikKPiAgIAlz cGluX3VubG9jaygmbW1uX21tLT5sb2NrKTsKPiAgIAo+ICAgCS8qCj4gLQkgKiBtcm4tPmludmFs aWRhdGVfc2VxIGlzIGFsd2F5cyBzZXQgdG8gYW4gb2RkIHZhbHVlLiBUaGlzIGVuc3VyZXMKPiAt CSAqIHRoYXQgaWYgc2VxIGRvZXMgd3JhcCB3ZSB3aWxsIGFsd2F5cyBjbGVhciB0aGUgYmVsb3cg c2xlZXAgaW4gc29tZQo+IC0JICogcmVhc29uYWJsZSB0aW1lIGFzIG1tbl9tbS0+aW52YWxpZGF0 ZV9zZXEgaXMgZXZlbiBpbiB0aGUgaWRsZQo+IC0JICogc3RhdGUuCj4gKwkgKiBtcm4tPmludmFs aWRhdGVfc2VxIG11c3QgYWx3YXlzIGJlIHNldCB0byBhbiBvZGQgdmFsdWUgdmlhCj4gKwkgKiBt bXVfcmFuZ2Vfc2V0X3NlcSgpIHVzaW5nIHRoZSBwcm92aWRlZCBjdXJfc2VxIGZyb20KPiArCSAq IG1uX2l0cmVlX2ludl9zdGFydF9yYW5nZSgpLiBUaGlzIGVuc3VyZXMgdGhhdCBpZiBzZXEgZG9l cyB3cmFwIHdlCj4gKwkgKiB3aWxsIGFsd2F5cyBjbGVhciB0aGUgYmVsb3cgc2xlZXAgaW4gc29t ZSByZWFzb25hYmxlIHRpbWUgYXMKPiArCSAqIG1tbl9tbS0+aW52YWxpZGF0ZV9zZXEgaXMgZXZl biBpbiB0aGUgaWRsZSBzdGF0ZS4KPiAgIAkgKi8KPiAgIAlsb2NrX21hcF9hY3F1aXJlKCZfX21t dV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0X21hcCk7Cj4gICAJbG9ja19tYXBfcmVs ZWFzZSgmX19tbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydF9tYXApOwo+IEBAIC04 OTIsNiArODk2LDEyIEBAIHN0YXRpYyBpbnQgX19tbXVfcmFuZ2Vfbm90aWZpZXJfaW5zZXJ0KHN0 cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiAgIAkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9 IG1tbl9tbS0+aW52YWxpZGF0ZV9zZXE7Cj4gICAJfSBlbHNlIHsKPiAgIAkJV0FSTl9PTihtbl9p dHJlZV9pc19pbnZhbGlkYXRpbmcobW1uX21tKSk7Cj4gKwkJLyoKPiArCQkgKiBUaGUgc3RhcnRp bmcgc2VxIGZvciBhIG1ybiBub3QgdW5kZXIgaW52YWxpZGF0aW9uIHNob3VsZCBiZQo+ICsJCSAq IG9kZCwgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50IGludmFsaWRhdGVfc2VxIGFuZAo+ICsJCSAq IGludmFsaWRhdGVfc2VxIHNob3VsZCBub3QgJ3dyYXAnIHRvIHRoZSBuZXcgc2VxIGFueSB0aW1l Cj4gKwkJICogc29vbi4KPiArCQkgKi8KPiAgIAkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9IG1tbl9t bS0+aW52YWxpZGF0ZV9zZXEgLSAxOwo+ICAgCQlpbnRlcnZhbF90cmVlX2luc2VydCgmbXJuLT5p bnRlcnZhbF90cmVlLCAmbW1uX21tLT5pdHJlZSk7Cj4gICAJfQo+IAoKTG9va3MgZ29vZC4gV2Un cmUganVzdCBwb2xpc2hpbmcgdXAgbWlub3IgcG9pbnRzIG5vdywgc28geW91IGNhbiBhZGQ6CgpS ZXZpZXdlZC1ieTogSm9obiBIdWJiYXJkIDxqaHViYmFyZEBudmlkaWEuY29tPgoKCgp0aGFua3Ms Ci0tIApKb2huIEh1YmJhcmQKTlZJRElBCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmFtZC1nZnggbWFpbGluZyBsaXN0CmFtZC1nZnhAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v YW1kLWdmeA==