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=-2.4 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,USER_AGENT_SANE_1 autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C6CB3FC6194 for ; Thu, 7 Nov 2019 02:08:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 84989217D7 for ; Thu, 7 Nov 2019 02:08:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="eVFhhEYG" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733033AbfKGCIW (ORCPT ); Wed, 6 Nov 2019 21:08:22 -0500 Received: from us-smtp-2.mimecast.com ([207.211.31.81]:42305 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1733016AbfKGCIW (ORCPT ); Wed, 6 Nov 2019 21:08:22 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1573092499; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3pEC4ofbH9GmBg4Hvo6IdX7Sd6lzjmsN2FQ75gU3Q+g=; b=eVFhhEYG21o8ZSzJm23PavGsP7p7FIBZdvztGjNdvqNTAabPJv+bdItLj/tje/C8bfXgeE w/3TdUi3oELjTuzxCOzDJe+bQB1a7dYv5wJzsvlqA2qhS6g18PvClgAi4qRnGtoi58TB1a hCYqwOygl3Kw7lca97XKOad0XvPHufs= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-251-vYaKpkspMBqRrJUS4jgCJw-1; Wed, 06 Nov 2019 21:08:16 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8F5831005502; Thu, 7 Nov 2019 02:08:13 +0000 (UTC) Received: from redhat.com (ovpn-125-216.rdu2.redhat.com [10.10.125.216]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 04F095C299; Thu, 7 Nov 2019 02:08:09 +0000 (UTC) Date: Wed, 6 Nov 2019 21:08:07 -0500 From: Jerome Glisse To: John Hubbard Cc: Jason Gunthorpe , linux-mm@kvack.org, 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 , Christian =?iso-8859-1?Q?K=F6nig?= , 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 , Jason Gunthorpe , Andrea Arcangeli , Michal Hocko Subject: Re: [PATCH v2 02/15] mm/mmu_notifier: add an interval tree notifier Message-ID: <20191107020807.GA747656@redhat.com> References: <20191028201032.6352-1-jgg@ziepe.ca> <20191028201032.6352-3-jgg@ziepe.ca> <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> MIME-Version: 1.0 In-Reply-To: <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> User-Agent: Mutt/1.12.1 (2019-06-15) X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-MC-Unique: vYaKpkspMBqRrJUS4jgCJw-1 X-Mimecast-Spam-Score: 0 Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org On Wed, Nov 06, 2019 at 04:23:21PM -0800, John Hubbard wrote: > On 10/28/19 1:10 PM, Jason Gunthorpe wrote: [...] > > /** > > * enum mmu_notifier_event - reason for the mmu notifier callback > > @@ -32,6 +34,9 @@ struct mmu_notifier_range; > > * access flags). User should soft dirty the page in the end callback = to make > > * sure that anyone relying on soft dirtyness catch pages that might b= e written > > * through non CPU mappings. > > + * > > + * @MMU_NOTIFY_RELEASE: used during mmu_range_notifier invalidate to s= ignal that > > + * the mm refcount is zero and the range is no longer accessible. > > */ > > enum mmu_notifier_event { > > =09MMU_NOTIFY_UNMAP =3D 0, > > @@ -39,6 +44,7 @@ enum mmu_notifier_event { > > =09MMU_NOTIFY_PROTECTION_VMA, > > =09MMU_NOTIFY_PROTECTION_PAGE, > > =09MMU_NOTIFY_SOFT_DIRTY, > > +=09MMU_NOTIFY_RELEASE, > > }; >=20 >=20 > OK, let the naming debates begin! ha. Anyway, after careful study of the = overall > patch, and some browsing of the larger patchset, it's clear that: >=20 > * The new "MMU range notifier" that you've created is, approximately, a n= ew > object. It uses classic mmu notifiers inside, as an implementation detail= , and > it does *similar* things (notifications) as mmn's. But it's certainly not= the same > as mmn's, as shown later when you say the need to an entirely new ops str= uct, and=20 > data struct too. >=20 > Therefore, you need a separate events enum as well. This is important. MM= N's > won't be issuing MMN_NOTIFY_RELEASE events, nor will MNR's be issuing the= first > four prexisting MMU_NOTIFY_* items. So it would be a design mistake to gl= om them > together, unless you ultimately decided to merge these MMN and MNR object= s (which > I don't really see any intention of, and that's fine). >=20 > So this should read: >=20 > enum mmu_range_notifier_event { > =09MMU_NOTIFY_RELEASE, > }; >=20 > ...assuming that we stay with "mmu_range_notifier" as a core name for thi= s=20 > whole thing. >=20 > Also, it is best moved down to be next to the new MNR structs, so that al= l the > MNR stuff is in one group. >=20 > Extra credit: IMHO, this clearly deserves to all be in a new mmu_range_no= tifier.h > header file, but I know that's extra work. Maybe later as a follow-up pat= ch, > if anyone has the time. The range notifier should get the event too, it would be a waste, i think i= t is an oversight here. The release event is fine so NAK to you separate event. = Event is really an helper for notifier i had a set of patch for nouveau to levera= ge this i need to resucite them. So no need to split thing, i would just forwa= rd the event ie add event to mmu_range_notifier_ops.invalidate() i failed to c= atch that in v1 sorry. [...] > > +struct mmu_range_notifier_ops { > > +=09bool (*invalidate)(struct mmu_range_notifier *mrn, > > +=09=09=09 const struct mmu_notifier_range *range, > > +=09=09=09 unsigned long cur_seq); > > +}; > > + > > +struct mmu_range_notifier { > > +=09struct interval_tree_node interval_tree; > > +=09const struct mmu_range_notifier_ops *ops; > > +=09struct hlist_node deferred_item; > > +=09unsigned long invalidate_seq; > > +=09struct mm_struct *mm; > > +}; > > + >=20 > Again, now we have the new struct mmu_range_notifier, and the old=20 > struct mmu_notifier_range, and it's not good. >=20 > Ideas: >=20 > a) Live with it. >=20 > b) (Discarded, too many callers): rename old one. Nope. >=20 > c) Rename new one. Ideas: >=20 > struct mmu_interval_notifier > struct mmu_range_intersection > ...other ideas? I vote for interval_notifier we do want notifier in name but i am also fine with current name. [...] > > + * > > + * Note that the core mm creates nested invalidate_range_start()/end()= regions > > + * within the same thread, and runs invalidate_range_start()/end() in = parallel > > + * on multiple CPUs. This is designed to not reduce concurrency or blo= ck > > + * progress on the mm side. > > + * > > + * As a secondary function, holding the full write side also serves to= prevent > > + * writers for the itree, this is an optimization to avoid extra locki= ng > > + * during invalidate_range_start/end notifiers. > > + * > > + * The write side has two states, fully excluded: > > + * - mm->active_invalidate_ranges !=3D 0 > > + * - mnn->invalidate_seq & 1 =3D=3D True > > + * - some range on the mm_struct is being invalidated > > + * - the itree is not allowed to change > > + * > > + * And partially excluded: > > + * - mm->active_invalidate_ranges !=3D 0 >=20 > I assume this implies mnn->invalidate_seq & 1 =3D=3D False in this case? = If so, > let's say so. I'm probably getting that wrong, too. Yes (mnn->invalidate_seq & 1) =3D=3D 0 >=20 > > + * - some range on the mm_struct is being invalidated > > + * - the itree is allowed to change > > + * > > + * The later state avoids some expensive work on inv_end in the common= case of > > + * no mrn monitoring the VA. > > + */ > > +static bool mn_itree_is_invalidating(struct mmu_notifier_mm *mmn_mm) > > +{ > > +=09lockdep_assert_held(&mmn_mm->lock); > > +=09return mmn_mm->invalidate_seq & 1; > > +} > > + > > +static struct mmu_range_notifier * > > +mn_itree_inv_start_range(struct mmu_notifier_mm *mmn_mm, > > +=09=09=09 const struct mmu_notifier_range *range, > > +=09=09=09 unsigned long *seq) > > +{ > > +=09struct interval_tree_node *node; > > +=09struct mmu_range_notifier *res =3D NULL; > > + > > +=09spin_lock(&mmn_mm->lock); > > +=09mmn_mm->active_invalidate_ranges++; > > +=09node =3D interval_tree_iter_first(&mmn_mm->itree, range->start, > > +=09=09=09=09=09range->end - 1); > > +=09if (node) { > > +=09=09mmn_mm->invalidate_seq |=3D 1; >=20 >=20 > 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. >=20 > Different approach: why not just add a mmn_mm->is_invalidating=20 > member variable? It's not like you're short of space in that struct. The invalidate_seq scheme looks fine to me, maybe it can use more comments. >=20 >=20 > > +=09=09res =3D container_of(node, struct mmu_range_notifier, > > +=09=09=09=09 interval_tree); > > +=09} > > + > > +=09*seq =3D mmn_mm->invalidate_seq; > > +=09spin_unlock(&mmn_mm->lock); > > +=09return res; > > +} > > + > > +static struct mmu_range_notifier * > > +mn_itree_inv_next(struct mmu_range_notifier *mrn, > > +=09=09 const struct mmu_notifier_range *range) > > +{ > > +=09struct interval_tree_node *node; > > + > > +=09node =3D interval_tree_iter_next(&mrn->interval_tree, range->start, > > +=09=09=09=09 range->end - 1); > > +=09if (!node) > > +=09=09return NULL; > > +=09return container_of(node, struct mmu_range_notifier, interval_tree)= ; > > +} > > + > > +static void mn_itree_inv_end(struct mmu_notifier_mm *mmn_mm) > > +{ > > +=09struct mmu_range_notifier *mrn; > > +=09struct hlist_node *next; > > +=09bool need_wake =3D false; > > + > > +=09spin_lock(&mmn_mm->lock); > > +=09if (--mmn_mm->active_invalidate_ranges || > > +=09 !mn_itree_is_invalidating(mmn_mm)) { > > +=09=09spin_unlock(&mmn_mm->lock); > > +=09=09return; > > +=09} > > + > > +=09mmn_mm->invalidate_seq++; >=20 > Is this the right place for an assertion that this is now an even value? Yes at that point it should be even ie mmn_mm->active_invalidate_ranges =3D= =3D 0 and we are holding the lock thus nothing can set the lower bit of invalidat= e_seq and ++ should lead to even number. >=20 > > +=09need_wake =3D true; > > + > > +=09/* > > +=09 * The inv_end incorporates a deferred mechanism like > > +=09 * rtnl_lock(). Adds and removes are queued until the final inv_end >=20 > 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. :) I think i commented in v1 about rtnl_lock() being something network people = only might be familiar, i think i saw it documented somewhere, maybe a lwn artic= le. But if you are familiar with network it is a think well understood ... for = any reasonable network scholar ;) > ... >=20 > > +unsigned long mmu_range_read_begin(struct mmu_range_notifier *mrn) > > +{ > > +=09struct mmu_notifier_mm *mmn_mm =3D mrn->mm->mmu_notifier_mm; > > +=09unsigned long seq; > > +=09bool is_invalidating; > > + > > +=09/* > > +=09 * If the mrn has a different seq value under the user_lock than we > > +=09 * started with then it has collided. > > +=09 * > > +=09 * If the mrn currently has the same seq value as the mmn_mm seq, t= hen > > +=09 * it is currently between invalidate_start/end and is colliding. > > +=09 * > > +=09 * The locking looks broadly like this: > > +=09 * mn_tree_invalidate_start(): mmu_range_read_begin(): > > +=09 * spin_lock > > +=09 * seq =3D READ_ONCE(mrn->= invalidate_seq); > > +=09 * seq =3D=3D mmn_mm->inva= lidate_seq > > +=09 * spin_unlock > > +=09 * spin_lock > > +=09 * seq =3D ++mmn_mm->invalidate_seq > > +=09 * spin_unlock > > +=09 * op->invalidate_range(): > > +=09 * user_lock > > +=09 * mmu_range_set_seq() > > +=09 * mrn->invalidate_seq =3D seq > > +=09 * user_unlock > > +=09 * > > +=09 * [Required: mmu_range_read_retry() =3D= =3D true] > > +=09 * > > +=09 * mn_itree_inv_end(): > > +=09 * spin_lock > > +=09 * seq =3D ++mmn_mm->invalidate_seq > > +=09 * spin_unlock > > +=09 * > > +=09 * user_lock > > +=09 * mmu_range_read_retry(): > > +=09 * mrn->invalidate_seq != =3D seq > > +=09 * user_unlock > > +=09 * > > +=09 * Barriers are not needed here as any races here are closed by an > > +=09 * eventual mmu_range_read_retry(), which provides a barrier via th= e > > +=09 * user_lock. > > +=09 */ > > +=09spin_lock(&mmn_mm->lock); > > +=09/* Pairs with the WRITE_ONCE in mmu_range_set_seq() */ > > +=09seq =3D READ_ONCE(mrn->invalidate_seq); > > +=09is_invalidating =3D seq =3D=3D mmn_mm->invalidate_seq; > > +=09spin_unlock(&mmn_mm->lock); > > + > > +=09/* > > +=09 * mrn->invalidate_seq is always set to an odd value. This ensures >=20 > This claim just looks wrong the first N times one reads the code, given t= hat > there is mmu_range_set_seq() to set it to an arbitrary value! Maybe you = mean >=20 > "is always set to an odd value when invalidating"?? No it is always odd, you must call mmu_range_set_seq() only from the op->invalidate_range() callback at which point the seq is odd. As well when mrn is added and its seq first set it is set to an odd value always. Maybe the comment, should read: * mrn->invalidate_seq is always, yes always, set to an odd value. This ens= ures To stress that it is not an error. >=20 > > +=09 * that if seq does wrap we will always clear the below sleep in so= me > > +=09 * reasonable time as mmn_mm->invalidate_seq is even in the idle > > +=09 * state. > > +=09 */ >=20 > Let's move that comment higher up. The code that follows it has nothing t= o > do with it, so it's confusing here. No the comment is in the right place, the fact that it is odd and that idle state is even explains why the wait() will never last forever. Already had a discussion on this in v1. [...] > > +=09/* > > +=09 * If some invalidate_range_start/end region is going on in paralle= l > > +=09 * we don't know what VA ranges are affected, so we must assume thi= s > > +=09 * new range is included. > > +=09 * > > +=09 * If the itree is invalidating then we are not allowed to change > > +=09 * it. Retrying until invalidation is done is tricky due to the > > +=09 * possibility for live lock, instead defer the add to the unlock s= o > > +=09 * this algorithm is deterministic. > > +=09 * > > +=09 * In all cases the value for the mrn->mr_invalidate_seq should be > > +=09 * odd, see mmu_range_read_begin() > > +=09 */ > > +=09spin_lock(&mmn_mm->lock); > > +=09if (mmn_mm->active_invalidate_ranges) { > > +=09=09if (mn_itree_is_invalidating(mmn_mm)) > > +=09=09=09hlist_add_head(&mrn->deferred_item, > > +=09=09=09=09 &mmn_mm->deferred_list); > > +=09=09else { > > +=09=09=09mmn_mm->invalidate_seq |=3D 1; > > +=09=09=09interval_tree_insert(&mrn->interval_tree, > > +=09=09=09=09=09 &mmn_mm->itree); > > +=09=09} > > +=09=09mrn->invalidate_seq =3D mmn_mm->invalidate_seq; > > +=09} else { > > +=09=09WARN_ON(mn_itree_is_invalidating(mmn_mm)); > > +=09=09mrn->invalidate_seq =3D mmn_mm->invalidate_seq - 1; >=20 > 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. If there is no mmn_mm->active_invalidate_ranges then it means that mmn_mm->invalidate_seq is even and thus mmn_mm->invalidate_seq - 1 is an odd number which means that mrn->invalidate_seq is initialized to odd value and if you follow the rule for calling mmu_range_set_seq() then it will _always_ be an odd number and this close the loop with the above comments :) >=20 > > +=09=09interval_tree_insert(&mrn->interval_tree, &mmn_mm->itree); > > +=09} > > +=09spin_unlock(&mmn_mm->lock); > > +=09return 0; > > +} > > + > > +/** > > + * mmu_range_notifier_insert - Insert a range notifier > > + * @mrn: Range notifier to register > > + * @start: Starting virtual address to monitor > > + * @length: Length of the range to monitor > > + * @mm : mm_struct to attach to > > + * > > + * This function subscribes the range notifier for notifications from = the mm. > > + * Upon return the ops related to mmu_range_notifier will be called wh= enever > > + * an event that intersects with the given range occurs. > > + * > > + * Upon return the range_notifier may not be present in the interval t= ree yet. > > + * The caller must use the normal range notifier locking flow via > > + * mmu_range_read_begin() to establish SPTEs for this range. > > + */ > > +int mmu_range_notifier_insert(struct mmu_range_notifier *mrn, > > +=09=09=09 unsigned long start, unsigned long length, > > +=09=09=09 struct mm_struct *mm) > > +{ > > +=09struct mmu_notifier_mm *mmn_mm; > > +=09int ret; >=20 > Hmmm, I think a later patch improperly changes the above to "int ret =3D = 0;". > I'll check on that. It's correct here, though. >=20 > > + > > +=09might_lock(&mm->mmap_sem); > > + > > +=09mmn_mm =3D smp_load_acquire(&mm->mmu_notifier_mm); >=20 > What does the above pair with? Should have a comment that specifies that. It was discussed in v1 but maybe a comment of what was said back then would be helpful. Something like: /* * We need to insure that all writes to mm->mmu_notifier_mm are visible bef= ore * any checks we do on mmn_mm below as otherwise CPU might re-order write d= one * by another CPU core to mm->mmu_notifier_mm structure fields after the re= ad * belows. */ Cheers, J=E9r=F4me From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerome Glisse Subject: Re: [PATCH v2 02/15] mm/mmu_notifier: add an interval tree notifier Date: Wed, 6 Nov 2019 21:08:07 -0500 Message-ID: <20191107020807.GA747656@redhat.com> References: <20191028201032.6352-1-jgg@ziepe.ca> <20191028201032.6352-3-jgg@ziepe.ca> <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> Content-Disposition: inline List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: John Hubbard 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 , Jason Gunthorpe , Jason Gunthorpe , Ben Skeggs , xen-devel@lists.xenproject.org, Ralph Campbell , Boris Ostrovsky , Petr Cvek , Juergen Gross , Mike Marciniszyn , Dennis Dalessandro , Christian =?iso-8859-1?Q?K=F6nig?= , Alex Deucher , Felix.Kuehling@amd.com List-Id: nouveau.vger.kernel.org T24gV2VkLCBOb3YgMDYsIDIwMTkgYXQgMDQ6MjM6MjFQTSAtMDgwMCwgSm9obiBIdWJiYXJkIHdy b3RlOgo+IE9uIDEwLzI4LzE5IDE6MTAgUE0sIEphc29uIEd1bnRob3JwZSB3cm90ZToKClsuLi5d Cgo+ID4gIC8qKgo+ID4gICAqIGVudW0gbW11X25vdGlmaWVyX2V2ZW50IC0gcmVhc29uIGZvciB0 aGUgbW11IG5vdGlmaWVyIGNhbGxiYWNrCj4gPiBAQCAtMzIsNiArMzQsOSBAQCBzdHJ1Y3QgbW11 X25vdGlmaWVyX3JhbmdlOwo+ID4gICAqIGFjY2VzcyBmbGFncykuIFVzZXIgc2hvdWxkIHNvZnQg ZGlydHkgdGhlIHBhZ2UgaW4gdGhlIGVuZCBjYWxsYmFjayB0byBtYWtlCj4gPiAgICogc3VyZSB0 aGF0IGFueW9uZSByZWx5aW5nIG9uIHNvZnQgZGlydHluZXNzIGNhdGNoIHBhZ2VzIHRoYXQgbWln aHQgYmUgd3JpdHRlbgo+ID4gICAqIHRocm91Z2ggbm9uIENQVSBtYXBwaW5ncy4KPiA+ICsgKgo+ ID4gKyAqIEBNTVVfTk9USUZZX1JFTEVBU0U6IHVzZWQgZHVyaW5nIG1tdV9yYW5nZV9ub3RpZmll ciBpbnZhbGlkYXRlIHRvIHNpZ25hbCB0aGF0Cj4gPiArICogdGhlIG1tIHJlZmNvdW50IGlzIHpl cm8gYW5kIHRoZSByYW5nZSBpcyBubyBsb25nZXIgYWNjZXNzaWJsZS4KPiA+ICAgKi8KPiA+ICBl bnVtIG1tdV9ub3RpZmllcl9ldmVudCB7Cj4gPiAgCU1NVV9OT1RJRllfVU5NQVAgPSAwLAo+ID4g QEAgLTM5LDYgKzQ0LDcgQEAgZW51bSBtbXVfbm90aWZpZXJfZXZlbnQgewo+ID4gIAlNTVVfTk9U SUZZX1BST1RFQ1RJT05fVk1BLAo+ID4gIAlNTVVfTk9USUZZX1BST1RFQ1RJT05fUEFHRSwKPiA+ ICAJTU1VX05PVElGWV9TT0ZUX0RJUlRZLAo+ID4gKwlNTVVfTk9USUZZX1JFTEVBU0UsCj4gPiAg fTsKPiAKPiAKPiBPSywgbGV0IHRoZSBuYW1pbmcgZGViYXRlcyBiZWdpbiEgaGEuIEFueXdheSwg YWZ0ZXIgY2FyZWZ1bCBzdHVkeSBvZiB0aGUgb3ZlcmFsbAo+IHBhdGNoLCBhbmQgc29tZSBicm93 c2luZyBvZiB0aGUgbGFyZ2VyIHBhdGNoc2V0LCBpdCdzIGNsZWFyIHRoYXQ6Cj4gCj4gKiBUaGUg bmV3ICJNTVUgcmFuZ2Ugbm90aWZpZXIiIHRoYXQgeW91J3ZlIGNyZWF0ZWQgaXMsIGFwcHJveGlt YXRlbHksIGEgbmV3Cj4gb2JqZWN0LiBJdCB1c2VzIGNsYXNzaWMgbW11IG5vdGlmaWVycyBpbnNp ZGUsIGFzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgYW5kCj4gaXQgZG9lcyAqc2ltaWxhciog dGhpbmdzIChub3RpZmljYXRpb25zKSBhcyBtbW4ncy4gQnV0IGl0J3MgY2VydGFpbmx5IG5vdCB0 aGUgc2FtZQo+IGFzIG1tbidzLCBhcyBzaG93biBsYXRlciB3aGVuIHlvdSBzYXkgdGhlIG5lZWQg dG8gYW4gZW50aXJlbHkgbmV3IG9wcyBzdHJ1Y3QsIGFuZCAKPiBkYXRhIHN0cnVjdCB0b28uCj4g Cj4gVGhlcmVmb3JlLCB5b3UgbmVlZCBhIHNlcGFyYXRlIGV2ZW50cyBlbnVtIGFzIHdlbGwuIFRo aXMgaXMgaW1wb3J0YW50LiBNTU4ncwo+IHdvbid0IGJlIGlzc3VpbmcgTU1OX05PVElGWV9SRUxF QVNFIGV2ZW50cywgbm9yIHdpbGwgTU5SJ3MgYmUgaXNzdWluZyB0aGUgZmlyc3QKPiBmb3VyIHBy ZXhpc3RpbmcgTU1VX05PVElGWV8qIGl0ZW1zLiBTbyBpdCB3b3VsZCBiZSBhIGRlc2lnbiBtaXN0 YWtlIHRvIGdsb20gdGhlbQo+IHRvZ2V0aGVyLCB1bmxlc3MgeW91IHVsdGltYXRlbHkgZGVjaWRl ZCB0byBtZXJnZSB0aGVzZSBNTU4gYW5kIE1OUiBvYmplY3RzICh3aGljaAo+IEkgZG9uJ3QgcmVh bGx5IHNlZSBhbnkgaW50ZW50aW9uIG9mLCBhbmQgdGhhdCdzIGZpbmUpLgo+IAo+IFNvIHRoaXMg c2hvdWxkIHJlYWQ6Cj4gCj4gZW51bSBtbXVfcmFuZ2Vfbm90aWZpZXJfZXZlbnQgewo+IAlNTVVf Tk9USUZZX1JFTEVBU0UsCj4gfTsKPiAKPiAuLi5hc3N1bWluZyB0aGF0IHdlIHN0YXkgd2l0aCAi bW11X3JhbmdlX25vdGlmaWVyIiBhcyBhIGNvcmUgbmFtZSBmb3IgdGhpcyAKPiB3aG9sZSB0aGlu Zy4KPiAKPiBBbHNvLCBpdCBpcyBiZXN0IG1vdmVkIGRvd24gdG8gYmUgbmV4dCB0byB0aGUgbmV3 IE1OUiBzdHJ1Y3RzLCBzbyB0aGF0IGFsbCB0aGUKPiBNTlIgc3R1ZmYgaXMgaW4gb25lIGdyb3Vw Lgo+IAo+IEV4dHJhIGNyZWRpdDogSU1ITywgdGhpcyBjbGVhcmx5IGRlc2VydmVzIHRvIGFsbCBi ZSBpbiBhIG5ldyBtbXVfcmFuZ2Vfbm90aWZpZXIuaAo+IGhlYWRlciBmaWxlLCBidXQgSSBrbm93 IHRoYXQncyBleHRyYSB3b3JrLiBNYXliZSBsYXRlciBhcyBhIGZvbGxvdy11cCBwYXRjaCwKPiBp ZiBhbnlvbmUgaGFzIHRoZSB0aW1lLgoKVGhlIHJhbmdlIG5vdGlmaWVyIHNob3VsZCBnZXQgdGhl IGV2ZW50IHRvbywgaXQgd291bGQgYmUgYSB3YXN0ZSwgaSB0aGluayBpdCBpcwphbiBvdmVyc2ln aHQgaGVyZS4gVGhlIHJlbGVhc2UgZXZlbnQgaXMgZmluZSBzbyBOQUsgdG8geW91IHNlcGFyYXRl IGV2ZW50LiBFdmVudAppcyByZWFsbHkgYW4gaGVscGVyIGZvciBub3RpZmllciBpIGhhZCBhIHNl dCBvZiBwYXRjaCBmb3Igbm91dmVhdSB0byBsZXZlcmFnZQp0aGlzIGkgbmVlZCB0byByZXN1Y2l0 ZSB0aGVtLiBTbyBubyBuZWVkIHRvIHNwbGl0IHRoaW5nLCBpIHdvdWxkIGp1c3QgZm9yd2FyZAp0 aGUgZXZlbnQgaWUgYWRkIGV2ZW50IHRvIG1tdV9yYW5nZV9ub3RpZmllcl9vcHMuaW52YWxpZGF0 ZSgpIGkgZmFpbGVkIHRvIGNhdGNoCnRoYXQgaW4gdjEgc29ycnkuCgoKWy4uLl0KCj4gPiArc3Ry dWN0IG1tdV9yYW5nZV9ub3RpZmllcl9vcHMgewo+ID4gKwlib29sICgqaW52YWxpZGF0ZSkoc3Ry dWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuLAo+ID4gKwkJCSAgIGNvbnN0IHN0cnVjdCBtbXVf bm90aWZpZXJfcmFuZ2UgKnJhbmdlLAo+ID4gKwkJCSAgIHVuc2lnbmVkIGxvbmcgY3VyX3NlcSk7 Cj4gPiArfTsKPiA+ICsKPiA+ICtzdHJ1Y3QgbW11X3JhbmdlX25vdGlmaWVyIHsKPiA+ICsJc3Ry dWN0IGludGVydmFsX3RyZWVfbm9kZSBpbnRlcnZhbF90cmVlOwo+ID4gKwljb25zdCBzdHJ1Y3Qg bW11X3JhbmdlX25vdGlmaWVyX29wcyAqb3BzOwo+ID4gKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZWZl cnJlZF9pdGVtOwo+ID4gKwl1bnNpZ25lZCBsb25nIGludmFsaWRhdGVfc2VxOwo+ID4gKwlzdHJ1 Y3QgbW1fc3RydWN0ICptbTsKPiA+ICt9Owo+ID4gKwo+IAo+IEFnYWluLCBub3cgd2UgaGF2ZSB0 aGUgbmV3IHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIsIGFuZCB0aGUgb2xkIAo+IHN0cnVjdCBt bXVfbm90aWZpZXJfcmFuZ2UsIGFuZCBpdCdzIG5vdCBnb29kLgo+IAo+IElkZWFzOgo+IAo+IGEp IExpdmUgd2l0aCBpdC4KPiAKPiBiKSAoRGlzY2FyZGVkLCB0b28gbWFueSBjYWxsZXJzKTogcmVu YW1lIG9sZCBvbmUuIE5vcGUuCj4gCj4gYykgUmVuYW1lIG5ldyBvbmUuIElkZWFzOgo+IAo+ICAg ICBzdHJ1Y3QgbW11X2ludGVydmFsX25vdGlmaWVyCj4gICAgIHN0cnVjdCBtbXVfcmFuZ2VfaW50 ZXJzZWN0aW9uCj4gICAgIC4uLm90aGVyIGlkZWFzPwoKSSB2b3RlIGZvciBpbnRlcnZhbF9ub3Rp ZmllciB3ZSBkbyB3YW50IG5vdGlmaWVyIGluIG5hbWUgYnV0IGkgYW0gYWxzbwpmaW5lIHdpdGgg Y3VycmVudCBuYW1lLgoKWy4uLl0KCj4gPiArICoKPiA+ICsgKiBOb3RlIHRoYXQgdGhlIGNvcmUg bW0gY3JlYXRlcyBuZXN0ZWQgaW52YWxpZGF0ZV9yYW5nZV9zdGFydCgpL2VuZCgpIHJlZ2lvbnMK PiA+ICsgKiB3aXRoaW4gdGhlIHNhbWUgdGhyZWFkLCBhbmQgcnVucyBpbnZhbGlkYXRlX3Jhbmdl X3N0YXJ0KCkvZW5kKCkgaW4gcGFyYWxsZWwKPiA+ICsgKiBvbiBtdWx0aXBsZSBDUFVzLiBUaGlz IGlzIGRlc2lnbmVkIHRvIG5vdCByZWR1Y2UgY29uY3VycmVuY3kgb3IgYmxvY2sKPiA+ICsgKiBw cm9ncmVzcyBvbiB0aGUgbW0gc2lkZS4KPiA+ICsgKgo+ID4gKyAqIEFzIGEgc2Vjb25kYXJ5IGZ1 bmN0aW9uLCBob2xkaW5nIHRoZSBmdWxsIHdyaXRlIHNpZGUgYWxzbyBzZXJ2ZXMgdG8gcHJldmVu dAo+ID4gKyAqIHdyaXRlcnMgZm9yIHRoZSBpdHJlZSwgdGhpcyBpcyBhbiBvcHRpbWl6YXRpb24g dG8gYXZvaWQgZXh0cmEgbG9ja2luZwo+ID4gKyAqIGR1cmluZyBpbnZhbGlkYXRlX3JhbmdlX3N0 YXJ0L2VuZCBub3RpZmllcnMuCj4gPiArICoKPiA+ICsgKiBUaGUgd3JpdGUgc2lkZSBoYXMgdHdv IHN0YXRlcywgZnVsbHkgZXhjbHVkZWQ6Cj4gPiArICogIC0gbW0tPmFjdGl2ZV9pbnZhbGlkYXRl X3JhbmdlcyAhPSAwCj4gPiArICogIC0gbW5uLT5pbnZhbGlkYXRlX3NlcSAmIDEgPT0gVHJ1ZQo+ ID4gKyAqICAtIHNvbWUgcmFuZ2Ugb24gdGhlIG1tX3N0cnVjdCBpcyBiZWluZyBpbnZhbGlkYXRl ZAo+ID4gKyAqICAtIHRoZSBpdHJlZSBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UKPiA+ICsgKgo+ ID4gKyAqIEFuZCBwYXJ0aWFsbHkgZXhjbHVkZWQ6Cj4gPiArICogIC0gbW0tPmFjdGl2ZV9pbnZh bGlkYXRlX3JhbmdlcyAhPSAwCj4gCj4gSSBhc3N1bWUgdGhpcyBpbXBsaWVzIG1ubi0+aW52YWxp ZGF0ZV9zZXEgJiAxID09IEZhbHNlIGluIHRoaXMgY2FzZT8gSWYgc28sCj4gbGV0J3Mgc2F5IHNv LiBJJ20gcHJvYmFibHkgZ2V0dGluZyB0aGF0IHdyb25nLCB0b28uCgpZZXMgKG1ubi0+aW52YWxp ZGF0ZV9zZXEgJiAxKSA9PSAwCgo+IAo+ID4gKyAqICAtIHNvbWUgcmFuZ2Ugb24gdGhlIG1tX3N0 cnVjdCBpcyBiZWluZyBpbnZhbGlkYXRlZAo+ID4gKyAqICAtIHRoZSBpdHJlZSBpcyBhbGxvd2Vk IHRvIGNoYW5nZQo+ID4gKyAqCj4gPiArICogVGhlIGxhdGVyIHN0YXRlIGF2b2lkcyBzb21lIGV4 cGVuc2l2ZSB3b3JrIG9uIGludl9lbmQgaW4gdGhlIGNvbW1vbiBjYXNlIG9mCj4gPiArICogbm8g bXJuIG1vbml0b3JpbmcgdGhlIFZBLgo+ID4gKyAqLwo+ID4gK3N0YXRpYyBib29sIG1uX2l0cmVl X2lzX2ludmFsaWRhdGluZyhzdHJ1Y3QgbW11X25vdGlmaWVyX21tICptbW5fbW0pCj4gPiArewo+ ID4gKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtbW5fbW0tPmxvY2spOwo+ID4gKwlyZXR1cm4gbW1u X21tLT5pbnZhbGlkYXRlX3NlcSAmIDE7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3Qg bW11X3JhbmdlX25vdGlmaWVyICoKPiA+ICttbl9pdHJlZV9pbnZfc3RhcnRfcmFuZ2Uoc3RydWN0 IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tLAo+ID4gKwkJCSBjb25zdCBzdHJ1Y3QgbW11X25vdGlm aWVyX3JhbmdlICpyYW5nZSwKPiA+ICsJCQkgdW5zaWduZWQgbG9uZyAqc2VxKQo+ID4gK3sKPiA+ ICsJc3RydWN0IGludGVydmFsX3RyZWVfbm9kZSAqbm9kZTsKPiA+ICsJc3RydWN0IG1tdV9yYW5n ZV9ub3RpZmllciAqcmVzID0gTlVMTDsKPiA+ICsKPiA+ICsJc3Bpbl9sb2NrKCZtbW5fbW0tPmxv Y2spOwo+ID4gKwltbW5fbW0tPmFjdGl2ZV9pbnZhbGlkYXRlX3JhbmdlcysrOwo+ID4gKwlub2Rl ID0gaW50ZXJ2YWxfdHJlZV9pdGVyX2ZpcnN0KCZtbW5fbW0tPml0cmVlLCByYW5nZS0+c3RhcnQs Cj4gPiArCQkJCQlyYW5nZS0+ZW5kIC0gMSk7Cj4gPiArCWlmIChub2RlKSB7Cj4gPiArCQltbW5f bW0tPmludmFsaWRhdGVfc2VxIHw9IDE7Cj4gCj4gCj4gT0ssIHRoaXMgZWl0aGVyIG5lZWRzIG1v cmUgZG9jdW1lbnRhdGlvbiBhbmQgYXNzZXJ0aW9ucywgb3IgYSBkaWZmZXJlbnQKPiBhcHByb2Fj aC4gQmVjYXVzZSBJIHNlZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIEFORCwgT1IgYW5kIGJvb2xl YW5zCj4gYWxsIGJlaW5nIGFwcGxpZWQgdG8gdGhpcyBmaWVsZCwgYW5kIGl0J3MgZGFybiBuZWFy IGhvcGVsZXNzIHRvIGZpZ3VyZQo+IG91dCB3aGV0aGVyIG9yIG5vdCBpdCByZWFsbHkgaXMgZXZl biBvciBvZGQgYXQgdGhlIHJpZ2h0IHRpbWVzLgo+IAo+IERpZmZlcmVudCBhcHByb2FjaDogd2h5 IG5vdCBqdXN0IGFkZCBhIG1tbl9tbS0+aXNfaW52YWxpZGF0aW5nIAo+IG1lbWJlciB2YXJpYWJs ZT8gSXQncyBub3QgbGlrZSB5b3UncmUgc2hvcnQgb2Ygc3BhY2UgaW4gdGhhdCBzdHJ1Y3QuCgpU aGUgaW52YWxpZGF0ZV9zZXEgc2NoZW1lIGxvb2tzIGZpbmUgdG8gbWUsIG1heWJlIGl0IGNhbiB1 c2UgbW9yZSBjb21tZW50cy4KCgo+IAo+IAo+ID4gKwkJcmVzID0gY29udGFpbmVyX29mKG5vZGUs IHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIsCj4gPiArCQkJCSAgIGludGVydmFsX3RyZWUpOwo+ ID4gKwl9Cj4gPiArCj4gPiArCSpzZXEgPSBtbW5fbW0tPmludmFsaWRhdGVfc2VxOwo+ID4gKwlz cGluX3VubG9jaygmbW1uX21tLT5sb2NrKTsKPiA+ICsJcmV0dXJuIHJlczsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKgo+ID4gK21uX2l0cmVlX2lu dl9uZXh0KHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiA+ICsJCSAgY29uc3Qgc3Ry dWN0IG1tdV9ub3RpZmllcl9yYW5nZSAqcmFuZ2UpCj4gPiArewo+ID4gKwlzdHJ1Y3QgaW50ZXJ2 YWxfdHJlZV9ub2RlICpub2RlOwo+ID4gKwo+ID4gKwlub2RlID0gaW50ZXJ2YWxfdHJlZV9pdGVy X25leHQoJm1ybi0+aW50ZXJ2YWxfdHJlZSwgcmFuZ2UtPnN0YXJ0LAo+ID4gKwkJCQkgICAgICAg cmFuZ2UtPmVuZCAtIDEpOwo+ID4gKwlpZiAoIW5vZGUpCj4gPiArCQlyZXR1cm4gTlVMTDsKPiA+ ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgbW11X3JhbmdlX25vdGlmaWVyLCBp bnRlcnZhbF90cmVlKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbW5faXRyZWVfaW52 X2VuZChzdHJ1Y3QgbW11X25vdGlmaWVyX21tICptbW5fbW0pCj4gPiArewo+ID4gKwlzdHJ1Y3Qg bW11X3JhbmdlX25vdGlmaWVyICptcm47Cj4gPiArCXN0cnVjdCBobGlzdF9ub2RlICpuZXh0Owo+ ID4gKwlib29sIG5lZWRfd2FrZSA9IGZhbHNlOwo+ID4gKwo+ID4gKwlzcGluX2xvY2soJm1tbl9t bS0+bG9jayk7Cj4gPiArCWlmICgtLW1tbl9tbS0+YWN0aXZlX2ludmFsaWRhdGVfcmFuZ2VzIHx8 Cj4gPiArCSAgICAhbW5faXRyZWVfaXNfaW52YWxpZGF0aW5nKG1tbl9tbSkpIHsKPiA+ICsJCXNw aW5fdW5sb2NrKCZtbW5fbW0tPmxvY2spOwo+ID4gKwkJcmV0dXJuOwo+ID4gKwl9Cj4gPiArCj4g PiArCW1tbl9tbS0+aW52YWxpZGF0ZV9zZXErKzsKPiAKPiBJcyB0aGlzIHRoZSByaWdodCBwbGFj ZSBmb3IgYW4gYXNzZXJ0aW9uIHRoYXQgdGhpcyBpcyBub3cgYW4gZXZlbiB2YWx1ZT8KClllcyBh dCB0aGF0IHBvaW50IGl0IHNob3VsZCBiZSBldmVuIGllIG1tbl9tbS0+YWN0aXZlX2ludmFsaWRh dGVfcmFuZ2VzID09IDAKYW5kIHdlIGFyZSBob2xkaW5nIHRoZSBsb2NrIHRodXMgbm90aGluZyBj YW4gc2V0IHRoZSBsb3dlciBiaXQgb2YgaW52YWxpZGF0ZV9zZXEKYW5kICsrIHNob3VsZCBsZWFk IHRvIGV2ZW4gbnVtYmVyLgoKPiAKPiA+ICsJbmVlZF93YWtlID0gdHJ1ZTsKPiA+ICsKPiA+ICsJ LyoKPiA+ICsJICogVGhlIGludl9lbmQgaW5jb3Jwb3JhdGVzIGEgZGVmZXJyZWQgbWVjaGFuaXNt IGxpa2UKPiA+ICsJICogcnRubF9sb2NrKCkuIEFkZHMgYW5kIHJlbW92ZXMgYXJlIHF1ZXVlZCB1 bnRpbCB0aGUgZmluYWwgaW52X2VuZAo+IAo+IExldCBtZSBwb2ludCBvdXQgdGhhdCBydG5sX2xv Y2soKSBpdHNlbGYgaXMgYSBvbmUtbGluZXIgdGhhdCBjYWxscyBtdXRleF9sb2NrKCkuCj4gQnV0 IEkgc3VwcG9zZSBpZiBvbmUgc3R1ZGllcyB0aGF0IGZpbGUgY2xvc2VseSB0aGVyZSBpcyBtb3Jl LiA6KQoKSSB0aGluayBpIGNvbW1lbnRlZCBpbiB2MSBhYm91dCBydG5sX2xvY2soKSBiZWluZyBz b21ldGhpbmcgbmV0d29yayBwZW9wbGUgb25seQptaWdodCBiZSBmYW1pbGlhciwgaSB0aGluayBp IHNhdyBpdCBkb2N1bWVudGVkIHNvbWV3aGVyZSwgbWF5YmUgYSBsd24gYXJ0aWNsZS4KQnV0IGlm IHlvdSBhcmUgZmFtaWxpYXIgd2l0aCBuZXR3b3JrIGl0IGlzIGEgdGhpbmsgd2VsbCB1bmRlcnN0 b29kIC4uLiBmb3IgYW55CnJlYXNvbmFibGUgbmV0d29yayBzY2hvbGFyIDspCgo+IC4uLgo+IAo+ ID4gK3Vuc2lnbmVkIGxvbmcgbW11X3JhbmdlX3JlYWRfYmVnaW4oc3RydWN0IG1tdV9yYW5nZV9u b3RpZmllciAqbXJuKQo+ID4gK3sKPiA+ICsJc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21t ID0gbXJuLT5tbS0+bW11X25vdGlmaWVyX21tOwo+ID4gKwl1bnNpZ25lZCBsb25nIHNlcTsKPiA+ ICsJYm9vbCBpc19pbnZhbGlkYXRpbmc7Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIElmIHRoZSBt cm4gaGFzIGEgZGlmZmVyZW50IHNlcSB2YWx1ZSB1bmRlciB0aGUgdXNlcl9sb2NrIHRoYW4gd2UK PiA+ICsJICogc3RhcnRlZCB3aXRoIHRoZW4gaXQgaGFzIGNvbGxpZGVkLgo+ID4gKwkgKgo+ID4g KwkgKiBJZiB0aGUgbXJuIGN1cnJlbnRseSBoYXMgdGhlIHNhbWUgc2VxIHZhbHVlIGFzIHRoZSBt bW5fbW0gc2VxLCB0aGVuCj4gPiArCSAqIGl0IGlzIGN1cnJlbnRseSBiZXR3ZWVuIGludmFsaWRh dGVfc3RhcnQvZW5kIGFuZCBpcyBjb2xsaWRpbmcuCj4gPiArCSAqCj4gPiArCSAqIFRoZSBsb2Nr aW5nIGxvb2tzIGJyb2FkbHkgbGlrZSB0aGlzOgo+ID4gKwkgKiAgIG1uX3RyZWVfaW52YWxpZGF0 ZV9zdGFydCgpOiAgICAgICAgICBtbXVfcmFuZ2VfcmVhZF9iZWdpbigpOgo+ID4gKwkgKiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrCj4gPiArCSAqICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxID0gUkVBRF9PTkNFKG1y bi0+aW52YWxpZGF0ZV9zZXEpOwo+ID4gKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNlcSA9PSBtbW5fbW0tPmludmFsaWRhdGVfc2VxCj4gPiArCSAqICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jawo+ID4gKwkgKiAg ICBzcGluX2xvY2sKPiA+ICsJICogICAgIHNlcSA9ICsrbW1uX21tLT5pbnZhbGlkYXRlX3NlcQo+ ID4gKwkgKiAgICBzcGluX3VubG9jawo+ID4gKwkgKiAgICAgb3AtPmludmFsaWRhdGVfcmFuZ2Uo KToKPiA+ICsJICogICAgICAgdXNlcl9sb2NrCj4gPiArCSAqICAgICAgICBtbXVfcmFuZ2Vfc2V0 X3NlcSgpCj4gPiArCSAqICAgICAgICAgbXJuLT5pbnZhbGlkYXRlX3NlcSA9IHNlcQo+ID4gKwkg KiAgICAgICB1c2VyX3VubG9jawo+ID4gKwkgKgo+ID4gKwkgKiAgICAgICAgICAgICAgICAgICAg ICAgICAgW1JlcXVpcmVkOiBtbXVfcmFuZ2VfcmVhZF9yZXRyeSgpID09IHRydWVdCj4gPiArCSAq Cj4gPiArCSAqICAgbW5faXRyZWVfaW52X2VuZCgpOgo+ID4gKwkgKiAgICBzcGluX2xvY2sKPiA+ ICsJICogICAgIHNlcSA9ICsrbW1uX21tLT5pbnZhbGlkYXRlX3NlcQo+ID4gKwkgKiAgICBzcGlu X3VubG9jawo+ID4gKwkgKgo+ID4gKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1c2VyX2xvY2sKPiA+ICsJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG1tdV9yYW5nZV9yZWFkX3JldHJ5KCk6Cj4gPiArCSAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJuLT5pbnZhbGlkYXRlX3NlcSAhPSBzZXEKPiA+ ICsJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl91bmxvY2sK PiA+ICsJICoKPiA+ICsJICogQmFycmllcnMgYXJlIG5vdCBuZWVkZWQgaGVyZSBhcyBhbnkgcmFj ZXMgaGVyZSBhcmUgY2xvc2VkIGJ5IGFuCj4gPiArCSAqIGV2ZW50dWFsIG1tdV9yYW5nZV9yZWFk X3JldHJ5KCksIHdoaWNoIHByb3ZpZGVzIGEgYmFycmllciB2aWEgdGhlCj4gPiArCSAqIHVzZXJf bG9jay4KPiA+ICsJICovCj4gPiArCXNwaW5fbG9jaygmbW1uX21tLT5sb2NrKTsKPiA+ICsJLyog UGFpcnMgd2l0aCB0aGUgV1JJVEVfT05DRSBpbiBtbXVfcmFuZ2Vfc2V0X3NlcSgpICovCj4gPiAr CXNlcSA9IFJFQURfT05DRShtcm4tPmludmFsaWRhdGVfc2VxKTsKPiA+ICsJaXNfaW52YWxpZGF0 aW5nID0gc2VxID09IG1tbl9tbS0+aW52YWxpZGF0ZV9zZXE7Cj4gPiArCXNwaW5fdW5sb2NrKCZt bW5fbW0tPmxvY2spOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBtcm4tPmludmFsaWRhdGVfc2Vx IGlzIGFsd2F5cyBzZXQgdG8gYW4gb2RkIHZhbHVlLiBUaGlzIGVuc3VyZXMKPiAKPiBUaGlzIGNs YWltIGp1c3QgbG9va3Mgd3JvbmcgdGhlIGZpcnN0IE4gdGltZXMgb25lIHJlYWRzIHRoZSBjb2Rl LCBnaXZlbiB0aGF0Cj4gdGhlcmUgaXMgbW11X3JhbmdlX3NldF9zZXEoKSB0byBzZXQgaXQgdG8g YW4gYXJiaXRyYXJ5IHZhbHVlISAgTWF5YmUgeW91IG1lYW4KPiAKPiAiaXMgYWx3YXlzIHNldCB0 byBhbiBvZGQgdmFsdWUgd2hlbiBpbnZhbGlkYXRpbmciPz8KCk5vIGl0IGlzIGFsd2F5cyBvZGQs IHlvdSBtdXN0IGNhbGwgbW11X3JhbmdlX3NldF9zZXEoKSBvbmx5IGZyb20gdGhlCm9wLT5pbnZh bGlkYXRlX3JhbmdlKCkgY2FsbGJhY2sgYXQgd2hpY2ggcG9pbnQgdGhlIHNlcSBpcyBvZGQuIEFz IHdlbGwKd2hlbiBtcm4gaXMgYWRkZWQgYW5kIGl0cyBzZXEgZmlyc3Qgc2V0IGl0IGlzIHNldCB0 byBhbiBvZGQgdmFsdWUKYWx3YXlzLiBNYXliZSB0aGUgY29tbWVudCwgc2hvdWxkIHJlYWQ6Cgog KiBtcm4tPmludmFsaWRhdGVfc2VxIGlzIGFsd2F5cywgeWVzIGFsd2F5cywgc2V0IHRvIGFuIG9k ZCB2YWx1ZS4gVGhpcyBlbnN1cmVzCgpUbyBzdHJlc3MgdGhhdCBpdCBpcyBub3QgYW4gZXJyb3Iu Cgo+IAo+ID4gKwkgKiB0aGF0IGlmIHNlcSBkb2VzIHdyYXAgd2Ugd2lsbCBhbHdheXMgY2xlYXIg dGhlIGJlbG93IHNsZWVwIGluIHNvbWUKPiA+ICsJICogcmVhc29uYWJsZSB0aW1lIGFzIG1tbl9t bS0+aW52YWxpZGF0ZV9zZXEgaXMgZXZlbiBpbiB0aGUgaWRsZQo+ID4gKwkgKiBzdGF0ZS4KPiA+ ICsJICovCj4gCj4gTGV0J3MgbW92ZSB0aGF0IGNvbW1lbnQgaGlnaGVyIHVwLiBUaGUgY29kZSB0 aGF0IGZvbGxvd3MgaXQgaGFzIG5vdGhpbmcgdG8KPiBkbyB3aXRoIGl0LCBzbyBpdCdzIGNvbmZ1 c2luZyBoZXJlLgoKTm8gdGhlIGNvbW1lbnQgaXMgaW4gdGhlIHJpZ2h0IHBsYWNlLCB0aGUgZmFj dCB0aGF0IGl0IGlzIG9kZCBhbmQgdGhhdAppZGxlIHN0YXRlIGlzIGV2ZW4gZXhwbGFpbnMgd2h5 IHRoZSB3YWl0KCkgd2lsbCBuZXZlciBsYXN0IGZvcmV2ZXIuCkFscmVhZHkgaGFkIGEgZGlzY3Vz c2lvbiBvbiB0aGlzIGluIHYxLgoKWy4uLl0KCj4gPiArCS8qCj4gPiArCSAqIElmIHNvbWUgaW52 YWxpZGF0ZV9yYW5nZV9zdGFydC9lbmQgcmVnaW9uIGlzIGdvaW5nIG9uIGluIHBhcmFsbGVsCj4g PiArCSAqIHdlIGRvbid0IGtub3cgd2hhdCBWQSByYW5nZXMgYXJlIGFmZmVjdGVkLCBzbyB3ZSBt dXN0IGFzc3VtZSB0aGlzCj4gPiArCSAqIG5ldyByYW5nZSBpcyBpbmNsdWRlZC4KPiA+ICsJICoK PiA+ICsJICogSWYgdGhlIGl0cmVlIGlzIGludmFsaWRhdGluZyB0aGVuIHdlIGFyZSBub3QgYWxs b3dlZCB0byBjaGFuZ2UKPiA+ICsJICogaXQuIFJldHJ5aW5nIHVudGlsIGludmFsaWRhdGlvbiBp cyBkb25lIGlzIHRyaWNreSBkdWUgdG8gdGhlCj4gPiArCSAqIHBvc3NpYmlsaXR5IGZvciBsaXZl IGxvY2ssIGluc3RlYWQgZGVmZXIgdGhlIGFkZCB0byB0aGUgdW5sb2NrIHNvCj4gPiArCSAqIHRo aXMgYWxnb3JpdGhtIGlzIGRldGVybWluaXN0aWMuCj4gPiArCSAqCj4gPiArCSAqIEluIGFsbCBj YXNlcyB0aGUgdmFsdWUgZm9yIHRoZSBtcm4tPm1yX2ludmFsaWRhdGVfc2VxIHNob3VsZCBiZQo+ ID4gKwkgKiBvZGQsIHNlZSBtbXVfcmFuZ2VfcmVhZF9iZWdpbigpCj4gPiArCSAqLwo+ID4gKwlz cGluX2xvY2soJm1tbl9tbS0+bG9jayk7Cj4gPiArCWlmIChtbW5fbW0tPmFjdGl2ZV9pbnZhbGlk YXRlX3Jhbmdlcykgewo+ID4gKwkJaWYgKG1uX2l0cmVlX2lzX2ludmFsaWRhdGluZyhtbW5fbW0p KQo+ID4gKwkJCWhsaXN0X2FkZF9oZWFkKCZtcm4tPmRlZmVycmVkX2l0ZW0sCj4gPiArCQkJCSAg ICAgICAmbW1uX21tLT5kZWZlcnJlZF9saXN0KTsKPiA+ICsJCWVsc2Ugewo+ID4gKwkJCW1tbl9t bS0+aW52YWxpZGF0ZV9zZXEgfD0gMTsKPiA+ICsJCQlpbnRlcnZhbF90cmVlX2luc2VydCgmbXJu LT5pbnRlcnZhbF90cmVlLAo+ID4gKwkJCQkJICAgICAmbW1uX21tLT5pdHJlZSk7Cj4gPiArCQl9 Cj4gPiArCQltcm4tPmludmFsaWRhdGVfc2VxID0gbW1uX21tLT5pbnZhbGlkYXRlX3NlcTsKPiA+ ICsJfSBlbHNlIHsKPiA+ICsJCVdBUk5fT04obW5faXRyZWVfaXNfaW52YWxpZGF0aW5nKG1tbl9t bSkpOwo+ID4gKwkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9IG1tbl9tbS0+aW52YWxpZGF0ZV9zZXEg LSAxOwo+IAo+IE9oaGgsIGNoZWNrbWF0ZS4gSSBsb3NlLiBXaHkgaXMgKnN1YnRyYWN0aW5nKiB0 aGUgcmlnaHQgdGhpbmcgdG8gZG8KPiBmb3Igc2VxIG51bWJlcnMgaGVyZT8gIEknbSBhY3V0ZWx5 IHVuaGFwcHkgdHJ5aW5nIHRvIGZpZ3VyZSB0aGlzIG91dC4KPiBJIHN1c3BlY3QgaXQncyBhbm90 aGVyIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IG9mIHRyeWluZyB0byB1c2UgdGhlCj4gbG93ZXIg Yml0IG9mIHRoZSBzZXEgbnVtYmVyIChldmVuL29kZCkgZm9yIHNvbWV0aGluZyBlbHNlLgoKSWYg dGhlcmUgaXMgbm8gbW1uX21tLT5hY3RpdmVfaW52YWxpZGF0ZV9yYW5nZXMgdGhlbiBpdCBtZWFu cyB0aGF0Cm1tbl9tbS0+aW52YWxpZGF0ZV9zZXEgaXMgZXZlbiBhbmQgdGh1cyBtbW5fbW0tPmlu dmFsaWRhdGVfc2VxIC0gMQppcyBhbiBvZGQgbnVtYmVyIHdoaWNoIG1lYW5zIHRoYXQgbXJuLT5p bnZhbGlkYXRlX3NlcSBpcyBpbml0aWFsaXplZAp0byBvZGQgdmFsdWUgYW5kIGlmIHlvdSBmb2xs b3cgdGhlIHJ1bGUgZm9yIGNhbGxpbmcgbW11X3JhbmdlX3NldF9zZXEoKQp0aGVuIGl0IHdpbGwg X2Fsd2F5c18gYmUgYW4gb2RkIG51bWJlciBhbmQgdGhpcyBjbG9zZSB0aGUgbG9vcCB3aXRoCnRo ZSBhYm92ZSBjb21tZW50cyA6KQoKPiAKPiA+ICsJCWludGVydmFsX3RyZWVfaW5zZXJ0KCZtcm4t PmludGVydmFsX3RyZWUsICZtbW5fbW0tPml0cmVlKTsKPiA+ICsJfQo+ID4gKwlzcGluX3VubG9j aygmbW1uX21tLT5sb2NrKTsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gKy8qKgo+ ID4gKyAqIG1tdV9yYW5nZV9ub3RpZmllcl9pbnNlcnQgLSBJbnNlcnQgYSByYW5nZSBub3RpZmll cgo+ID4gKyAqIEBtcm46IFJhbmdlIG5vdGlmaWVyIHRvIHJlZ2lzdGVyCj4gPiArICogQHN0YXJ0 OiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3MgdG8gbW9uaXRvcgo+ID4gKyAqIEBsZW5ndGg6IExl bmd0aCBvZiB0aGUgcmFuZ2UgdG8gbW9uaXRvcgo+ID4gKyAqIEBtbSA6IG1tX3N0cnVjdCB0byBh dHRhY2ggdG8KPiA+ICsgKgo+ID4gKyAqIFRoaXMgZnVuY3Rpb24gc3Vic2NyaWJlcyB0aGUgcmFu Z2Ugbm90aWZpZXIgZm9yIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgbW0uCj4gPiArICogVXBvbiBy ZXR1cm4gdGhlIG9wcyByZWxhdGVkIHRvIG1tdV9yYW5nZV9ub3RpZmllciB3aWxsIGJlIGNhbGxl ZCB3aGVuZXZlcgo+ID4gKyAqIGFuIGV2ZW50IHRoYXQgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZl biByYW5nZSBvY2N1cnMuCj4gPiArICoKPiA+ICsgKiBVcG9uIHJldHVybiB0aGUgcmFuZ2Vfbm90 aWZpZXIgbWF5IG5vdCBiZSBwcmVzZW50IGluIHRoZSBpbnRlcnZhbCB0cmVlIHlldC4KPiA+ICsg KiBUaGUgY2FsbGVyIG11c3QgdXNlIHRoZSBub3JtYWwgcmFuZ2Ugbm90aWZpZXIgbG9ja2luZyBm bG93IHZpYQo+ID4gKyAqIG1tdV9yYW5nZV9yZWFkX2JlZ2luKCkgdG8gZXN0YWJsaXNoIFNQVEVz IGZvciB0aGlzIHJhbmdlLgo+ID4gKyAqLwo+ID4gK2ludCBtbXVfcmFuZ2Vfbm90aWZpZXJfaW5z ZXJ0KHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiA+ICsJCQkgICAgICB1bnNpZ25l ZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbmd0aCwKPiA+ICsJCQkgICAgICBzdHJ1Y3Qg bW1fc3RydWN0ICptbSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBtbXVfbm90aWZpZXJfbW0gKm1tbl9t bTsKPiA+ICsJaW50IHJldDsKPiAKPiBIbW1tLCBJIHRoaW5rIGEgbGF0ZXIgcGF0Y2ggaW1wcm9w ZXJseSBjaGFuZ2VzIHRoZSBhYm92ZSB0byAiaW50IHJldCA9IDA7Ii4KPiBJJ2xsIGNoZWNrIG9u IHRoYXQuIEl0J3MgY29ycmVjdCBoZXJlLCB0aG91Z2guCj4gCj4gPiArCj4gPiArCW1pZ2h0X2xv Y2soJm1tLT5tbWFwX3NlbSk7Cj4gPiArCj4gPiArCW1tbl9tbSA9IHNtcF9sb2FkX2FjcXVpcmUo Jm1tLT5tbXVfbm90aWZpZXJfbW0pOwo+IAo+IFdoYXQgZG9lcyB0aGUgYWJvdmUgcGFpciB3aXRo PyBTaG91bGQgaGF2ZSBhIGNvbW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhhdC4KCkl0IHdhcyBkaXNj dXNzZWQgaW4gdjEgYnV0IG1heWJlIGEgY29tbWVudCBvZiB3aGF0IHdhcyBzYWlkIGJhY2sgdGhl biB3b3VsZApiZSBoZWxwZnVsLiBTb21ldGhpbmcgbGlrZToKCi8qCiAqIFdlIG5lZWQgdG8gaW5z dXJlIHRoYXQgYWxsIHdyaXRlcyB0byBtbS0+bW11X25vdGlmaWVyX21tIGFyZSB2aXNpYmxlIGJl Zm9yZQogKiBhbnkgY2hlY2tzIHdlIGRvIG9uIG1tbl9tbSBiZWxvdyBhcyBvdGhlcndpc2UgQ1BV IG1pZ2h0IHJlLW9yZGVyIHdyaXRlIGRvbmUKICogYnkgYW5vdGhlciBDUFUgY29yZSB0byBtbS0+ bW11X25vdGlmaWVyX21tIHN0cnVjdHVyZSBmaWVsZHMgYWZ0ZXIgdGhlIHJlYWQKICogYmVsb3dz LgogKi8KCkNoZWVycywKSsOpcsO0bWUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f 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=-2.0 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D825CFA372C for ; Thu, 7 Nov 2019 02:09:03 +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 9262C217D7 for ; Thu, 7 Nov 2019 02:09:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="a9csM+Xn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9262C217D7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.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 1iSXDl-0006qu-SQ; Thu, 07 Nov 2019 02:08:25 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iSXDk-0006qp-IV for xen-devel@lists.xenproject.org; Thu, 07 Nov 2019 02:08:24 +0000 X-Inumbo-ID: 78607fda-0103-11ea-984a-bc764e2007e4 Received: from us-smtp-delivery-1.mimecast.com (unknown [207.211.31.81]) by us1-rack-iad1.inumbo.com (Halon) with ESMTP id 78607fda-0103-11ea-984a-bc764e2007e4; Thu, 07 Nov 2019 02:08:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1573092500; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3pEC4ofbH9GmBg4Hvo6IdX7Sd6lzjmsN2FQ75gU3Q+g=; b=a9csM+XnEOWcmFZyPqDkd6JsfS4P3nA5dQEcCTCMlId/XJi0a93YJEVJpnND3vWT/NTij4 m4VUWxr/AFL2X+1jjItewD6THtHvzX74gH4ZoL/R7r+SkOH8wiq341xIiDnyUxvHMcAUG1 DX1wl0kZPZ+P789j7NpEZrh1nDgQ6ig= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-251-vYaKpkspMBqRrJUS4jgCJw-1; Wed, 06 Nov 2019 21:08:16 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8F5831005502; Thu, 7 Nov 2019 02:08:13 +0000 (UTC) Received: from redhat.com (ovpn-125-216.rdu2.redhat.com [10.10.125.216]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 04F095C299; Thu, 7 Nov 2019 02:08:09 +0000 (UTC) Date: Wed, 6 Nov 2019 21:08:07 -0500 From: Jerome Glisse To: John Hubbard Message-ID: <20191107020807.GA747656@redhat.com> References: <20191028201032.6352-1-jgg@ziepe.ca> <20191028201032.6352-3-jgg@ziepe.ca> <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> MIME-Version: 1.0 In-Reply-To: <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> User-Agent: Mutt/1.12.1 (2019-06-15) X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-MC-Unique: vYaKpkspMBqRrJUS4jgCJw-1 X-Mimecast-Spam-Score: 0 Content-Disposition: inline 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 , Jason Gunthorpe , Jason Gunthorpe , Ben Skeggs , xen-devel@lists.xenproject.org, Ralph Campbell , Boris Ostrovsky , Petr Cvek , Juergen Gross , Mike Marciniszyn , Dennis Dalessandro , Christian =?iso-8859-1?Q?K=F6nig?= , Alex Deucher , Felix.Kuehling@amd.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" T24gV2VkLCBOb3YgMDYsIDIwMTkgYXQgMDQ6MjM6MjFQTSAtMDgwMCwgSm9obiBIdWJiYXJkIHdy b3RlOgo+IE9uIDEwLzI4LzE5IDE6MTAgUE0sIEphc29uIEd1bnRob3JwZSB3cm90ZToKClsuLi5d Cgo+ID4gIC8qKgo+ID4gICAqIGVudW0gbW11X25vdGlmaWVyX2V2ZW50IC0gcmVhc29uIGZvciB0 aGUgbW11IG5vdGlmaWVyIGNhbGxiYWNrCj4gPiBAQCAtMzIsNiArMzQsOSBAQCBzdHJ1Y3QgbW11 X25vdGlmaWVyX3JhbmdlOwo+ID4gICAqIGFjY2VzcyBmbGFncykuIFVzZXIgc2hvdWxkIHNvZnQg ZGlydHkgdGhlIHBhZ2UgaW4gdGhlIGVuZCBjYWxsYmFjayB0byBtYWtlCj4gPiAgICogc3VyZSB0 aGF0IGFueW9uZSByZWx5aW5nIG9uIHNvZnQgZGlydHluZXNzIGNhdGNoIHBhZ2VzIHRoYXQgbWln aHQgYmUgd3JpdHRlbgo+ID4gICAqIHRocm91Z2ggbm9uIENQVSBtYXBwaW5ncy4KPiA+ICsgKgo+ ID4gKyAqIEBNTVVfTk9USUZZX1JFTEVBU0U6IHVzZWQgZHVyaW5nIG1tdV9yYW5nZV9ub3RpZmll ciBpbnZhbGlkYXRlIHRvIHNpZ25hbCB0aGF0Cj4gPiArICogdGhlIG1tIHJlZmNvdW50IGlzIHpl cm8gYW5kIHRoZSByYW5nZSBpcyBubyBsb25nZXIgYWNjZXNzaWJsZS4KPiA+ICAgKi8KPiA+ICBl bnVtIG1tdV9ub3RpZmllcl9ldmVudCB7Cj4gPiAgCU1NVV9OT1RJRllfVU5NQVAgPSAwLAo+ID4g QEAgLTM5LDYgKzQ0LDcgQEAgZW51bSBtbXVfbm90aWZpZXJfZXZlbnQgewo+ID4gIAlNTVVfTk9U SUZZX1BST1RFQ1RJT05fVk1BLAo+ID4gIAlNTVVfTk9USUZZX1BST1RFQ1RJT05fUEFHRSwKPiA+ ICAJTU1VX05PVElGWV9TT0ZUX0RJUlRZLAo+ID4gKwlNTVVfTk9USUZZX1JFTEVBU0UsCj4gPiAg fTsKPiAKPiAKPiBPSywgbGV0IHRoZSBuYW1pbmcgZGViYXRlcyBiZWdpbiEgaGEuIEFueXdheSwg YWZ0ZXIgY2FyZWZ1bCBzdHVkeSBvZiB0aGUgb3ZlcmFsbAo+IHBhdGNoLCBhbmQgc29tZSBicm93 c2luZyBvZiB0aGUgbGFyZ2VyIHBhdGNoc2V0LCBpdCdzIGNsZWFyIHRoYXQ6Cj4gCj4gKiBUaGUg bmV3ICJNTVUgcmFuZ2Ugbm90aWZpZXIiIHRoYXQgeW91J3ZlIGNyZWF0ZWQgaXMsIGFwcHJveGlt YXRlbHksIGEgbmV3Cj4gb2JqZWN0LiBJdCB1c2VzIGNsYXNzaWMgbW11IG5vdGlmaWVycyBpbnNp ZGUsIGFzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgYW5kCj4gaXQgZG9lcyAqc2ltaWxhciog dGhpbmdzIChub3RpZmljYXRpb25zKSBhcyBtbW4ncy4gQnV0IGl0J3MgY2VydGFpbmx5IG5vdCB0 aGUgc2FtZQo+IGFzIG1tbidzLCBhcyBzaG93biBsYXRlciB3aGVuIHlvdSBzYXkgdGhlIG5lZWQg dG8gYW4gZW50aXJlbHkgbmV3IG9wcyBzdHJ1Y3QsIGFuZCAKPiBkYXRhIHN0cnVjdCB0b28uCj4g Cj4gVGhlcmVmb3JlLCB5b3UgbmVlZCBhIHNlcGFyYXRlIGV2ZW50cyBlbnVtIGFzIHdlbGwuIFRo aXMgaXMgaW1wb3J0YW50LiBNTU4ncwo+IHdvbid0IGJlIGlzc3VpbmcgTU1OX05PVElGWV9SRUxF QVNFIGV2ZW50cywgbm9yIHdpbGwgTU5SJ3MgYmUgaXNzdWluZyB0aGUgZmlyc3QKPiBmb3VyIHBy ZXhpc3RpbmcgTU1VX05PVElGWV8qIGl0ZW1zLiBTbyBpdCB3b3VsZCBiZSBhIGRlc2lnbiBtaXN0 YWtlIHRvIGdsb20gdGhlbQo+IHRvZ2V0aGVyLCB1bmxlc3MgeW91IHVsdGltYXRlbHkgZGVjaWRl ZCB0byBtZXJnZSB0aGVzZSBNTU4gYW5kIE1OUiBvYmplY3RzICh3aGljaAo+IEkgZG9uJ3QgcmVh bGx5IHNlZSBhbnkgaW50ZW50aW9uIG9mLCBhbmQgdGhhdCdzIGZpbmUpLgo+IAo+IFNvIHRoaXMg c2hvdWxkIHJlYWQ6Cj4gCj4gZW51bSBtbXVfcmFuZ2Vfbm90aWZpZXJfZXZlbnQgewo+IAlNTVVf Tk9USUZZX1JFTEVBU0UsCj4gfTsKPiAKPiAuLi5hc3N1bWluZyB0aGF0IHdlIHN0YXkgd2l0aCAi bW11X3JhbmdlX25vdGlmaWVyIiBhcyBhIGNvcmUgbmFtZSBmb3IgdGhpcyAKPiB3aG9sZSB0aGlu Zy4KPiAKPiBBbHNvLCBpdCBpcyBiZXN0IG1vdmVkIGRvd24gdG8gYmUgbmV4dCB0byB0aGUgbmV3 IE1OUiBzdHJ1Y3RzLCBzbyB0aGF0IGFsbCB0aGUKPiBNTlIgc3R1ZmYgaXMgaW4gb25lIGdyb3Vw Lgo+IAo+IEV4dHJhIGNyZWRpdDogSU1ITywgdGhpcyBjbGVhcmx5IGRlc2VydmVzIHRvIGFsbCBi ZSBpbiBhIG5ldyBtbXVfcmFuZ2Vfbm90aWZpZXIuaAo+IGhlYWRlciBmaWxlLCBidXQgSSBrbm93 IHRoYXQncyBleHRyYSB3b3JrLiBNYXliZSBsYXRlciBhcyBhIGZvbGxvdy11cCBwYXRjaCwKPiBp ZiBhbnlvbmUgaGFzIHRoZSB0aW1lLgoKVGhlIHJhbmdlIG5vdGlmaWVyIHNob3VsZCBnZXQgdGhl IGV2ZW50IHRvbywgaXQgd291bGQgYmUgYSB3YXN0ZSwgaSB0aGluayBpdCBpcwphbiBvdmVyc2ln aHQgaGVyZS4gVGhlIHJlbGVhc2UgZXZlbnQgaXMgZmluZSBzbyBOQUsgdG8geW91IHNlcGFyYXRl IGV2ZW50LiBFdmVudAppcyByZWFsbHkgYW4gaGVscGVyIGZvciBub3RpZmllciBpIGhhZCBhIHNl dCBvZiBwYXRjaCBmb3Igbm91dmVhdSB0byBsZXZlcmFnZQp0aGlzIGkgbmVlZCB0byByZXN1Y2l0 ZSB0aGVtLiBTbyBubyBuZWVkIHRvIHNwbGl0IHRoaW5nLCBpIHdvdWxkIGp1c3QgZm9yd2FyZAp0 aGUgZXZlbnQgaWUgYWRkIGV2ZW50IHRvIG1tdV9yYW5nZV9ub3RpZmllcl9vcHMuaW52YWxpZGF0 ZSgpIGkgZmFpbGVkIHRvIGNhdGNoCnRoYXQgaW4gdjEgc29ycnkuCgoKWy4uLl0KCj4gPiArc3Ry dWN0IG1tdV9yYW5nZV9ub3RpZmllcl9vcHMgewo+ID4gKwlib29sICgqaW52YWxpZGF0ZSkoc3Ry dWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuLAo+ID4gKwkJCSAgIGNvbnN0IHN0cnVjdCBtbXVf bm90aWZpZXJfcmFuZ2UgKnJhbmdlLAo+ID4gKwkJCSAgIHVuc2lnbmVkIGxvbmcgY3VyX3NlcSk7 Cj4gPiArfTsKPiA+ICsKPiA+ICtzdHJ1Y3QgbW11X3JhbmdlX25vdGlmaWVyIHsKPiA+ICsJc3Ry dWN0IGludGVydmFsX3RyZWVfbm9kZSBpbnRlcnZhbF90cmVlOwo+ID4gKwljb25zdCBzdHJ1Y3Qg bW11X3JhbmdlX25vdGlmaWVyX29wcyAqb3BzOwo+ID4gKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZWZl cnJlZF9pdGVtOwo+ID4gKwl1bnNpZ25lZCBsb25nIGludmFsaWRhdGVfc2VxOwo+ID4gKwlzdHJ1 Y3QgbW1fc3RydWN0ICptbTsKPiA+ICt9Owo+ID4gKwo+IAo+IEFnYWluLCBub3cgd2UgaGF2ZSB0 aGUgbmV3IHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIsIGFuZCB0aGUgb2xkIAo+IHN0cnVjdCBt bXVfbm90aWZpZXJfcmFuZ2UsIGFuZCBpdCdzIG5vdCBnb29kLgo+IAo+IElkZWFzOgo+IAo+IGEp IExpdmUgd2l0aCBpdC4KPiAKPiBiKSAoRGlzY2FyZGVkLCB0b28gbWFueSBjYWxsZXJzKTogcmVu YW1lIG9sZCBvbmUuIE5vcGUuCj4gCj4gYykgUmVuYW1lIG5ldyBvbmUuIElkZWFzOgo+IAo+ICAg ICBzdHJ1Y3QgbW11X2ludGVydmFsX25vdGlmaWVyCj4gICAgIHN0cnVjdCBtbXVfcmFuZ2VfaW50 ZXJzZWN0aW9uCj4gICAgIC4uLm90aGVyIGlkZWFzPwoKSSB2b3RlIGZvciBpbnRlcnZhbF9ub3Rp ZmllciB3ZSBkbyB3YW50IG5vdGlmaWVyIGluIG5hbWUgYnV0IGkgYW0gYWxzbwpmaW5lIHdpdGgg Y3VycmVudCBuYW1lLgoKWy4uLl0KCj4gPiArICoKPiA+ICsgKiBOb3RlIHRoYXQgdGhlIGNvcmUg bW0gY3JlYXRlcyBuZXN0ZWQgaW52YWxpZGF0ZV9yYW5nZV9zdGFydCgpL2VuZCgpIHJlZ2lvbnMK PiA+ICsgKiB3aXRoaW4gdGhlIHNhbWUgdGhyZWFkLCBhbmQgcnVucyBpbnZhbGlkYXRlX3Jhbmdl X3N0YXJ0KCkvZW5kKCkgaW4gcGFyYWxsZWwKPiA+ICsgKiBvbiBtdWx0aXBsZSBDUFVzLiBUaGlz IGlzIGRlc2lnbmVkIHRvIG5vdCByZWR1Y2UgY29uY3VycmVuY3kgb3IgYmxvY2sKPiA+ICsgKiBw cm9ncmVzcyBvbiB0aGUgbW0gc2lkZS4KPiA+ICsgKgo+ID4gKyAqIEFzIGEgc2Vjb25kYXJ5IGZ1 bmN0aW9uLCBob2xkaW5nIHRoZSBmdWxsIHdyaXRlIHNpZGUgYWxzbyBzZXJ2ZXMgdG8gcHJldmVu dAo+ID4gKyAqIHdyaXRlcnMgZm9yIHRoZSBpdHJlZSwgdGhpcyBpcyBhbiBvcHRpbWl6YXRpb24g dG8gYXZvaWQgZXh0cmEgbG9ja2luZwo+ID4gKyAqIGR1cmluZyBpbnZhbGlkYXRlX3JhbmdlX3N0 YXJ0L2VuZCBub3RpZmllcnMuCj4gPiArICoKPiA+ICsgKiBUaGUgd3JpdGUgc2lkZSBoYXMgdHdv IHN0YXRlcywgZnVsbHkgZXhjbHVkZWQ6Cj4gPiArICogIC0gbW0tPmFjdGl2ZV9pbnZhbGlkYXRl X3JhbmdlcyAhPSAwCj4gPiArICogIC0gbW5uLT5pbnZhbGlkYXRlX3NlcSAmIDEgPT0gVHJ1ZQo+ ID4gKyAqICAtIHNvbWUgcmFuZ2Ugb24gdGhlIG1tX3N0cnVjdCBpcyBiZWluZyBpbnZhbGlkYXRl ZAo+ID4gKyAqICAtIHRoZSBpdHJlZSBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UKPiA+ICsgKgo+ ID4gKyAqIEFuZCBwYXJ0aWFsbHkgZXhjbHVkZWQ6Cj4gPiArICogIC0gbW0tPmFjdGl2ZV9pbnZh bGlkYXRlX3JhbmdlcyAhPSAwCj4gCj4gSSBhc3N1bWUgdGhpcyBpbXBsaWVzIG1ubi0+aW52YWxp ZGF0ZV9zZXEgJiAxID09IEZhbHNlIGluIHRoaXMgY2FzZT8gSWYgc28sCj4gbGV0J3Mgc2F5IHNv LiBJJ20gcHJvYmFibHkgZ2V0dGluZyB0aGF0IHdyb25nLCB0b28uCgpZZXMgKG1ubi0+aW52YWxp ZGF0ZV9zZXEgJiAxKSA9PSAwCgo+IAo+ID4gKyAqICAtIHNvbWUgcmFuZ2Ugb24gdGhlIG1tX3N0 cnVjdCBpcyBiZWluZyBpbnZhbGlkYXRlZAo+ID4gKyAqICAtIHRoZSBpdHJlZSBpcyBhbGxvd2Vk IHRvIGNoYW5nZQo+ID4gKyAqCj4gPiArICogVGhlIGxhdGVyIHN0YXRlIGF2b2lkcyBzb21lIGV4 cGVuc2l2ZSB3b3JrIG9uIGludl9lbmQgaW4gdGhlIGNvbW1vbiBjYXNlIG9mCj4gPiArICogbm8g bXJuIG1vbml0b3JpbmcgdGhlIFZBLgo+ID4gKyAqLwo+ID4gK3N0YXRpYyBib29sIG1uX2l0cmVl X2lzX2ludmFsaWRhdGluZyhzdHJ1Y3QgbW11X25vdGlmaWVyX21tICptbW5fbW0pCj4gPiArewo+ ID4gKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtbW5fbW0tPmxvY2spOwo+ID4gKwlyZXR1cm4gbW1u X21tLT5pbnZhbGlkYXRlX3NlcSAmIDE7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3Qg bW11X3JhbmdlX25vdGlmaWVyICoKPiA+ICttbl9pdHJlZV9pbnZfc3RhcnRfcmFuZ2Uoc3RydWN0 IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tLAo+ID4gKwkJCSBjb25zdCBzdHJ1Y3QgbW11X25vdGlm aWVyX3JhbmdlICpyYW5nZSwKPiA+ICsJCQkgdW5zaWduZWQgbG9uZyAqc2VxKQo+ID4gK3sKPiA+ ICsJc3RydWN0IGludGVydmFsX3RyZWVfbm9kZSAqbm9kZTsKPiA+ICsJc3RydWN0IG1tdV9yYW5n ZV9ub3RpZmllciAqcmVzID0gTlVMTDsKPiA+ICsKPiA+ICsJc3Bpbl9sb2NrKCZtbW5fbW0tPmxv Y2spOwo+ID4gKwltbW5fbW0tPmFjdGl2ZV9pbnZhbGlkYXRlX3JhbmdlcysrOwo+ID4gKwlub2Rl ID0gaW50ZXJ2YWxfdHJlZV9pdGVyX2ZpcnN0KCZtbW5fbW0tPml0cmVlLCByYW5nZS0+c3RhcnQs Cj4gPiArCQkJCQlyYW5nZS0+ZW5kIC0gMSk7Cj4gPiArCWlmIChub2RlKSB7Cj4gPiArCQltbW5f bW0tPmludmFsaWRhdGVfc2VxIHw9IDE7Cj4gCj4gCj4gT0ssIHRoaXMgZWl0aGVyIG5lZWRzIG1v cmUgZG9jdW1lbnRhdGlvbiBhbmQgYXNzZXJ0aW9ucywgb3IgYSBkaWZmZXJlbnQKPiBhcHByb2Fj aC4gQmVjYXVzZSBJIHNlZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIEFORCwgT1IgYW5kIGJvb2xl YW5zCj4gYWxsIGJlaW5nIGFwcGxpZWQgdG8gdGhpcyBmaWVsZCwgYW5kIGl0J3MgZGFybiBuZWFy IGhvcGVsZXNzIHRvIGZpZ3VyZQo+IG91dCB3aGV0aGVyIG9yIG5vdCBpdCByZWFsbHkgaXMgZXZl biBvciBvZGQgYXQgdGhlIHJpZ2h0IHRpbWVzLgo+IAo+IERpZmZlcmVudCBhcHByb2FjaDogd2h5 IG5vdCBqdXN0IGFkZCBhIG1tbl9tbS0+aXNfaW52YWxpZGF0aW5nIAo+IG1lbWJlciB2YXJpYWJs ZT8gSXQncyBub3QgbGlrZSB5b3UncmUgc2hvcnQgb2Ygc3BhY2UgaW4gdGhhdCBzdHJ1Y3QuCgpU aGUgaW52YWxpZGF0ZV9zZXEgc2NoZW1lIGxvb2tzIGZpbmUgdG8gbWUsIG1heWJlIGl0IGNhbiB1 c2UgbW9yZSBjb21tZW50cy4KCgo+IAo+IAo+ID4gKwkJcmVzID0gY29udGFpbmVyX29mKG5vZGUs IHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIsCj4gPiArCQkJCSAgIGludGVydmFsX3RyZWUpOwo+ ID4gKwl9Cj4gPiArCj4gPiArCSpzZXEgPSBtbW5fbW0tPmludmFsaWRhdGVfc2VxOwo+ID4gKwlz cGluX3VubG9jaygmbW1uX21tLT5sb2NrKTsKPiA+ICsJcmV0dXJuIHJlczsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKgo+ID4gK21uX2l0cmVlX2lu dl9uZXh0KHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiA+ICsJCSAgY29uc3Qgc3Ry dWN0IG1tdV9ub3RpZmllcl9yYW5nZSAqcmFuZ2UpCj4gPiArewo+ID4gKwlzdHJ1Y3QgaW50ZXJ2 YWxfdHJlZV9ub2RlICpub2RlOwo+ID4gKwo+ID4gKwlub2RlID0gaW50ZXJ2YWxfdHJlZV9pdGVy X25leHQoJm1ybi0+aW50ZXJ2YWxfdHJlZSwgcmFuZ2UtPnN0YXJ0LAo+ID4gKwkJCQkgICAgICAg cmFuZ2UtPmVuZCAtIDEpOwo+ID4gKwlpZiAoIW5vZGUpCj4gPiArCQlyZXR1cm4gTlVMTDsKPiA+ ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgbW11X3JhbmdlX25vdGlmaWVyLCBp bnRlcnZhbF90cmVlKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbW5faXRyZWVfaW52 X2VuZChzdHJ1Y3QgbW11X25vdGlmaWVyX21tICptbW5fbW0pCj4gPiArewo+ID4gKwlzdHJ1Y3Qg bW11X3JhbmdlX25vdGlmaWVyICptcm47Cj4gPiArCXN0cnVjdCBobGlzdF9ub2RlICpuZXh0Owo+ ID4gKwlib29sIG5lZWRfd2FrZSA9IGZhbHNlOwo+ID4gKwo+ID4gKwlzcGluX2xvY2soJm1tbl9t bS0+bG9jayk7Cj4gPiArCWlmICgtLW1tbl9tbS0+YWN0aXZlX2ludmFsaWRhdGVfcmFuZ2VzIHx8 Cj4gPiArCSAgICAhbW5faXRyZWVfaXNfaW52YWxpZGF0aW5nKG1tbl9tbSkpIHsKPiA+ICsJCXNw aW5fdW5sb2NrKCZtbW5fbW0tPmxvY2spOwo+ID4gKwkJcmV0dXJuOwo+ID4gKwl9Cj4gPiArCj4g PiArCW1tbl9tbS0+aW52YWxpZGF0ZV9zZXErKzsKPiAKPiBJcyB0aGlzIHRoZSByaWdodCBwbGFj ZSBmb3IgYW4gYXNzZXJ0aW9uIHRoYXQgdGhpcyBpcyBub3cgYW4gZXZlbiB2YWx1ZT8KClllcyBh dCB0aGF0IHBvaW50IGl0IHNob3VsZCBiZSBldmVuIGllIG1tbl9tbS0+YWN0aXZlX2ludmFsaWRh dGVfcmFuZ2VzID09IDAKYW5kIHdlIGFyZSBob2xkaW5nIHRoZSBsb2NrIHRodXMgbm90aGluZyBj YW4gc2V0IHRoZSBsb3dlciBiaXQgb2YgaW52YWxpZGF0ZV9zZXEKYW5kICsrIHNob3VsZCBsZWFk IHRvIGV2ZW4gbnVtYmVyLgoKPiAKPiA+ICsJbmVlZF93YWtlID0gdHJ1ZTsKPiA+ICsKPiA+ICsJ LyoKPiA+ICsJICogVGhlIGludl9lbmQgaW5jb3Jwb3JhdGVzIGEgZGVmZXJyZWQgbWVjaGFuaXNt IGxpa2UKPiA+ICsJICogcnRubF9sb2NrKCkuIEFkZHMgYW5kIHJlbW92ZXMgYXJlIHF1ZXVlZCB1 bnRpbCB0aGUgZmluYWwgaW52X2VuZAo+IAo+IExldCBtZSBwb2ludCBvdXQgdGhhdCBydG5sX2xv Y2soKSBpdHNlbGYgaXMgYSBvbmUtbGluZXIgdGhhdCBjYWxscyBtdXRleF9sb2NrKCkuCj4gQnV0 IEkgc3VwcG9zZSBpZiBvbmUgc3R1ZGllcyB0aGF0IGZpbGUgY2xvc2VseSB0aGVyZSBpcyBtb3Jl LiA6KQoKSSB0aGluayBpIGNvbW1lbnRlZCBpbiB2MSBhYm91dCBydG5sX2xvY2soKSBiZWluZyBz b21ldGhpbmcgbmV0d29yayBwZW9wbGUgb25seQptaWdodCBiZSBmYW1pbGlhciwgaSB0aGluayBp IHNhdyBpdCBkb2N1bWVudGVkIHNvbWV3aGVyZSwgbWF5YmUgYSBsd24gYXJ0aWNsZS4KQnV0IGlm IHlvdSBhcmUgZmFtaWxpYXIgd2l0aCBuZXR3b3JrIGl0IGlzIGEgdGhpbmsgd2VsbCB1bmRlcnN0 b29kIC4uLiBmb3IgYW55CnJlYXNvbmFibGUgbmV0d29yayBzY2hvbGFyIDspCgo+IC4uLgo+IAo+ ID4gK3Vuc2lnbmVkIGxvbmcgbW11X3JhbmdlX3JlYWRfYmVnaW4oc3RydWN0IG1tdV9yYW5nZV9u b3RpZmllciAqbXJuKQo+ID4gK3sKPiA+ICsJc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21t ID0gbXJuLT5tbS0+bW11X25vdGlmaWVyX21tOwo+ID4gKwl1bnNpZ25lZCBsb25nIHNlcTsKPiA+ ICsJYm9vbCBpc19pbnZhbGlkYXRpbmc7Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIElmIHRoZSBt cm4gaGFzIGEgZGlmZmVyZW50IHNlcSB2YWx1ZSB1bmRlciB0aGUgdXNlcl9sb2NrIHRoYW4gd2UK PiA+ICsJICogc3RhcnRlZCB3aXRoIHRoZW4gaXQgaGFzIGNvbGxpZGVkLgo+ID4gKwkgKgo+ID4g KwkgKiBJZiB0aGUgbXJuIGN1cnJlbnRseSBoYXMgdGhlIHNhbWUgc2VxIHZhbHVlIGFzIHRoZSBt bW5fbW0gc2VxLCB0aGVuCj4gPiArCSAqIGl0IGlzIGN1cnJlbnRseSBiZXR3ZWVuIGludmFsaWRh dGVfc3RhcnQvZW5kIGFuZCBpcyBjb2xsaWRpbmcuCj4gPiArCSAqCj4gPiArCSAqIFRoZSBsb2Nr aW5nIGxvb2tzIGJyb2FkbHkgbGlrZSB0aGlzOgo+ID4gKwkgKiAgIG1uX3RyZWVfaW52YWxpZGF0 ZV9zdGFydCgpOiAgICAgICAgICBtbXVfcmFuZ2VfcmVhZF9iZWdpbigpOgo+ID4gKwkgKiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrCj4gPiArCSAqICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxID0gUkVBRF9PTkNFKG1y bi0+aW52YWxpZGF0ZV9zZXEpOwo+ID4gKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNlcSA9PSBtbW5fbW0tPmludmFsaWRhdGVfc2VxCj4gPiArCSAqICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jawo+ID4gKwkgKiAg ICBzcGluX2xvY2sKPiA+ICsJICogICAgIHNlcSA9ICsrbW1uX21tLT5pbnZhbGlkYXRlX3NlcQo+ ID4gKwkgKiAgICBzcGluX3VubG9jawo+ID4gKwkgKiAgICAgb3AtPmludmFsaWRhdGVfcmFuZ2Uo KToKPiA+ICsJICogICAgICAgdXNlcl9sb2NrCj4gPiArCSAqICAgICAgICBtbXVfcmFuZ2Vfc2V0 X3NlcSgpCj4gPiArCSAqICAgICAgICAgbXJuLT5pbnZhbGlkYXRlX3NlcSA9IHNlcQo+ID4gKwkg KiAgICAgICB1c2VyX3VubG9jawo+ID4gKwkgKgo+ID4gKwkgKiAgICAgICAgICAgICAgICAgICAg ICAgICAgW1JlcXVpcmVkOiBtbXVfcmFuZ2VfcmVhZF9yZXRyeSgpID09IHRydWVdCj4gPiArCSAq Cj4gPiArCSAqICAgbW5faXRyZWVfaW52X2VuZCgpOgo+ID4gKwkgKiAgICBzcGluX2xvY2sKPiA+ ICsJICogICAgIHNlcSA9ICsrbW1uX21tLT5pbnZhbGlkYXRlX3NlcQo+ID4gKwkgKiAgICBzcGlu X3VubG9jawo+ID4gKwkgKgo+ID4gKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1c2VyX2xvY2sKPiA+ICsJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG1tdV9yYW5nZV9yZWFkX3JldHJ5KCk6Cj4gPiArCSAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJuLT5pbnZhbGlkYXRlX3NlcSAhPSBzZXEKPiA+ ICsJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl91bmxvY2sK PiA+ICsJICoKPiA+ICsJICogQmFycmllcnMgYXJlIG5vdCBuZWVkZWQgaGVyZSBhcyBhbnkgcmFj ZXMgaGVyZSBhcmUgY2xvc2VkIGJ5IGFuCj4gPiArCSAqIGV2ZW50dWFsIG1tdV9yYW5nZV9yZWFk X3JldHJ5KCksIHdoaWNoIHByb3ZpZGVzIGEgYmFycmllciB2aWEgdGhlCj4gPiArCSAqIHVzZXJf bG9jay4KPiA+ICsJICovCj4gPiArCXNwaW5fbG9jaygmbW1uX21tLT5sb2NrKTsKPiA+ICsJLyog UGFpcnMgd2l0aCB0aGUgV1JJVEVfT05DRSBpbiBtbXVfcmFuZ2Vfc2V0X3NlcSgpICovCj4gPiAr CXNlcSA9IFJFQURfT05DRShtcm4tPmludmFsaWRhdGVfc2VxKTsKPiA+ICsJaXNfaW52YWxpZGF0 aW5nID0gc2VxID09IG1tbl9tbS0+aW52YWxpZGF0ZV9zZXE7Cj4gPiArCXNwaW5fdW5sb2NrKCZt bW5fbW0tPmxvY2spOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBtcm4tPmludmFsaWRhdGVfc2Vx IGlzIGFsd2F5cyBzZXQgdG8gYW4gb2RkIHZhbHVlLiBUaGlzIGVuc3VyZXMKPiAKPiBUaGlzIGNs YWltIGp1c3QgbG9va3Mgd3JvbmcgdGhlIGZpcnN0IE4gdGltZXMgb25lIHJlYWRzIHRoZSBjb2Rl LCBnaXZlbiB0aGF0Cj4gdGhlcmUgaXMgbW11X3JhbmdlX3NldF9zZXEoKSB0byBzZXQgaXQgdG8g YW4gYXJiaXRyYXJ5IHZhbHVlISAgTWF5YmUgeW91IG1lYW4KPiAKPiAiaXMgYWx3YXlzIHNldCB0 byBhbiBvZGQgdmFsdWUgd2hlbiBpbnZhbGlkYXRpbmciPz8KCk5vIGl0IGlzIGFsd2F5cyBvZGQs IHlvdSBtdXN0IGNhbGwgbW11X3JhbmdlX3NldF9zZXEoKSBvbmx5IGZyb20gdGhlCm9wLT5pbnZh bGlkYXRlX3JhbmdlKCkgY2FsbGJhY2sgYXQgd2hpY2ggcG9pbnQgdGhlIHNlcSBpcyBvZGQuIEFz IHdlbGwKd2hlbiBtcm4gaXMgYWRkZWQgYW5kIGl0cyBzZXEgZmlyc3Qgc2V0IGl0IGlzIHNldCB0 byBhbiBvZGQgdmFsdWUKYWx3YXlzLiBNYXliZSB0aGUgY29tbWVudCwgc2hvdWxkIHJlYWQ6Cgog KiBtcm4tPmludmFsaWRhdGVfc2VxIGlzIGFsd2F5cywgeWVzIGFsd2F5cywgc2V0IHRvIGFuIG9k ZCB2YWx1ZS4gVGhpcyBlbnN1cmVzCgpUbyBzdHJlc3MgdGhhdCBpdCBpcyBub3QgYW4gZXJyb3Iu Cgo+IAo+ID4gKwkgKiB0aGF0IGlmIHNlcSBkb2VzIHdyYXAgd2Ugd2lsbCBhbHdheXMgY2xlYXIg dGhlIGJlbG93IHNsZWVwIGluIHNvbWUKPiA+ICsJICogcmVhc29uYWJsZSB0aW1lIGFzIG1tbl9t bS0+aW52YWxpZGF0ZV9zZXEgaXMgZXZlbiBpbiB0aGUgaWRsZQo+ID4gKwkgKiBzdGF0ZS4KPiA+ ICsJICovCj4gCj4gTGV0J3MgbW92ZSB0aGF0IGNvbW1lbnQgaGlnaGVyIHVwLiBUaGUgY29kZSB0 aGF0IGZvbGxvd3MgaXQgaGFzIG5vdGhpbmcgdG8KPiBkbyB3aXRoIGl0LCBzbyBpdCdzIGNvbmZ1 c2luZyBoZXJlLgoKTm8gdGhlIGNvbW1lbnQgaXMgaW4gdGhlIHJpZ2h0IHBsYWNlLCB0aGUgZmFj dCB0aGF0IGl0IGlzIG9kZCBhbmQgdGhhdAppZGxlIHN0YXRlIGlzIGV2ZW4gZXhwbGFpbnMgd2h5 IHRoZSB3YWl0KCkgd2lsbCBuZXZlciBsYXN0IGZvcmV2ZXIuCkFscmVhZHkgaGFkIGEgZGlzY3Vz c2lvbiBvbiB0aGlzIGluIHYxLgoKWy4uLl0KCj4gPiArCS8qCj4gPiArCSAqIElmIHNvbWUgaW52 YWxpZGF0ZV9yYW5nZV9zdGFydC9lbmQgcmVnaW9uIGlzIGdvaW5nIG9uIGluIHBhcmFsbGVsCj4g PiArCSAqIHdlIGRvbid0IGtub3cgd2hhdCBWQSByYW5nZXMgYXJlIGFmZmVjdGVkLCBzbyB3ZSBt dXN0IGFzc3VtZSB0aGlzCj4gPiArCSAqIG5ldyByYW5nZSBpcyBpbmNsdWRlZC4KPiA+ICsJICoK PiA+ICsJICogSWYgdGhlIGl0cmVlIGlzIGludmFsaWRhdGluZyB0aGVuIHdlIGFyZSBub3QgYWxs b3dlZCB0byBjaGFuZ2UKPiA+ICsJICogaXQuIFJldHJ5aW5nIHVudGlsIGludmFsaWRhdGlvbiBp cyBkb25lIGlzIHRyaWNreSBkdWUgdG8gdGhlCj4gPiArCSAqIHBvc3NpYmlsaXR5IGZvciBsaXZl IGxvY2ssIGluc3RlYWQgZGVmZXIgdGhlIGFkZCB0byB0aGUgdW5sb2NrIHNvCj4gPiArCSAqIHRo aXMgYWxnb3JpdGhtIGlzIGRldGVybWluaXN0aWMuCj4gPiArCSAqCj4gPiArCSAqIEluIGFsbCBj YXNlcyB0aGUgdmFsdWUgZm9yIHRoZSBtcm4tPm1yX2ludmFsaWRhdGVfc2VxIHNob3VsZCBiZQo+ ID4gKwkgKiBvZGQsIHNlZSBtbXVfcmFuZ2VfcmVhZF9iZWdpbigpCj4gPiArCSAqLwo+ID4gKwlz cGluX2xvY2soJm1tbl9tbS0+bG9jayk7Cj4gPiArCWlmIChtbW5fbW0tPmFjdGl2ZV9pbnZhbGlk YXRlX3Jhbmdlcykgewo+ID4gKwkJaWYgKG1uX2l0cmVlX2lzX2ludmFsaWRhdGluZyhtbW5fbW0p KQo+ID4gKwkJCWhsaXN0X2FkZF9oZWFkKCZtcm4tPmRlZmVycmVkX2l0ZW0sCj4gPiArCQkJCSAg ICAgICAmbW1uX21tLT5kZWZlcnJlZF9saXN0KTsKPiA+ICsJCWVsc2Ugewo+ID4gKwkJCW1tbl9t bS0+aW52YWxpZGF0ZV9zZXEgfD0gMTsKPiA+ICsJCQlpbnRlcnZhbF90cmVlX2luc2VydCgmbXJu LT5pbnRlcnZhbF90cmVlLAo+ID4gKwkJCQkJICAgICAmbW1uX21tLT5pdHJlZSk7Cj4gPiArCQl9 Cj4gPiArCQltcm4tPmludmFsaWRhdGVfc2VxID0gbW1uX21tLT5pbnZhbGlkYXRlX3NlcTsKPiA+ ICsJfSBlbHNlIHsKPiA+ICsJCVdBUk5fT04obW5faXRyZWVfaXNfaW52YWxpZGF0aW5nKG1tbl9t bSkpOwo+ID4gKwkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9IG1tbl9tbS0+aW52YWxpZGF0ZV9zZXEg LSAxOwo+IAo+IE9oaGgsIGNoZWNrbWF0ZS4gSSBsb3NlLiBXaHkgaXMgKnN1YnRyYWN0aW5nKiB0 aGUgcmlnaHQgdGhpbmcgdG8gZG8KPiBmb3Igc2VxIG51bWJlcnMgaGVyZT8gIEknbSBhY3V0ZWx5 IHVuaGFwcHkgdHJ5aW5nIHRvIGZpZ3VyZSB0aGlzIG91dC4KPiBJIHN1c3BlY3QgaXQncyBhbm90 aGVyIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IG9mIHRyeWluZyB0byB1c2UgdGhlCj4gbG93ZXIg Yml0IG9mIHRoZSBzZXEgbnVtYmVyIChldmVuL29kZCkgZm9yIHNvbWV0aGluZyBlbHNlLgoKSWYg dGhlcmUgaXMgbm8gbW1uX21tLT5hY3RpdmVfaW52YWxpZGF0ZV9yYW5nZXMgdGhlbiBpdCBtZWFu cyB0aGF0Cm1tbl9tbS0+aW52YWxpZGF0ZV9zZXEgaXMgZXZlbiBhbmQgdGh1cyBtbW5fbW0tPmlu dmFsaWRhdGVfc2VxIC0gMQppcyBhbiBvZGQgbnVtYmVyIHdoaWNoIG1lYW5zIHRoYXQgbXJuLT5p bnZhbGlkYXRlX3NlcSBpcyBpbml0aWFsaXplZAp0byBvZGQgdmFsdWUgYW5kIGlmIHlvdSBmb2xs b3cgdGhlIHJ1bGUgZm9yIGNhbGxpbmcgbW11X3JhbmdlX3NldF9zZXEoKQp0aGVuIGl0IHdpbGwg X2Fsd2F5c18gYmUgYW4gb2RkIG51bWJlciBhbmQgdGhpcyBjbG9zZSB0aGUgbG9vcCB3aXRoCnRo ZSBhYm92ZSBjb21tZW50cyA6KQoKPiAKPiA+ICsJCWludGVydmFsX3RyZWVfaW5zZXJ0KCZtcm4t PmludGVydmFsX3RyZWUsICZtbW5fbW0tPml0cmVlKTsKPiA+ICsJfQo+ID4gKwlzcGluX3VubG9j aygmbW1uX21tLT5sb2NrKTsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gKy8qKgo+ ID4gKyAqIG1tdV9yYW5nZV9ub3RpZmllcl9pbnNlcnQgLSBJbnNlcnQgYSByYW5nZSBub3RpZmll cgo+ID4gKyAqIEBtcm46IFJhbmdlIG5vdGlmaWVyIHRvIHJlZ2lzdGVyCj4gPiArICogQHN0YXJ0 OiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3MgdG8gbW9uaXRvcgo+ID4gKyAqIEBsZW5ndGg6IExl bmd0aCBvZiB0aGUgcmFuZ2UgdG8gbW9uaXRvcgo+ID4gKyAqIEBtbSA6IG1tX3N0cnVjdCB0byBh dHRhY2ggdG8KPiA+ICsgKgo+ID4gKyAqIFRoaXMgZnVuY3Rpb24gc3Vic2NyaWJlcyB0aGUgcmFu Z2Ugbm90aWZpZXIgZm9yIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgbW0uCj4gPiArICogVXBvbiBy ZXR1cm4gdGhlIG9wcyByZWxhdGVkIHRvIG1tdV9yYW5nZV9ub3RpZmllciB3aWxsIGJlIGNhbGxl ZCB3aGVuZXZlcgo+ID4gKyAqIGFuIGV2ZW50IHRoYXQgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZl biByYW5nZSBvY2N1cnMuCj4gPiArICoKPiA+ICsgKiBVcG9uIHJldHVybiB0aGUgcmFuZ2Vfbm90 aWZpZXIgbWF5IG5vdCBiZSBwcmVzZW50IGluIHRoZSBpbnRlcnZhbCB0cmVlIHlldC4KPiA+ICsg KiBUaGUgY2FsbGVyIG11c3QgdXNlIHRoZSBub3JtYWwgcmFuZ2Ugbm90aWZpZXIgbG9ja2luZyBm bG93IHZpYQo+ID4gKyAqIG1tdV9yYW5nZV9yZWFkX2JlZ2luKCkgdG8gZXN0YWJsaXNoIFNQVEVz IGZvciB0aGlzIHJhbmdlLgo+ID4gKyAqLwo+ID4gK2ludCBtbXVfcmFuZ2Vfbm90aWZpZXJfaW5z ZXJ0KHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiA+ICsJCQkgICAgICB1bnNpZ25l ZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbmd0aCwKPiA+ICsJCQkgICAgICBzdHJ1Y3Qg bW1fc3RydWN0ICptbSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBtbXVfbm90aWZpZXJfbW0gKm1tbl9t bTsKPiA+ICsJaW50IHJldDsKPiAKPiBIbW1tLCBJIHRoaW5rIGEgbGF0ZXIgcGF0Y2ggaW1wcm9w ZXJseSBjaGFuZ2VzIHRoZSBhYm92ZSB0byAiaW50IHJldCA9IDA7Ii4KPiBJJ2xsIGNoZWNrIG9u IHRoYXQuIEl0J3MgY29ycmVjdCBoZXJlLCB0aG91Z2guCj4gCj4gPiArCj4gPiArCW1pZ2h0X2xv Y2soJm1tLT5tbWFwX3NlbSk7Cj4gPiArCj4gPiArCW1tbl9tbSA9IHNtcF9sb2FkX2FjcXVpcmUo Jm1tLT5tbXVfbm90aWZpZXJfbW0pOwo+IAo+IFdoYXQgZG9lcyB0aGUgYWJvdmUgcGFpciB3aXRo PyBTaG91bGQgaGF2ZSBhIGNvbW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhhdC4KCkl0IHdhcyBkaXNj dXNzZWQgaW4gdjEgYnV0IG1heWJlIGEgY29tbWVudCBvZiB3aGF0IHdhcyBzYWlkIGJhY2sgdGhl biB3b3VsZApiZSBoZWxwZnVsLiBTb21ldGhpbmcgbGlrZToKCi8qCiAqIFdlIG5lZWQgdG8gaW5z dXJlIHRoYXQgYWxsIHdyaXRlcyB0byBtbS0+bW11X25vdGlmaWVyX21tIGFyZSB2aXNpYmxlIGJl Zm9yZQogKiBhbnkgY2hlY2tzIHdlIGRvIG9uIG1tbl9tbSBiZWxvdyBhcyBvdGhlcndpc2UgQ1BV IG1pZ2h0IHJlLW9yZGVyIHdyaXRlIGRvbmUKICogYnkgYW5vdGhlciBDUFUgY29yZSB0byBtbS0+ bW11X25vdGlmaWVyX21tIHN0cnVjdHVyZSBmaWVsZHMgYWZ0ZXIgdGhlIHJlYWQKICogYmVsb3dz LgogKi8KCkNoZWVycywKSsOpcsO0bWUKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f 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=-1.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,PDS_BTC_ID,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CBA13FC6194 for ; Thu, 7 Nov 2019 02:08:22 +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 A673621D6C for ; Thu, 7 Nov 2019 02:08:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A673621D6C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.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 477696E348; Thu, 7 Nov 2019 02:08:22 +0000 (UTC) Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by gabe.freedesktop.org (Postfix) with ESMTPS id 901386E348 for ; Thu, 7 Nov 2019 02:08:21 +0000 (UTC) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-251-vYaKpkspMBqRrJUS4jgCJw-1; Wed, 06 Nov 2019 21:08:16 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8F5831005502; Thu, 7 Nov 2019 02:08:13 +0000 (UTC) Received: from redhat.com (ovpn-125-216.rdu2.redhat.com [10.10.125.216]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 04F095C299; Thu, 7 Nov 2019 02:08:09 +0000 (UTC) Date: Wed, 6 Nov 2019 21:08:07 -0500 From: Jerome Glisse To: John Hubbard Subject: Re: [PATCH v2 02/15] mm/mmu_notifier: add an interval tree notifier Message-ID: <20191107020807.GA747656@redhat.com> References: <20191028201032.6352-1-jgg@ziepe.ca> <20191028201032.6352-3-jgg@ziepe.ca> <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> MIME-Version: 1.0 In-Reply-To: <35c2b322-004e-0e18-87e4-1920dc71bfd5@nvidia.com> User-Agent: Mutt/1.12.1 (2019-06-15) X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-MC-Unique: vYaKpkspMBqRrJUS4jgCJw-1 X-Mimecast-Spam-Score: 0 Content-Disposition: inline X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1573092500; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3pEC4ofbH9GmBg4Hvo6IdX7Sd6lzjmsN2FQ75gU3Q+g=; b=a9csM+XnEOWcmFZyPqDkd6JsfS4P3nA5dQEcCTCMlId/XJi0a93YJEVJpnND3vWT/NTij4 m4VUWxr/AFL2X+1jjItewD6THtHvzX74gH4ZoL/R7r+SkOH8wiq341xIiDnyUxvHMcAUG1 DX1wl0kZPZ+P789j7NpEZrh1nDgQ6ig= 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 , Jason Gunthorpe , Jason Gunthorpe , Ben Skeggs , xen-devel@lists.xenproject.org, Ralph Campbell , Boris Ostrovsky , Petr Cvek , Juergen Gross , Mike Marciniszyn , Dennis Dalessandro , Christian =?iso-8859-1?Q?K=F6nig?= , Alex Deucher , Felix.Kuehling@amd.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: amd-gfx-bounces@lists.freedesktop.org Sender: "amd-gfx" Message-ID: <20191107020807.HqGKVnjFCQOvlVtCI9gpH-3yq_RkBv4IVmmnyr7jaAs@z> T24gV2VkLCBOb3YgMDYsIDIwMTkgYXQgMDQ6MjM6MjFQTSAtMDgwMCwgSm9obiBIdWJiYXJkIHdy b3RlOgo+IE9uIDEwLzI4LzE5IDE6MTAgUE0sIEphc29uIEd1bnRob3JwZSB3cm90ZToKClsuLi5d Cgo+ID4gIC8qKgo+ID4gICAqIGVudW0gbW11X25vdGlmaWVyX2V2ZW50IC0gcmVhc29uIGZvciB0 aGUgbW11IG5vdGlmaWVyIGNhbGxiYWNrCj4gPiBAQCAtMzIsNiArMzQsOSBAQCBzdHJ1Y3QgbW11 X25vdGlmaWVyX3JhbmdlOwo+ID4gICAqIGFjY2VzcyBmbGFncykuIFVzZXIgc2hvdWxkIHNvZnQg ZGlydHkgdGhlIHBhZ2UgaW4gdGhlIGVuZCBjYWxsYmFjayB0byBtYWtlCj4gPiAgICogc3VyZSB0 aGF0IGFueW9uZSByZWx5aW5nIG9uIHNvZnQgZGlydHluZXNzIGNhdGNoIHBhZ2VzIHRoYXQgbWln aHQgYmUgd3JpdHRlbgo+ID4gICAqIHRocm91Z2ggbm9uIENQVSBtYXBwaW5ncy4KPiA+ICsgKgo+ ID4gKyAqIEBNTVVfTk9USUZZX1JFTEVBU0U6IHVzZWQgZHVyaW5nIG1tdV9yYW5nZV9ub3RpZmll ciBpbnZhbGlkYXRlIHRvIHNpZ25hbCB0aGF0Cj4gPiArICogdGhlIG1tIHJlZmNvdW50IGlzIHpl cm8gYW5kIHRoZSByYW5nZSBpcyBubyBsb25nZXIgYWNjZXNzaWJsZS4KPiA+ICAgKi8KPiA+ICBl bnVtIG1tdV9ub3RpZmllcl9ldmVudCB7Cj4gPiAgCU1NVV9OT1RJRllfVU5NQVAgPSAwLAo+ID4g QEAgLTM5LDYgKzQ0LDcgQEAgZW51bSBtbXVfbm90aWZpZXJfZXZlbnQgewo+ID4gIAlNTVVfTk9U SUZZX1BST1RFQ1RJT05fVk1BLAo+ID4gIAlNTVVfTk9USUZZX1BST1RFQ1RJT05fUEFHRSwKPiA+ ICAJTU1VX05PVElGWV9TT0ZUX0RJUlRZLAo+ID4gKwlNTVVfTk9USUZZX1JFTEVBU0UsCj4gPiAg fTsKPiAKPiAKPiBPSywgbGV0IHRoZSBuYW1pbmcgZGViYXRlcyBiZWdpbiEgaGEuIEFueXdheSwg YWZ0ZXIgY2FyZWZ1bCBzdHVkeSBvZiB0aGUgb3ZlcmFsbAo+IHBhdGNoLCBhbmQgc29tZSBicm93 c2luZyBvZiB0aGUgbGFyZ2VyIHBhdGNoc2V0LCBpdCdzIGNsZWFyIHRoYXQ6Cj4gCj4gKiBUaGUg bmV3ICJNTVUgcmFuZ2Ugbm90aWZpZXIiIHRoYXQgeW91J3ZlIGNyZWF0ZWQgaXMsIGFwcHJveGlt YXRlbHksIGEgbmV3Cj4gb2JqZWN0LiBJdCB1c2VzIGNsYXNzaWMgbW11IG5vdGlmaWVycyBpbnNp ZGUsIGFzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgYW5kCj4gaXQgZG9lcyAqc2ltaWxhciog dGhpbmdzIChub3RpZmljYXRpb25zKSBhcyBtbW4ncy4gQnV0IGl0J3MgY2VydGFpbmx5IG5vdCB0 aGUgc2FtZQo+IGFzIG1tbidzLCBhcyBzaG93biBsYXRlciB3aGVuIHlvdSBzYXkgdGhlIG5lZWQg dG8gYW4gZW50aXJlbHkgbmV3IG9wcyBzdHJ1Y3QsIGFuZCAKPiBkYXRhIHN0cnVjdCB0b28uCj4g Cj4gVGhlcmVmb3JlLCB5b3UgbmVlZCBhIHNlcGFyYXRlIGV2ZW50cyBlbnVtIGFzIHdlbGwuIFRo aXMgaXMgaW1wb3J0YW50LiBNTU4ncwo+IHdvbid0IGJlIGlzc3VpbmcgTU1OX05PVElGWV9SRUxF QVNFIGV2ZW50cywgbm9yIHdpbGwgTU5SJ3MgYmUgaXNzdWluZyB0aGUgZmlyc3QKPiBmb3VyIHBy ZXhpc3RpbmcgTU1VX05PVElGWV8qIGl0ZW1zLiBTbyBpdCB3b3VsZCBiZSBhIGRlc2lnbiBtaXN0 YWtlIHRvIGdsb20gdGhlbQo+IHRvZ2V0aGVyLCB1bmxlc3MgeW91IHVsdGltYXRlbHkgZGVjaWRl ZCB0byBtZXJnZSB0aGVzZSBNTU4gYW5kIE1OUiBvYmplY3RzICh3aGljaAo+IEkgZG9uJ3QgcmVh bGx5IHNlZSBhbnkgaW50ZW50aW9uIG9mLCBhbmQgdGhhdCdzIGZpbmUpLgo+IAo+IFNvIHRoaXMg c2hvdWxkIHJlYWQ6Cj4gCj4gZW51bSBtbXVfcmFuZ2Vfbm90aWZpZXJfZXZlbnQgewo+IAlNTVVf Tk9USUZZX1JFTEVBU0UsCj4gfTsKPiAKPiAuLi5hc3N1bWluZyB0aGF0IHdlIHN0YXkgd2l0aCAi bW11X3JhbmdlX25vdGlmaWVyIiBhcyBhIGNvcmUgbmFtZSBmb3IgdGhpcyAKPiB3aG9sZSB0aGlu Zy4KPiAKPiBBbHNvLCBpdCBpcyBiZXN0IG1vdmVkIGRvd24gdG8gYmUgbmV4dCB0byB0aGUgbmV3 IE1OUiBzdHJ1Y3RzLCBzbyB0aGF0IGFsbCB0aGUKPiBNTlIgc3R1ZmYgaXMgaW4gb25lIGdyb3Vw Lgo+IAo+IEV4dHJhIGNyZWRpdDogSU1ITywgdGhpcyBjbGVhcmx5IGRlc2VydmVzIHRvIGFsbCBi ZSBpbiBhIG5ldyBtbXVfcmFuZ2Vfbm90aWZpZXIuaAo+IGhlYWRlciBmaWxlLCBidXQgSSBrbm93 IHRoYXQncyBleHRyYSB3b3JrLiBNYXliZSBsYXRlciBhcyBhIGZvbGxvdy11cCBwYXRjaCwKPiBp ZiBhbnlvbmUgaGFzIHRoZSB0aW1lLgoKVGhlIHJhbmdlIG5vdGlmaWVyIHNob3VsZCBnZXQgdGhl IGV2ZW50IHRvbywgaXQgd291bGQgYmUgYSB3YXN0ZSwgaSB0aGluayBpdCBpcwphbiBvdmVyc2ln aHQgaGVyZS4gVGhlIHJlbGVhc2UgZXZlbnQgaXMgZmluZSBzbyBOQUsgdG8geW91IHNlcGFyYXRl IGV2ZW50LiBFdmVudAppcyByZWFsbHkgYW4gaGVscGVyIGZvciBub3RpZmllciBpIGhhZCBhIHNl dCBvZiBwYXRjaCBmb3Igbm91dmVhdSB0byBsZXZlcmFnZQp0aGlzIGkgbmVlZCB0byByZXN1Y2l0 ZSB0aGVtLiBTbyBubyBuZWVkIHRvIHNwbGl0IHRoaW5nLCBpIHdvdWxkIGp1c3QgZm9yd2FyZAp0 aGUgZXZlbnQgaWUgYWRkIGV2ZW50IHRvIG1tdV9yYW5nZV9ub3RpZmllcl9vcHMuaW52YWxpZGF0 ZSgpIGkgZmFpbGVkIHRvIGNhdGNoCnRoYXQgaW4gdjEgc29ycnkuCgoKWy4uLl0KCj4gPiArc3Ry dWN0IG1tdV9yYW5nZV9ub3RpZmllcl9vcHMgewo+ID4gKwlib29sICgqaW52YWxpZGF0ZSkoc3Ry dWN0IG1tdV9yYW5nZV9ub3RpZmllciAqbXJuLAo+ID4gKwkJCSAgIGNvbnN0IHN0cnVjdCBtbXVf bm90aWZpZXJfcmFuZ2UgKnJhbmdlLAo+ID4gKwkJCSAgIHVuc2lnbmVkIGxvbmcgY3VyX3NlcSk7 Cj4gPiArfTsKPiA+ICsKPiA+ICtzdHJ1Y3QgbW11X3JhbmdlX25vdGlmaWVyIHsKPiA+ICsJc3Ry dWN0IGludGVydmFsX3RyZWVfbm9kZSBpbnRlcnZhbF90cmVlOwo+ID4gKwljb25zdCBzdHJ1Y3Qg bW11X3JhbmdlX25vdGlmaWVyX29wcyAqb3BzOwo+ID4gKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZWZl cnJlZF9pdGVtOwo+ID4gKwl1bnNpZ25lZCBsb25nIGludmFsaWRhdGVfc2VxOwo+ID4gKwlzdHJ1 Y3QgbW1fc3RydWN0ICptbTsKPiA+ICt9Owo+ID4gKwo+IAo+IEFnYWluLCBub3cgd2UgaGF2ZSB0 aGUgbmV3IHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIsIGFuZCB0aGUgb2xkIAo+IHN0cnVjdCBt bXVfbm90aWZpZXJfcmFuZ2UsIGFuZCBpdCdzIG5vdCBnb29kLgo+IAo+IElkZWFzOgo+IAo+IGEp IExpdmUgd2l0aCBpdC4KPiAKPiBiKSAoRGlzY2FyZGVkLCB0b28gbWFueSBjYWxsZXJzKTogcmVu YW1lIG9sZCBvbmUuIE5vcGUuCj4gCj4gYykgUmVuYW1lIG5ldyBvbmUuIElkZWFzOgo+IAo+ICAg ICBzdHJ1Y3QgbW11X2ludGVydmFsX25vdGlmaWVyCj4gICAgIHN0cnVjdCBtbXVfcmFuZ2VfaW50 ZXJzZWN0aW9uCj4gICAgIC4uLm90aGVyIGlkZWFzPwoKSSB2b3RlIGZvciBpbnRlcnZhbF9ub3Rp ZmllciB3ZSBkbyB3YW50IG5vdGlmaWVyIGluIG5hbWUgYnV0IGkgYW0gYWxzbwpmaW5lIHdpdGgg Y3VycmVudCBuYW1lLgoKWy4uLl0KCj4gPiArICoKPiA+ICsgKiBOb3RlIHRoYXQgdGhlIGNvcmUg bW0gY3JlYXRlcyBuZXN0ZWQgaW52YWxpZGF0ZV9yYW5nZV9zdGFydCgpL2VuZCgpIHJlZ2lvbnMK PiA+ICsgKiB3aXRoaW4gdGhlIHNhbWUgdGhyZWFkLCBhbmQgcnVucyBpbnZhbGlkYXRlX3Jhbmdl X3N0YXJ0KCkvZW5kKCkgaW4gcGFyYWxsZWwKPiA+ICsgKiBvbiBtdWx0aXBsZSBDUFVzLiBUaGlz IGlzIGRlc2lnbmVkIHRvIG5vdCByZWR1Y2UgY29uY3VycmVuY3kgb3IgYmxvY2sKPiA+ICsgKiBw cm9ncmVzcyBvbiB0aGUgbW0gc2lkZS4KPiA+ICsgKgo+ID4gKyAqIEFzIGEgc2Vjb25kYXJ5IGZ1 bmN0aW9uLCBob2xkaW5nIHRoZSBmdWxsIHdyaXRlIHNpZGUgYWxzbyBzZXJ2ZXMgdG8gcHJldmVu dAo+ID4gKyAqIHdyaXRlcnMgZm9yIHRoZSBpdHJlZSwgdGhpcyBpcyBhbiBvcHRpbWl6YXRpb24g dG8gYXZvaWQgZXh0cmEgbG9ja2luZwo+ID4gKyAqIGR1cmluZyBpbnZhbGlkYXRlX3JhbmdlX3N0 YXJ0L2VuZCBub3RpZmllcnMuCj4gPiArICoKPiA+ICsgKiBUaGUgd3JpdGUgc2lkZSBoYXMgdHdv IHN0YXRlcywgZnVsbHkgZXhjbHVkZWQ6Cj4gPiArICogIC0gbW0tPmFjdGl2ZV9pbnZhbGlkYXRl X3JhbmdlcyAhPSAwCj4gPiArICogIC0gbW5uLT5pbnZhbGlkYXRlX3NlcSAmIDEgPT0gVHJ1ZQo+ ID4gKyAqICAtIHNvbWUgcmFuZ2Ugb24gdGhlIG1tX3N0cnVjdCBpcyBiZWluZyBpbnZhbGlkYXRl ZAo+ID4gKyAqICAtIHRoZSBpdHJlZSBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UKPiA+ICsgKgo+ ID4gKyAqIEFuZCBwYXJ0aWFsbHkgZXhjbHVkZWQ6Cj4gPiArICogIC0gbW0tPmFjdGl2ZV9pbnZh bGlkYXRlX3JhbmdlcyAhPSAwCj4gCj4gSSBhc3N1bWUgdGhpcyBpbXBsaWVzIG1ubi0+aW52YWxp ZGF0ZV9zZXEgJiAxID09IEZhbHNlIGluIHRoaXMgY2FzZT8gSWYgc28sCj4gbGV0J3Mgc2F5IHNv LiBJJ20gcHJvYmFibHkgZ2V0dGluZyB0aGF0IHdyb25nLCB0b28uCgpZZXMgKG1ubi0+aW52YWxp ZGF0ZV9zZXEgJiAxKSA9PSAwCgo+IAo+ID4gKyAqICAtIHNvbWUgcmFuZ2Ugb24gdGhlIG1tX3N0 cnVjdCBpcyBiZWluZyBpbnZhbGlkYXRlZAo+ID4gKyAqICAtIHRoZSBpdHJlZSBpcyBhbGxvd2Vk IHRvIGNoYW5nZQo+ID4gKyAqCj4gPiArICogVGhlIGxhdGVyIHN0YXRlIGF2b2lkcyBzb21lIGV4 cGVuc2l2ZSB3b3JrIG9uIGludl9lbmQgaW4gdGhlIGNvbW1vbiBjYXNlIG9mCj4gPiArICogbm8g bXJuIG1vbml0b3JpbmcgdGhlIFZBLgo+ID4gKyAqLwo+ID4gK3N0YXRpYyBib29sIG1uX2l0cmVl X2lzX2ludmFsaWRhdGluZyhzdHJ1Y3QgbW11X25vdGlmaWVyX21tICptbW5fbW0pCj4gPiArewo+ ID4gKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtbW5fbW0tPmxvY2spOwo+ID4gKwlyZXR1cm4gbW1u X21tLT5pbnZhbGlkYXRlX3NlcSAmIDE7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3Qg bW11X3JhbmdlX25vdGlmaWVyICoKPiA+ICttbl9pdHJlZV9pbnZfc3RhcnRfcmFuZ2Uoc3RydWN0 IG1tdV9ub3RpZmllcl9tbSAqbW1uX21tLAo+ID4gKwkJCSBjb25zdCBzdHJ1Y3QgbW11X25vdGlm aWVyX3JhbmdlICpyYW5nZSwKPiA+ICsJCQkgdW5zaWduZWQgbG9uZyAqc2VxKQo+ID4gK3sKPiA+ ICsJc3RydWN0IGludGVydmFsX3RyZWVfbm9kZSAqbm9kZTsKPiA+ICsJc3RydWN0IG1tdV9yYW5n ZV9ub3RpZmllciAqcmVzID0gTlVMTDsKPiA+ICsKPiA+ICsJc3Bpbl9sb2NrKCZtbW5fbW0tPmxv Y2spOwo+ID4gKwltbW5fbW0tPmFjdGl2ZV9pbnZhbGlkYXRlX3JhbmdlcysrOwo+ID4gKwlub2Rl ID0gaW50ZXJ2YWxfdHJlZV9pdGVyX2ZpcnN0KCZtbW5fbW0tPml0cmVlLCByYW5nZS0+c3RhcnQs Cj4gPiArCQkJCQlyYW5nZS0+ZW5kIC0gMSk7Cj4gPiArCWlmIChub2RlKSB7Cj4gPiArCQltbW5f bW0tPmludmFsaWRhdGVfc2VxIHw9IDE7Cj4gCj4gCj4gT0ssIHRoaXMgZWl0aGVyIG5lZWRzIG1v cmUgZG9jdW1lbnRhdGlvbiBhbmQgYXNzZXJ0aW9ucywgb3IgYSBkaWZmZXJlbnQKPiBhcHByb2Fj aC4gQmVjYXVzZSBJIHNlZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIEFORCwgT1IgYW5kIGJvb2xl YW5zCj4gYWxsIGJlaW5nIGFwcGxpZWQgdG8gdGhpcyBmaWVsZCwgYW5kIGl0J3MgZGFybiBuZWFy IGhvcGVsZXNzIHRvIGZpZ3VyZQo+IG91dCB3aGV0aGVyIG9yIG5vdCBpdCByZWFsbHkgaXMgZXZl biBvciBvZGQgYXQgdGhlIHJpZ2h0IHRpbWVzLgo+IAo+IERpZmZlcmVudCBhcHByb2FjaDogd2h5 IG5vdCBqdXN0IGFkZCBhIG1tbl9tbS0+aXNfaW52YWxpZGF0aW5nIAo+IG1lbWJlciB2YXJpYWJs ZT8gSXQncyBub3QgbGlrZSB5b3UncmUgc2hvcnQgb2Ygc3BhY2UgaW4gdGhhdCBzdHJ1Y3QuCgpU aGUgaW52YWxpZGF0ZV9zZXEgc2NoZW1lIGxvb2tzIGZpbmUgdG8gbWUsIG1heWJlIGl0IGNhbiB1 c2UgbW9yZSBjb21tZW50cy4KCgo+IAo+IAo+ID4gKwkJcmVzID0gY29udGFpbmVyX29mKG5vZGUs IHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIsCj4gPiArCQkJCSAgIGludGVydmFsX3RyZWUpOwo+ ID4gKwl9Cj4gPiArCj4gPiArCSpzZXEgPSBtbW5fbW0tPmludmFsaWRhdGVfc2VxOwo+ID4gKwlz cGluX3VubG9jaygmbW1uX21tLT5sb2NrKTsKPiA+ICsJcmV0dXJuIHJlczsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKgo+ID4gK21uX2l0cmVlX2lu dl9uZXh0KHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiA+ICsJCSAgY29uc3Qgc3Ry dWN0IG1tdV9ub3RpZmllcl9yYW5nZSAqcmFuZ2UpCj4gPiArewo+ID4gKwlzdHJ1Y3QgaW50ZXJ2 YWxfdHJlZV9ub2RlICpub2RlOwo+ID4gKwo+ID4gKwlub2RlID0gaW50ZXJ2YWxfdHJlZV9pdGVy X25leHQoJm1ybi0+aW50ZXJ2YWxfdHJlZSwgcmFuZ2UtPnN0YXJ0LAo+ID4gKwkJCQkgICAgICAg cmFuZ2UtPmVuZCAtIDEpOwo+ID4gKwlpZiAoIW5vZGUpCj4gPiArCQlyZXR1cm4gTlVMTDsKPiA+ ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgbW11X3JhbmdlX25vdGlmaWVyLCBp bnRlcnZhbF90cmVlKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbW5faXRyZWVfaW52 X2VuZChzdHJ1Y3QgbW11X25vdGlmaWVyX21tICptbW5fbW0pCj4gPiArewo+ID4gKwlzdHJ1Y3Qg bW11X3JhbmdlX25vdGlmaWVyICptcm47Cj4gPiArCXN0cnVjdCBobGlzdF9ub2RlICpuZXh0Owo+ ID4gKwlib29sIG5lZWRfd2FrZSA9IGZhbHNlOwo+ID4gKwo+ID4gKwlzcGluX2xvY2soJm1tbl9t bS0+bG9jayk7Cj4gPiArCWlmICgtLW1tbl9tbS0+YWN0aXZlX2ludmFsaWRhdGVfcmFuZ2VzIHx8 Cj4gPiArCSAgICAhbW5faXRyZWVfaXNfaW52YWxpZGF0aW5nKG1tbl9tbSkpIHsKPiA+ICsJCXNw aW5fdW5sb2NrKCZtbW5fbW0tPmxvY2spOwo+ID4gKwkJcmV0dXJuOwo+ID4gKwl9Cj4gPiArCj4g PiArCW1tbl9tbS0+aW52YWxpZGF0ZV9zZXErKzsKPiAKPiBJcyB0aGlzIHRoZSByaWdodCBwbGFj ZSBmb3IgYW4gYXNzZXJ0aW9uIHRoYXQgdGhpcyBpcyBub3cgYW4gZXZlbiB2YWx1ZT8KClllcyBh dCB0aGF0IHBvaW50IGl0IHNob3VsZCBiZSBldmVuIGllIG1tbl9tbS0+YWN0aXZlX2ludmFsaWRh dGVfcmFuZ2VzID09IDAKYW5kIHdlIGFyZSBob2xkaW5nIHRoZSBsb2NrIHRodXMgbm90aGluZyBj YW4gc2V0IHRoZSBsb3dlciBiaXQgb2YgaW52YWxpZGF0ZV9zZXEKYW5kICsrIHNob3VsZCBsZWFk IHRvIGV2ZW4gbnVtYmVyLgoKPiAKPiA+ICsJbmVlZF93YWtlID0gdHJ1ZTsKPiA+ICsKPiA+ICsJ LyoKPiA+ICsJICogVGhlIGludl9lbmQgaW5jb3Jwb3JhdGVzIGEgZGVmZXJyZWQgbWVjaGFuaXNt IGxpa2UKPiA+ICsJICogcnRubF9sb2NrKCkuIEFkZHMgYW5kIHJlbW92ZXMgYXJlIHF1ZXVlZCB1 bnRpbCB0aGUgZmluYWwgaW52X2VuZAo+IAo+IExldCBtZSBwb2ludCBvdXQgdGhhdCBydG5sX2xv Y2soKSBpdHNlbGYgaXMgYSBvbmUtbGluZXIgdGhhdCBjYWxscyBtdXRleF9sb2NrKCkuCj4gQnV0 IEkgc3VwcG9zZSBpZiBvbmUgc3R1ZGllcyB0aGF0IGZpbGUgY2xvc2VseSB0aGVyZSBpcyBtb3Jl LiA6KQoKSSB0aGluayBpIGNvbW1lbnRlZCBpbiB2MSBhYm91dCBydG5sX2xvY2soKSBiZWluZyBz b21ldGhpbmcgbmV0d29yayBwZW9wbGUgb25seQptaWdodCBiZSBmYW1pbGlhciwgaSB0aGluayBp IHNhdyBpdCBkb2N1bWVudGVkIHNvbWV3aGVyZSwgbWF5YmUgYSBsd24gYXJ0aWNsZS4KQnV0IGlm IHlvdSBhcmUgZmFtaWxpYXIgd2l0aCBuZXR3b3JrIGl0IGlzIGEgdGhpbmsgd2VsbCB1bmRlcnN0 b29kIC4uLiBmb3IgYW55CnJlYXNvbmFibGUgbmV0d29yayBzY2hvbGFyIDspCgo+IC4uLgo+IAo+ ID4gK3Vuc2lnbmVkIGxvbmcgbW11X3JhbmdlX3JlYWRfYmVnaW4oc3RydWN0IG1tdV9yYW5nZV9u b3RpZmllciAqbXJuKQo+ID4gK3sKPiA+ICsJc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW1uX21t ID0gbXJuLT5tbS0+bW11X25vdGlmaWVyX21tOwo+ID4gKwl1bnNpZ25lZCBsb25nIHNlcTsKPiA+ ICsJYm9vbCBpc19pbnZhbGlkYXRpbmc7Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIElmIHRoZSBt cm4gaGFzIGEgZGlmZmVyZW50IHNlcSB2YWx1ZSB1bmRlciB0aGUgdXNlcl9sb2NrIHRoYW4gd2UK PiA+ICsJICogc3RhcnRlZCB3aXRoIHRoZW4gaXQgaGFzIGNvbGxpZGVkLgo+ID4gKwkgKgo+ID4g KwkgKiBJZiB0aGUgbXJuIGN1cnJlbnRseSBoYXMgdGhlIHNhbWUgc2VxIHZhbHVlIGFzIHRoZSBt bW5fbW0gc2VxLCB0aGVuCj4gPiArCSAqIGl0IGlzIGN1cnJlbnRseSBiZXR3ZWVuIGludmFsaWRh dGVfc3RhcnQvZW5kIGFuZCBpcyBjb2xsaWRpbmcuCj4gPiArCSAqCj4gPiArCSAqIFRoZSBsb2Nr aW5nIGxvb2tzIGJyb2FkbHkgbGlrZSB0aGlzOgo+ID4gKwkgKiAgIG1uX3RyZWVfaW52YWxpZGF0 ZV9zdGFydCgpOiAgICAgICAgICBtbXVfcmFuZ2VfcmVhZF9iZWdpbigpOgo+ID4gKwkgKiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrCj4gPiArCSAqICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxID0gUkVBRF9PTkNFKG1y bi0+aW52YWxpZGF0ZV9zZXEpOwo+ID4gKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNlcSA9PSBtbW5fbW0tPmludmFsaWRhdGVfc2VxCj4gPiArCSAqICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jawo+ID4gKwkgKiAg ICBzcGluX2xvY2sKPiA+ICsJICogICAgIHNlcSA9ICsrbW1uX21tLT5pbnZhbGlkYXRlX3NlcQo+ ID4gKwkgKiAgICBzcGluX3VubG9jawo+ID4gKwkgKiAgICAgb3AtPmludmFsaWRhdGVfcmFuZ2Uo KToKPiA+ICsJICogICAgICAgdXNlcl9sb2NrCj4gPiArCSAqICAgICAgICBtbXVfcmFuZ2Vfc2V0 X3NlcSgpCj4gPiArCSAqICAgICAgICAgbXJuLT5pbnZhbGlkYXRlX3NlcSA9IHNlcQo+ID4gKwkg KiAgICAgICB1c2VyX3VubG9jawo+ID4gKwkgKgo+ID4gKwkgKiAgICAgICAgICAgICAgICAgICAg ICAgICAgW1JlcXVpcmVkOiBtbXVfcmFuZ2VfcmVhZF9yZXRyeSgpID09IHRydWVdCj4gPiArCSAq Cj4gPiArCSAqICAgbW5faXRyZWVfaW52X2VuZCgpOgo+ID4gKwkgKiAgICBzcGluX2xvY2sKPiA+ ICsJICogICAgIHNlcSA9ICsrbW1uX21tLT5pbnZhbGlkYXRlX3NlcQo+ID4gKwkgKiAgICBzcGlu X3VubG9jawo+ID4gKwkgKgo+ID4gKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1c2VyX2xvY2sKPiA+ICsJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG1tdV9yYW5nZV9yZWFkX3JldHJ5KCk6Cj4gPiArCSAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJuLT5pbnZhbGlkYXRlX3NlcSAhPSBzZXEKPiA+ ICsJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl91bmxvY2sK PiA+ICsJICoKPiA+ICsJICogQmFycmllcnMgYXJlIG5vdCBuZWVkZWQgaGVyZSBhcyBhbnkgcmFj ZXMgaGVyZSBhcmUgY2xvc2VkIGJ5IGFuCj4gPiArCSAqIGV2ZW50dWFsIG1tdV9yYW5nZV9yZWFk X3JldHJ5KCksIHdoaWNoIHByb3ZpZGVzIGEgYmFycmllciB2aWEgdGhlCj4gPiArCSAqIHVzZXJf bG9jay4KPiA+ICsJICovCj4gPiArCXNwaW5fbG9jaygmbW1uX21tLT5sb2NrKTsKPiA+ICsJLyog UGFpcnMgd2l0aCB0aGUgV1JJVEVfT05DRSBpbiBtbXVfcmFuZ2Vfc2V0X3NlcSgpICovCj4gPiAr CXNlcSA9IFJFQURfT05DRShtcm4tPmludmFsaWRhdGVfc2VxKTsKPiA+ICsJaXNfaW52YWxpZGF0 aW5nID0gc2VxID09IG1tbl9tbS0+aW52YWxpZGF0ZV9zZXE7Cj4gPiArCXNwaW5fdW5sb2NrKCZt bW5fbW0tPmxvY2spOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBtcm4tPmludmFsaWRhdGVfc2Vx IGlzIGFsd2F5cyBzZXQgdG8gYW4gb2RkIHZhbHVlLiBUaGlzIGVuc3VyZXMKPiAKPiBUaGlzIGNs YWltIGp1c3QgbG9va3Mgd3JvbmcgdGhlIGZpcnN0IE4gdGltZXMgb25lIHJlYWRzIHRoZSBjb2Rl LCBnaXZlbiB0aGF0Cj4gdGhlcmUgaXMgbW11X3JhbmdlX3NldF9zZXEoKSB0byBzZXQgaXQgdG8g YW4gYXJiaXRyYXJ5IHZhbHVlISAgTWF5YmUgeW91IG1lYW4KPiAKPiAiaXMgYWx3YXlzIHNldCB0 byBhbiBvZGQgdmFsdWUgd2hlbiBpbnZhbGlkYXRpbmciPz8KCk5vIGl0IGlzIGFsd2F5cyBvZGQs IHlvdSBtdXN0IGNhbGwgbW11X3JhbmdlX3NldF9zZXEoKSBvbmx5IGZyb20gdGhlCm9wLT5pbnZh bGlkYXRlX3JhbmdlKCkgY2FsbGJhY2sgYXQgd2hpY2ggcG9pbnQgdGhlIHNlcSBpcyBvZGQuIEFz IHdlbGwKd2hlbiBtcm4gaXMgYWRkZWQgYW5kIGl0cyBzZXEgZmlyc3Qgc2V0IGl0IGlzIHNldCB0 byBhbiBvZGQgdmFsdWUKYWx3YXlzLiBNYXliZSB0aGUgY29tbWVudCwgc2hvdWxkIHJlYWQ6Cgog KiBtcm4tPmludmFsaWRhdGVfc2VxIGlzIGFsd2F5cywgeWVzIGFsd2F5cywgc2V0IHRvIGFuIG9k ZCB2YWx1ZS4gVGhpcyBlbnN1cmVzCgpUbyBzdHJlc3MgdGhhdCBpdCBpcyBub3QgYW4gZXJyb3Iu Cgo+IAo+ID4gKwkgKiB0aGF0IGlmIHNlcSBkb2VzIHdyYXAgd2Ugd2lsbCBhbHdheXMgY2xlYXIg dGhlIGJlbG93IHNsZWVwIGluIHNvbWUKPiA+ICsJICogcmVhc29uYWJsZSB0aW1lIGFzIG1tbl9t bS0+aW52YWxpZGF0ZV9zZXEgaXMgZXZlbiBpbiB0aGUgaWRsZQo+ID4gKwkgKiBzdGF0ZS4KPiA+ ICsJICovCj4gCj4gTGV0J3MgbW92ZSB0aGF0IGNvbW1lbnQgaGlnaGVyIHVwLiBUaGUgY29kZSB0 aGF0IGZvbGxvd3MgaXQgaGFzIG5vdGhpbmcgdG8KPiBkbyB3aXRoIGl0LCBzbyBpdCdzIGNvbmZ1 c2luZyBoZXJlLgoKTm8gdGhlIGNvbW1lbnQgaXMgaW4gdGhlIHJpZ2h0IHBsYWNlLCB0aGUgZmFj dCB0aGF0IGl0IGlzIG9kZCBhbmQgdGhhdAppZGxlIHN0YXRlIGlzIGV2ZW4gZXhwbGFpbnMgd2h5 IHRoZSB3YWl0KCkgd2lsbCBuZXZlciBsYXN0IGZvcmV2ZXIuCkFscmVhZHkgaGFkIGEgZGlzY3Vz c2lvbiBvbiB0aGlzIGluIHYxLgoKWy4uLl0KCj4gPiArCS8qCj4gPiArCSAqIElmIHNvbWUgaW52 YWxpZGF0ZV9yYW5nZV9zdGFydC9lbmQgcmVnaW9uIGlzIGdvaW5nIG9uIGluIHBhcmFsbGVsCj4g PiArCSAqIHdlIGRvbid0IGtub3cgd2hhdCBWQSByYW5nZXMgYXJlIGFmZmVjdGVkLCBzbyB3ZSBt dXN0IGFzc3VtZSB0aGlzCj4gPiArCSAqIG5ldyByYW5nZSBpcyBpbmNsdWRlZC4KPiA+ICsJICoK PiA+ICsJICogSWYgdGhlIGl0cmVlIGlzIGludmFsaWRhdGluZyB0aGVuIHdlIGFyZSBub3QgYWxs b3dlZCB0byBjaGFuZ2UKPiA+ICsJICogaXQuIFJldHJ5aW5nIHVudGlsIGludmFsaWRhdGlvbiBp cyBkb25lIGlzIHRyaWNreSBkdWUgdG8gdGhlCj4gPiArCSAqIHBvc3NpYmlsaXR5IGZvciBsaXZl IGxvY2ssIGluc3RlYWQgZGVmZXIgdGhlIGFkZCB0byB0aGUgdW5sb2NrIHNvCj4gPiArCSAqIHRo aXMgYWxnb3JpdGhtIGlzIGRldGVybWluaXN0aWMuCj4gPiArCSAqCj4gPiArCSAqIEluIGFsbCBj YXNlcyB0aGUgdmFsdWUgZm9yIHRoZSBtcm4tPm1yX2ludmFsaWRhdGVfc2VxIHNob3VsZCBiZQo+ ID4gKwkgKiBvZGQsIHNlZSBtbXVfcmFuZ2VfcmVhZF9iZWdpbigpCj4gPiArCSAqLwo+ID4gKwlz cGluX2xvY2soJm1tbl9tbS0+bG9jayk7Cj4gPiArCWlmIChtbW5fbW0tPmFjdGl2ZV9pbnZhbGlk YXRlX3Jhbmdlcykgewo+ID4gKwkJaWYgKG1uX2l0cmVlX2lzX2ludmFsaWRhdGluZyhtbW5fbW0p KQo+ID4gKwkJCWhsaXN0X2FkZF9oZWFkKCZtcm4tPmRlZmVycmVkX2l0ZW0sCj4gPiArCQkJCSAg ICAgICAmbW1uX21tLT5kZWZlcnJlZF9saXN0KTsKPiA+ICsJCWVsc2Ugewo+ID4gKwkJCW1tbl9t bS0+aW52YWxpZGF0ZV9zZXEgfD0gMTsKPiA+ICsJCQlpbnRlcnZhbF90cmVlX2luc2VydCgmbXJu LT5pbnRlcnZhbF90cmVlLAo+ID4gKwkJCQkJICAgICAmbW1uX21tLT5pdHJlZSk7Cj4gPiArCQl9 Cj4gPiArCQltcm4tPmludmFsaWRhdGVfc2VxID0gbW1uX21tLT5pbnZhbGlkYXRlX3NlcTsKPiA+ ICsJfSBlbHNlIHsKPiA+ICsJCVdBUk5fT04obW5faXRyZWVfaXNfaW52YWxpZGF0aW5nKG1tbl9t bSkpOwo+ID4gKwkJbXJuLT5pbnZhbGlkYXRlX3NlcSA9IG1tbl9tbS0+aW52YWxpZGF0ZV9zZXEg LSAxOwo+IAo+IE9oaGgsIGNoZWNrbWF0ZS4gSSBsb3NlLiBXaHkgaXMgKnN1YnRyYWN0aW5nKiB0 aGUgcmlnaHQgdGhpbmcgdG8gZG8KPiBmb3Igc2VxIG51bWJlcnMgaGVyZT8gIEknbSBhY3V0ZWx5 IHVuaGFwcHkgdHJ5aW5nIHRvIGZpZ3VyZSB0aGlzIG91dC4KPiBJIHN1c3BlY3QgaXQncyBhbm90 aGVyIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IG9mIHRyeWluZyB0byB1c2UgdGhlCj4gbG93ZXIg Yml0IG9mIHRoZSBzZXEgbnVtYmVyIChldmVuL29kZCkgZm9yIHNvbWV0aGluZyBlbHNlLgoKSWYg dGhlcmUgaXMgbm8gbW1uX21tLT5hY3RpdmVfaW52YWxpZGF0ZV9yYW5nZXMgdGhlbiBpdCBtZWFu cyB0aGF0Cm1tbl9tbS0+aW52YWxpZGF0ZV9zZXEgaXMgZXZlbiBhbmQgdGh1cyBtbW5fbW0tPmlu dmFsaWRhdGVfc2VxIC0gMQppcyBhbiBvZGQgbnVtYmVyIHdoaWNoIG1lYW5zIHRoYXQgbXJuLT5p bnZhbGlkYXRlX3NlcSBpcyBpbml0aWFsaXplZAp0byBvZGQgdmFsdWUgYW5kIGlmIHlvdSBmb2xs b3cgdGhlIHJ1bGUgZm9yIGNhbGxpbmcgbW11X3JhbmdlX3NldF9zZXEoKQp0aGVuIGl0IHdpbGwg X2Fsd2F5c18gYmUgYW4gb2RkIG51bWJlciBhbmQgdGhpcyBjbG9zZSB0aGUgbG9vcCB3aXRoCnRo ZSBhYm92ZSBjb21tZW50cyA6KQoKPiAKPiA+ICsJCWludGVydmFsX3RyZWVfaW5zZXJ0KCZtcm4t PmludGVydmFsX3RyZWUsICZtbW5fbW0tPml0cmVlKTsKPiA+ICsJfQo+ID4gKwlzcGluX3VubG9j aygmbW1uX21tLT5sb2NrKTsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gKy8qKgo+ ID4gKyAqIG1tdV9yYW5nZV9ub3RpZmllcl9pbnNlcnQgLSBJbnNlcnQgYSByYW5nZSBub3RpZmll cgo+ID4gKyAqIEBtcm46IFJhbmdlIG5vdGlmaWVyIHRvIHJlZ2lzdGVyCj4gPiArICogQHN0YXJ0 OiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3MgdG8gbW9uaXRvcgo+ID4gKyAqIEBsZW5ndGg6IExl bmd0aCBvZiB0aGUgcmFuZ2UgdG8gbW9uaXRvcgo+ID4gKyAqIEBtbSA6IG1tX3N0cnVjdCB0byBh dHRhY2ggdG8KPiA+ICsgKgo+ID4gKyAqIFRoaXMgZnVuY3Rpb24gc3Vic2NyaWJlcyB0aGUgcmFu Z2Ugbm90aWZpZXIgZm9yIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgbW0uCj4gPiArICogVXBvbiBy ZXR1cm4gdGhlIG9wcyByZWxhdGVkIHRvIG1tdV9yYW5nZV9ub3RpZmllciB3aWxsIGJlIGNhbGxl ZCB3aGVuZXZlcgo+ID4gKyAqIGFuIGV2ZW50IHRoYXQgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZl biByYW5nZSBvY2N1cnMuCj4gPiArICoKPiA+ICsgKiBVcG9uIHJldHVybiB0aGUgcmFuZ2Vfbm90 aWZpZXIgbWF5IG5vdCBiZSBwcmVzZW50IGluIHRoZSBpbnRlcnZhbCB0cmVlIHlldC4KPiA+ICsg KiBUaGUgY2FsbGVyIG11c3QgdXNlIHRoZSBub3JtYWwgcmFuZ2Ugbm90aWZpZXIgbG9ja2luZyBm bG93IHZpYQo+ID4gKyAqIG1tdV9yYW5nZV9yZWFkX2JlZ2luKCkgdG8gZXN0YWJsaXNoIFNQVEVz IGZvciB0aGlzIHJhbmdlLgo+ID4gKyAqLwo+ID4gK2ludCBtbXVfcmFuZ2Vfbm90aWZpZXJfaW5z ZXJ0KHN0cnVjdCBtbXVfcmFuZ2Vfbm90aWZpZXIgKm1ybiwKPiA+ICsJCQkgICAgICB1bnNpZ25l ZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbmd0aCwKPiA+ICsJCQkgICAgICBzdHJ1Y3Qg bW1fc3RydWN0ICptbSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBtbXVfbm90aWZpZXJfbW0gKm1tbl9t bTsKPiA+ICsJaW50IHJldDsKPiAKPiBIbW1tLCBJIHRoaW5rIGEgbGF0ZXIgcGF0Y2ggaW1wcm9w ZXJseSBjaGFuZ2VzIHRoZSBhYm92ZSB0byAiaW50IHJldCA9IDA7Ii4KPiBJJ2xsIGNoZWNrIG9u IHRoYXQuIEl0J3MgY29ycmVjdCBoZXJlLCB0aG91Z2guCj4gCj4gPiArCj4gPiArCW1pZ2h0X2xv Y2soJm1tLT5tbWFwX3NlbSk7Cj4gPiArCj4gPiArCW1tbl9tbSA9IHNtcF9sb2FkX2FjcXVpcmUo Jm1tLT5tbXVfbm90aWZpZXJfbW0pOwo+IAo+IFdoYXQgZG9lcyB0aGUgYWJvdmUgcGFpciB3aXRo PyBTaG91bGQgaGF2ZSBhIGNvbW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhhdC4KCkl0IHdhcyBkaXNj dXNzZWQgaW4gdjEgYnV0IG1heWJlIGEgY29tbWVudCBvZiB3aGF0IHdhcyBzYWlkIGJhY2sgdGhl biB3b3VsZApiZSBoZWxwZnVsLiBTb21ldGhpbmcgbGlrZToKCi8qCiAqIFdlIG5lZWQgdG8gaW5z dXJlIHRoYXQgYWxsIHdyaXRlcyB0byBtbS0+bW11X25vdGlmaWVyX21tIGFyZSB2aXNpYmxlIGJl Zm9yZQogKiBhbnkgY2hlY2tzIHdlIGRvIG9uIG1tbl9tbSBiZWxvdyBhcyBvdGhlcndpc2UgQ1BV IG1pZ2h0IHJlLW9yZGVyIHdyaXRlIGRvbmUKICogYnkgYW5vdGhlciBDUFUgY29yZSB0byBtbS0+ bW11X25vdGlmaWVyX21tIHN0cnVjdHVyZSBmaWVsZHMgYWZ0ZXIgdGhlIHJlYWQKICogYmVsb3dz LgogKi8KCkNoZWVycywKSsOpcsO0bWUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmFtZC1nZnggbWFpbGluZyBsaXN0CmFtZC1nZnhAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v YW1kLWdmeA==