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=-13.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 85174C47094 for ; Thu, 10 Jun 2021 13:35:58 +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 309A760FF0 for ; Thu, 10 Jun 2021 13:35:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 309A760FF0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=jlekstrand.net 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 7349B6E0FC; Thu, 10 Jun 2021 13:35:57 +0000 (UTC) Received: from mail-yb1-xb29.google.com (mail-yb1-xb29.google.com [IPv6:2607:f8b0:4864:20::b29]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9F0B86E0FC for ; Thu, 10 Jun 2021 13:35:56 +0000 (UTC) Received: by mail-yb1-xb29.google.com with SMTP id f84so40881592ybg.0 for ; Thu, 10 Jun 2021 06:35:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jlekstrand-net.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=3vjkyyfTWo5/JLTKistslGmPpg9qi5iLAOCHQ+wsjTo=; b=um7xeDsMhyxbM97LuU6HQFX9UgdMtV48NQNIoJMJFJnli+6+K/Caf0CVpB23OuEPvG ompZ9/Iotw4gFu21a48lEYExxBLjHmmeNz+epYhk8GUMBw16FEfuunVva6R07Kz6LiVc zCEXiVKtN9LXqvcbzKEp30PSKiBwJ1g+q4rx5sBgHjxlBqJy8XI9FGazm8xhN1a1ERSr adiKiaN45sPl36WdKHU2Y5gHxmpiwv5c8KSzAveZ45SYJjjOiHPTIGab0pO4M3gPyR1c xEGL7trVY03xqbJNyrWg/AY5Wo8hCCJGs5NRKf9fuxwtciLCoMKfZVsEcCaHNfQCCdeJ 2xYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=3vjkyyfTWo5/JLTKistslGmPpg9qi5iLAOCHQ+wsjTo=; b=qiL3ITOOZQ+QfT5C6WRcxqsKQPfNmt5Dv1P2VscgOQp8jG4ZodFYuMyEZ5a/Xkx74c WA8jW1cvGF6BPpulWhV2l1KQeg/JH1hQOtqlOF55tztNF+rp1EBEtHrm+OhURv3cGBPq vdpUt9XtrOQWhyuKk+HHYJW1ploKK6kPAU2WyMwGjVceA/Fgdf4WAwPnL7Ctbo4t/+vz 2A9xZGNj7b3JnNuKQAspaObuq2kfwpPx6QVChNjstsa7u3N7uj5jOUwdjM3ZyuB0vs/P 8YCxoneYBffPDt+0erULQwHwM/jlNkCTDoaKK9bhUOIgTbyIWxs7oJB1N5+BSX/XYyuD i9ig== X-Gm-Message-State: AOAM531r2XBUl0RavIX5JcaKnFPAkuBnR8SlFMiuPuUDI0CdMaD9NTb3 369eLSujTamDgxFvlsUmPHhNqh4PFBHloMbp2pS2RbQJo8E+zA== X-Google-Smtp-Source: ABdhPJzHrKpsEnJPPdw7qmxdUsJf3pTApW9qYBzndAXP3FwNK/XtDkL+ziajzVcYgl/NrzCw7foqf2VNmVFqzooWZFg= X-Received: by 2002:a25:208b:: with SMTP id g133mr7001223ybg.211.1623332155132; Thu, 10 Jun 2021 06:35:55 -0700 (PDT) MIME-Version: 1.0 References: <20210609212959.471209-1-jason@jlekstrand.net> In-Reply-To: From: Jason Ekstrand Date: Thu, 10 Jun 2021 08:35:44 -0500 Message-ID: Subject: Re: [Intel-gfx] [PATCH 0/5] dma-fence, i915: Stop allowing SLAB_TYPESAFE_BY_RCU for dma_fence To: Daniel Vetter Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Tvrtko Ursulin , intel-gfx , dri-devel , Matthew Auld , Dave Airlie , =?UTF-8?Q?Christian_K=C3=B6nig?= Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Thu, Jun 10, 2021 at 6:30 AM Daniel Vetter wrot= e: > > On Thu, Jun 10, 2021 at 11:39 AM Christian K=C3=B6nig > wrote: > > Am 10.06.21 um 11:29 schrieb Tvrtko Ursulin: > > > On 09/06/2021 22:29, Jason Ekstrand wrote: > > >> Ever since 0eafec6d3244 ("drm/i915: Enable lockless lookup of reques= t > > >> tracking via RCU"), the i915 driver has used SLAB_TYPESAFE_BY_RCU (i= t > > >> was called SLAB_DESTROY_BY_RCU at the time) in order to allow RCU on > > >> i915_request. As nifty as SLAB_TYPESAFE_BY_RCU may be, it comes wit= h > > >> some serious disclaimers. In particular, objects can get recycled w= hile > > >> RCU readers are still in-flight. This can be ok if everyone who tou= ches > > >> these objects knows about the disclaimers and is careful. However, > > >> because we've chosen to use SLAB_TYPESAFE_BY_RCU for i915_request an= d > > >> because i915_request contains a dma_fence, we've leaked > > >> SLAB_TYPESAFE_BY_RCU and its whole pile of disclaimers to every driv= er > > >> in the kernel which may consume a dma_fence. > > > > > > I don't think the part about leaking is true... > > > > > >> We've tried to keep it somewhat contained by doing most of the hard = work > > >> to prevent access of recycled objects via dma_fence_get_rcu_safe(). > > >> However, a quick grep of kernel sources says that, of the 30 instanc= es > > >> of dma_fence_get_rcu*, only 11 of them use dma_fence_get_rcu_safe(). > > >> It's likely there bear traps in DRM and related subsystems just wait= ing > > >> for someone to accidentally step in them. > > > > > > ...because dma_fence_get_rcu_safe apears to be about whether the > > > *pointer* to the fence itself is rcu protected, not about the fence > > > object itself. > > > > Yes, exactly that. The fact that both of you think this either means that I've completely missed what's going on with RCUs here (possible but, in this case, I think unlikely) or RCUs on dma fences should scare us all. Yes, it protects against races on the dma_fence pointer itself. However, whether or not that dma_fence pointer lives in RCU-protected memory is immaterial AFAICT. It also does magic to deal with SLAB_TYPESAFE_BY_RCU. Let's walk through it. Please tell me if/where I go off the rails. First, let's set the scenario: The race this is protecting us against (I think) is where someone else comes along and swaps out the pointer we're trying to fetch for NULL or a different one and then drops the last reference. First, before we get to dma_fence_get_rcu_safe(), the caller has taken an RCU read lock. Then we get into the function fence =3D rcu_dereference(*fencep); if (!fence) return NULL; First, we dereference fencep and grab the pointer. There's an rcu_dereference() here which does the usual RCU magic (which I don't fully understand yet) to turn an __rcu pointer into a "real" pointer. It's possible that the pointer is NULL, if so we bail. We may have lost the race or it could be the the pointer was NULL the whole time. Doesn't matter. if (!dma_fence_get_rcu(fence)) continue; This attempts to get a reference and, if it fails continues. More on the continue later. For now, let's dive into dma_fence_get() if (kref_get_unless_zero(&fence->refcount)) return fence; else return NULL; So we try to get a reference unless it's zero. This is a pretty standard pattern and, if the dma_fence was freed with kfree_rcu(), would be all we need. If the reference count on the dma_fence drops to 0 and then the dma_fence is freed with kfree_rcu, we're guaranteed that there is an RCU grace period between when the reference count hits 0 and the memory is reclaimed. Since all this happens inside the RCU read lock, if we raced with someone attempting to swap out the pointer and drop the reference count to zero, we have one of two cases: 1. We get the old pointer but successfully take a reference. In this case, it's the same as if we were called a few cycles earlier and straight-up won the race. We get the old pointer and, because we now have a reference, the object is never freed. 2. We get the old pointer but refcount is already zero by the time we get here. In this case, kref_get_unless_zero() returns false and dma_fence_get_rcu() returns NULL. If these were the only two cases we cared about, all of dma_fence_get_rcu_safe() could be implemented as follows: static inline struct dma_fence * dma_fence_get_rcu_safe(struct dma_fence **fencep) { struct dma_fence *fence; fence =3D rcu_dereference(*fencep); if (fence) fence =3D dma_fence_get_rcu(fence); return fence; } and we we'd be done. The case the above code doesn't handle is if the thing we're racing with swaps it to a non-NULL pointer. To handle that case, we throw a loop around the whole thing as follows: static inline struct dma_fence * dma_fence_get_rcu_safe(struct dma_fence **fencep) { struct dma_fence *fence; do { fence =3D rcu_dereference(*fencep); if (!fence) return NULL; fence =3D dma_fence_get_rcu(fence); } while (!fence); return fence; } Ok, great, we've got an implementation, right? Unfortunately, this is where SLAB_TYPESAFE_BY_RCU crashes the party. The giant disclaimer about SLAB_TYPESAFE_BY_RCU is that memory gets recycled immediately and doesn't wait for an RCU grace period. You're guaranteed that memory exists at that pointer so you won't get a nasty SEGFAULT and you're guaranteed that the memory is still a dma_fence, but you're not guaranteed anything else. In particular, there's a 3rd case: 3. We get an old pointer but it's been recycled and points to a totally different dma_fence whose reference count is non-zero. In this case, rcu_dereference returns non-null and kref_get_unless_zero() succeeds but we still managed to end up with the wrong fence. To deal with 3, we do this: /* The atomic_inc_not_zero() inside dma_fence_get_rcu() * provides a full memory barrier upon success (such as now). * This is paired with the write barrier from assigning * to the __rcu protected fence pointer so that if that * pointer still matches the current fence, we know we * have successfully acquire a reference to it. If it no * longer matches, we are holding a reference to some other * reallocated pointer. This is possible if the allocator * is using a freelist like SLAB_TYPESAFE_BY_RCU where the * fence remains valid for the RCU grace period, but it * may be reallocated. When using such allocators, we are * responsible for ensuring the reference we get is to * the right fence, as below. */ if (fence =3D=3D rcu_access_pointer(*fencep)) return rcu_pointer_handoff(fence); dma_fence_put(fence); We dereference fencep one more time and check to ensure that the pointer we fetched at the start still matches. There are some serious memory barrier tricks going on here. In particular, we're depending on the fact that kref_get_unless_zero() does an atomic which means a memory barrier between when the other thread we're racing with swapped out the pointer and when the atomic happened. Assuming that the other thread swapped out the pointer BEFORE dropping the reference, we can detect the recycle race with this pointer check. If this last check succeeds, we return the fence. If it fails, then we ended up with the wrong dma_fence and we drop the reference we acquired above and try again. Again, the important issue here that causes problems is that there's no RCU grace period between the kref hitting zero and the dma_fence being recycled. If a dma_fence is freed with kfree_rcu(), we have such a grace period and it's fine. If we recycling, we can end up in all sorts of weird corners if we're not careful to ensure that the fence we got is the fence we think we got. Before I move on, there's one more important point: This can happen without SLAB_TYPESAFE_BY_RCU. Really, any dma_fence recycling scheme which doesn't ensure an RCU grace period between keref->zero and recycle will run afoul of this. SLAB_TYPESAFE_BY_RCU just happens to be the way i915 gets into this mess. > We do leak, and badly. Any __rcu protected fence pointer where a > shared fence could show up is affected. And the point of dma_fence is > that they're shareable, and we're inventing ever more ways to do so > (sync_file, drm_syncobj, implicit fencing maybe soon with > import/export ioctl on top, in/out fences in CS ioctl, atomic ioctl, > ...). > > So without a full audit anything that uses the following pattern is > probably busted: > > rcu_read_lock(); > fence =3D rcu_dereference(); > fence =3D dma_fence_get_rcu(); > rcu_read_lock(); > > /* use the fence now that we acquired a full reference */ > > And I don't mean "you might wait a bit too much" busted, but "this can > lead to loops in the dma_fence dependency chain, resulting in > deadlocks" kind of busted. Yup. > What's worse, the standard rcu lockless > access pattern is also busted completely: > > rcu_read_lock(); > fence =3D rcu_derefence(); > /* locklessly check the state of fence */ > rcu_read_unlock(); Yeah, this one's broken too. It depends on what you're doing with that state just how busted and what that breakage costs you but it's definitely busted. > because once you have TYPESAFE_BY_RCU rcu_read_lock doesn't prevent a > use-after-free anymore. The only thing it guarantees is that your > fence pointer keeps pointing at either freed memory, or a fence, but > nothing else. You have to wrap your rcu_derefence and code into a > seqlock of some kind, either a real one like dma_resv, or an > open-coded one like dma_fence_get_rcu_safe uses. And yes the latter is > a specialized seqlock, except it fails to properly document in > comments where all the required barriers are. > > tldr; all the code using dma_fence_get_rcu needs to be assumed to be brok= en. > > Heck this is fragile and tricky enough that i915 shot its own leg off > routinely (there's a bugfix floating around just now), so not even > internally we're very good at getting this right. > > > > If one has a stable pointer to a fence dma_fence_get_rcu is I think > > > enough to deal with SLAB_TYPESAFE_BY_RCU used by i915_request (as dma > > > fence is a base object there). Unless you found a bug in rq field > > > recycling. But access to the dma fence is all tightly controlled so I > > > don't get what leaks. > > > > > >> This patch series stops us using SLAB_TYPESAFE_BY_RCU for i915_reque= st > > >> and, instead, does an RCU-safe slab free via rcu_call(). This shoul= d > > >> let us keep most of the perf benefits of slab allocation while avoid= ing > > >> the bear traps inherent in SLAB_TYPESAFE_BY_RCU. It then removes > > >> support > > >> for SLAB_TYPESAFE_BY_RCU from dma_fence entirely. > > > > > > According to the rationale behind SLAB_TYPESAFE_BY_RCU traditional RC= U > > > freeing can be a lot more costly so I think we need a clear > > > justification on why this change is being considered. > > > > The problem is that SLAB_TYPESAFE_BY_RCU requires that we use a sequenc= e > > counter to make sure that we don't grab the reference to a reallocated > > dma_fence. > > > > Updating the sequence counter every time we add a fence now means two > > additions writes and one additional barrier for an extremely hot path. > > The extra overhead of RCU freeing is completely negligible compared to = that. > > > > The good news is that I think if we are just a bit more clever about ou= r > > handle we can both avoid the sequence counter and keep > > SLAB_TYPESAFE_BY_RCU around. We're already trying to do handle cleverness as described above. But, as Daniel said and I put in some commit message, we're probably only doing it in about 1/3 of the places we need to be. > You still need a seqlock, or something else that's serving as your > seqlock. dma_fence_list behind a single __rcu protected pointer, with > all subsequent fence pointers _not_ being rcu protected (i.e. full > reference, on every change we allocate might work. Which is a very > funny way of implementing something like a seqlock. > > And that only covers dma_resv, you _have_ to do this _everywhere_ in > every driver. Except if you can proof that your __rcu fence pointer > only ever points at your own driver's fences. > > So unless you're volunteering to audit all the drivers, and constantly > re-audit them (because rcu only guaranteeing type-safety but not > actually preventing use-after-free is very unusual in the kernel) just > fixing dma_resv doesn't solve the problem here at all. > > > But this needs more code cleanup and abstracting the sequence counter > > usage in a macro. > > The other thing is that this doesn't even make sense for i915 anymore. I'm not sure I'd go that far. Yes, we've got the ULLS hack but i915_request is going to stay around for a while. What's really overblown here is the bazillions of requests. GL drivers submit tens or maybe 100ish batches per frame. Media has to ping-pong a bit more but it should still be < 1000/second. If we're really dma_fence_release-bound, we're in a microbenchmark. --Jason > The solution to the "userspace wants to submit bazillion requests" > problem is direct userspace submit. Current hw doesn't have userspace > ringbuffer, but we have a pretty clever trick in the works to make > this possible with current hw, essentially by submitting a CS that > loops on itself, and then inserting batches into this "ring" by > latching a conditional branch in this CS. It's not pretty, but it gets > the job done and outright removes the need for plaid mode throughput > of i915_request dma fences. > -Daniel > > > > > Regards, > > Christian. > > > > > > > > > > Regards, > > > > > > Tvrtko > > > > > >> > > >> Note: The last patch is labled DONOTMERGE. This was at Daniel Vette= r's > > >> request as we may want to let this bake for a couple releases before= we > > >> rip out dma_fence_get_rcu_safe entirely. > > >> > > >> Signed-off-by: Jason Ekstrand > > >> Cc: Jon Bloomfield > > >> Cc: Daniel Vetter > > >> Cc: Christian K=C3=B6nig > > >> Cc: Dave Airlie > > >> Cc: Matthew Auld > > >> Cc: Maarten Lankhorst > > >> > > >> Jason Ekstrand (5): > > >> drm/i915: Move intel_engine_free_request_pool to i915_request.c > > >> drm/i915: Use a simpler scheme for caching i915_request > > >> drm/i915: Stop using SLAB_TYPESAFE_BY_RCU for i915_request > > >> dma-buf: Stop using SLAB_TYPESAFE_BY_RCU in selftests > > >> DONOTMERGE: dma-buf: Get rid of dma_fence_get_rcu_safe > > >> > > >> drivers/dma-buf/dma-fence-chain.c | 8 +- > > >> drivers/dma-buf/dma-resv.c | 4 +- > > >> drivers/dma-buf/st-dma-fence-chain.c | 24 +--- > > >> drivers/dma-buf/st-dma-fence.c | 27 +--- > > >> drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 4 +- > > >> drivers/gpu/drm/i915/gt/intel_engine_cs.c | 8 -- > > >> drivers/gpu/drm/i915/i915_active.h | 4 +- > > >> drivers/gpu/drm/i915/i915_request.c | 147 ++++++++++++------= ---- > > >> drivers/gpu/drm/i915/i915_request.h | 2 - > > >> drivers/gpu/drm/i915/i915_vma.c | 4 +- > > >> include/drm/drm_syncobj.h | 4 +- > > >> include/linux/dma-fence.h | 50 -------- > > >> include/linux/dma-resv.h | 4 +- > > >> 13 files changed, 110 insertions(+), 180 deletions(-) > > >> > > > > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch 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=-13.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 683E1C48BDF for ; Thu, 10 Jun 2021 13:36:03 +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 25E6A610C7 for ; Thu, 10 Jun 2021 13:36:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 25E6A610C7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=jlekstrand.net Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7E2CA6E849; Thu, 10 Jun 2021 13:35:58 +0000 (UTC) Received: from mail-yb1-xb35.google.com (mail-yb1-xb35.google.com [IPv6:2607:f8b0:4864:20::b35]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7C4646E0FC for ; Thu, 10 Jun 2021 13:35:56 +0000 (UTC) Received: by mail-yb1-xb35.google.com with SMTP id b13so40793044ybk.4 for ; Thu, 10 Jun 2021 06:35:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jlekstrand-net.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=3vjkyyfTWo5/JLTKistslGmPpg9qi5iLAOCHQ+wsjTo=; b=um7xeDsMhyxbM97LuU6HQFX9UgdMtV48NQNIoJMJFJnli+6+K/Caf0CVpB23OuEPvG ompZ9/Iotw4gFu21a48lEYExxBLjHmmeNz+epYhk8GUMBw16FEfuunVva6R07Kz6LiVc zCEXiVKtN9LXqvcbzKEp30PSKiBwJ1g+q4rx5sBgHjxlBqJy8XI9FGazm8xhN1a1ERSr adiKiaN45sPl36WdKHU2Y5gHxmpiwv5c8KSzAveZ45SYJjjOiHPTIGab0pO4M3gPyR1c xEGL7trVY03xqbJNyrWg/AY5Wo8hCCJGs5NRKf9fuxwtciLCoMKfZVsEcCaHNfQCCdeJ 2xYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=3vjkyyfTWo5/JLTKistslGmPpg9qi5iLAOCHQ+wsjTo=; b=iXOZFspBbODCREU0oZ/reJlOH+sjS1LxlxbF4i9PtijoxA92zHOBQ/DWt1qv6o8aQP hxYe/yiRCLP/bItk4UnvNJkurPd48RDD6YS/6M8+9XGA60SXJ3hiHn5oeQqhV/1TaFCs OVVInVKauNIw7XeXxoi8vlPNBTLRw/dLVMxVd1kHMO1Ac1n2eqPP8J7UJXJWxgFFcS3h GFJu8qtcX972JD4AzmfKTe7cxxPJAdVZ1pVgEr4RgPmwUAtqWF67wJwHoKoP1wX5Q66g OI2RYTxyD1zriIcaq7U1qOZNGXHmULWn6f2brWYPcXdF9RXiieXMOx0J1IsUy2MtLqor ABKg== X-Gm-Message-State: AOAM530629KY3C0H+Ud9w16T+mVRFiUEEpn6budowlCgJsOzb9oPZuKt S/pTBjwuRQbODvJtEE9uHl17JRmHU7EvTVOGmcxqPg== X-Google-Smtp-Source: ABdhPJzHrKpsEnJPPdw7qmxdUsJf3pTApW9qYBzndAXP3FwNK/XtDkL+ziajzVcYgl/NrzCw7foqf2VNmVFqzooWZFg= X-Received: by 2002:a25:208b:: with SMTP id g133mr7001223ybg.211.1623332155132; Thu, 10 Jun 2021 06:35:55 -0700 (PDT) MIME-Version: 1.0 References: <20210609212959.471209-1-jason@jlekstrand.net> In-Reply-To: From: Jason Ekstrand Date: Thu, 10 Jun 2021 08:35:44 -0500 Message-ID: To: Daniel Vetter Subject: Re: [Intel-gfx] [PATCH 0/5] dma-fence, i915: Stop allowing SLAB_TYPESAFE_BY_RCU for dma_fence X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gfx , dri-devel , Matthew Auld , Dave Airlie , =?UTF-8?Q?Christian_K=C3=B6nig?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gVGh1LCBKdW4gMTAsIDIwMjEgYXQgNjozMCBBTSBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0 dGVyQGZmd2xsLmNoPiB3cm90ZToKPgo+IE9uIFRodSwgSnVuIDEwLCAyMDIxIGF0IDExOjM5IEFN IENocmlzdGlhbiBLw7ZuaWcKPiA8Y2hyaXN0aWFuLmtvZW5pZ0BhbWQuY29tPiB3cm90ZToKPiA+ IEFtIDEwLjA2LjIxIHVtIDExOjI5IHNjaHJpZWIgVHZydGtvIFVyc3VsaW46Cj4gPiA+IE9uIDA5 LzA2LzIwMjEgMjI6MjksIEphc29uIEVrc3RyYW5kIHdyb3RlOgo+ID4gPj4gRXZlciBzaW5jZSAw ZWFmZWM2ZDMyNDQgKCJkcm0vaTkxNTogRW5hYmxlIGxvY2tsZXNzIGxvb2t1cCBvZiByZXF1ZXN0 Cj4gPiA+PiB0cmFja2luZyB2aWEgUkNVIiksIHRoZSBpOTE1IGRyaXZlciBoYXMgdXNlZCBTTEFC X1RZUEVTQUZFX0JZX1JDVSAoaXQKPiA+ID4+IHdhcyBjYWxsZWQgU0xBQl9ERVNUUk9ZX0JZX1JD VSBhdCB0aGUgdGltZSkgaW4gb3JkZXIgdG8gYWxsb3cgUkNVIG9uCj4gPiA+PiBpOTE1X3JlcXVl c3QuICBBcyBuaWZ0eSBhcyBTTEFCX1RZUEVTQUZFX0JZX1JDVSBtYXkgYmUsIGl0IGNvbWVzIHdp dGgKPiA+ID4+IHNvbWUgc2VyaW91cyBkaXNjbGFpbWVycy4gIEluIHBhcnRpY3VsYXIsIG9iamVj dHMgY2FuIGdldCByZWN5Y2xlZCB3aGlsZQo+ID4gPj4gUkNVIHJlYWRlcnMgYXJlIHN0aWxsIGlu LWZsaWdodC4gIFRoaXMgY2FuIGJlIG9rIGlmIGV2ZXJ5b25lIHdobyB0b3VjaGVzCj4gPiA+PiB0 aGVzZSBvYmplY3RzIGtub3dzIGFib3V0IHRoZSBkaXNjbGFpbWVycyBhbmQgaXMgY2FyZWZ1bC4g SG93ZXZlciwKPiA+ID4+IGJlY2F1c2Ugd2UndmUgY2hvc2VuIHRvIHVzZSBTTEFCX1RZUEVTQUZF X0JZX1JDVSBmb3IgaTkxNV9yZXF1ZXN0IGFuZAo+ID4gPj4gYmVjYXVzZSBpOTE1X3JlcXVlc3Qg Y29udGFpbnMgYSBkbWFfZmVuY2UsIHdlJ3ZlIGxlYWtlZAo+ID4gPj4gU0xBQl9UWVBFU0FGRV9C WV9SQ1UgYW5kIGl0cyB3aG9sZSBwaWxlIG9mIGRpc2NsYWltZXJzIHRvIGV2ZXJ5IGRyaXZlcgo+ ID4gPj4gaW4gdGhlIGtlcm5lbCB3aGljaCBtYXkgY29uc3VtZSBhIGRtYV9mZW5jZS4KPiA+ID4K PiA+ID4gSSBkb24ndCB0aGluayB0aGUgcGFydCBhYm91dCBsZWFraW5nIGlzIHRydWUuLi4KPiA+ ID4KPiA+ID4+IFdlJ3ZlIHRyaWVkIHRvIGtlZXAgaXQgc29tZXdoYXQgY29udGFpbmVkIGJ5IGRv aW5nIG1vc3Qgb2YgdGhlIGhhcmQgd29yawo+ID4gPj4gdG8gcHJldmVudCBhY2Nlc3Mgb2YgcmVj eWNsZWQgb2JqZWN0cyB2aWEgZG1hX2ZlbmNlX2dldF9yY3Vfc2FmZSgpLgo+ID4gPj4gSG93ZXZl ciwgYSBxdWljayBncmVwIG9mIGtlcm5lbCBzb3VyY2VzIHNheXMgdGhhdCwgb2YgdGhlIDMwIGlu c3RhbmNlcwo+ID4gPj4gb2YgZG1hX2ZlbmNlX2dldF9yY3UqLCBvbmx5IDExIG9mIHRoZW0gdXNl IGRtYV9mZW5jZV9nZXRfcmN1X3NhZmUoKS4KPiA+ID4+IEl0J3MgbGlrZWx5IHRoZXJlIGJlYXIg dHJhcHMgaW4gRFJNIGFuZCByZWxhdGVkIHN1YnN5c3RlbXMganVzdCB3YWl0aW5nCj4gPiA+PiBm b3Igc29tZW9uZSB0byBhY2NpZGVudGFsbHkgc3RlcCBpbiB0aGVtLgo+ID4gPgo+ID4gPiAuLi5i ZWNhdXNlIGRtYV9mZW5jZV9nZXRfcmN1X3NhZmUgYXBlYXJzIHRvIGJlIGFib3V0IHdoZXRoZXIg dGhlCj4gPiA+ICpwb2ludGVyKiB0byB0aGUgZmVuY2UgaXRzZWxmIGlzIHJjdSBwcm90ZWN0ZWQs IG5vdCBhYm91dCB0aGUgZmVuY2UKPiA+ID4gb2JqZWN0IGl0c2VsZi4KPiA+Cj4gPiBZZXMsIGV4 YWN0bHkgdGhhdC4KClRoZSBmYWN0IHRoYXQgYm90aCBvZiB5b3UgdGhpbmsgdGhpcyBlaXRoZXIg bWVhbnMgdGhhdCBJJ3ZlIGNvbXBsZXRlbHkKbWlzc2VkIHdoYXQncyBnb2luZyBvbiB3aXRoIFJD VXMgaGVyZSAocG9zc2libGUgYnV0LCBpbiB0aGlzIGNhc2UsIEkKdGhpbmsgdW5saWtlbHkpIG9y IFJDVXMgb24gZG1hIGZlbmNlcyBzaG91bGQgc2NhcmUgdXMgYWxsLiAgWWVzLCBpdApwcm90ZWN0 cyBhZ2FpbnN0IHJhY2VzIG9uIHRoZSBkbWFfZmVuY2UgcG9pbnRlciBpdHNlbGYuICBIb3dldmVy LAp3aGV0aGVyIG9yIG5vdCB0aGF0IGRtYV9mZW5jZSBwb2ludGVyIGxpdmVzIGluIFJDVS1wcm90 ZWN0ZWQgbWVtb3J5IGlzCmltbWF0ZXJpYWwgQUZBSUNULiAgSXQgYWxzbyBkb2VzIG1hZ2ljIHRv IGRlYWwgd2l0aApTTEFCX1RZUEVTQUZFX0JZX1JDVS4gIExldCdzIHdhbGsgdGhyb3VnaCBpdC4g IFBsZWFzZSB0ZWxsIG1lIGlmL3doZXJlCkkgZ28gb2ZmIHRoZSByYWlscy4KCkZpcnN0LCBsZXQn cyBzZXQgdGhlIHNjZW5hcmlvOiAgVGhlIHJhY2UgdGhpcyBpcyBwcm90ZWN0aW5nIHVzIGFnYWlu c3QKKEkgdGhpbmspIGlzIHdoZXJlIHNvbWVvbmUgZWxzZSBjb21lcyBhbG9uZyBhbmQgc3dhcHMg b3V0IHRoZSBwb2ludGVyCndlJ3JlIHRyeWluZyB0byBmZXRjaCBmb3IgTlVMTCBvciBhIGRpZmZl cmVudCBvbmUgYW5kIHRoZW4gZHJvcHMgdGhlCmxhc3QgcmVmZXJlbmNlLgoKRmlyc3QsIGJlZm9y ZSB3ZSBnZXQgdG8gZG1hX2ZlbmNlX2dldF9yY3Vfc2FmZSgpLCB0aGUgY2FsbGVyIGhhcyB0YWtl bgphbiBSQ1UgcmVhZCBsb2NrLiAgVGhlbiB3ZSBnZXQgaW50byB0aGUgZnVuY3Rpb24KCiAgICBm ZW5jZSA9IHJjdV9kZXJlZmVyZW5jZSgqZmVuY2VwKTsKICAgIGlmICghZmVuY2UpCiAgICAgICAg cmV0dXJuIE5VTEw7CgpGaXJzdCwgd2UgZGVyZWZlcmVuY2UgZmVuY2VwIGFuZCBncmFiIHRoZSBw b2ludGVyLiAgVGhlcmUncyBhbgpyY3VfZGVyZWZlcmVuY2UoKSBoZXJlIHdoaWNoIGRvZXMgdGhl IHVzdWFsIFJDVSBtYWdpYyAod2hpY2ggSSBkb24ndApmdWxseSB1bmRlcnN0YW5kIHlldCkgdG8g dHVybiBhbiBfX3JjdSBwb2ludGVyIGludG8gYSAicmVhbCIgcG9pbnRlci4KSXQncyBwb3NzaWJs ZSB0aGF0IHRoZSBwb2ludGVyIGlzIE5VTEwsIGlmIHNvIHdlIGJhaWwuICBXZSBtYXkgaGF2ZQps b3N0IHRoZSByYWNlIG9yIGl0IGNvdWxkIGJlIHRoZSB0aGUgcG9pbnRlciB3YXMgTlVMTCB0aGUg d2hvbGUgdGltZS4KRG9lc24ndCBtYXR0ZXIuCgogICAgaWYgKCFkbWFfZmVuY2VfZ2V0X3JjdShm ZW5jZSkpCiAgICAgICAgY29udGludWU7CgpUaGlzIGF0dGVtcHRzIHRvIGdldCBhIHJlZmVyZW5j ZSBhbmQsIGlmIGl0IGZhaWxzIGNvbnRpbnVlcy4gIE1vcmUgb24KdGhlIGNvbnRpbnVlIGxhdGVy LiAgRm9yIG5vdywgbGV0J3MgZGl2ZSBpbnRvIGRtYV9mZW5jZV9nZXQoKQoKICAgIGlmIChrcmVm X2dldF91bmxlc3NfemVybygmZmVuY2UtPnJlZmNvdW50KSkKICAgICAgICByZXR1cm4gZmVuY2U7 CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIE5VTEw7CgpTbyB3ZSB0cnkgdG8gZ2V0IGEgcmVmZXJl bmNlIHVubGVzcyBpdCdzIHplcm8uICBUaGlzIGlzIGEgcHJldHR5CnN0YW5kYXJkIHBhdHRlcm4g YW5kLCBpZiB0aGUgZG1hX2ZlbmNlIHdhcyBmcmVlZCB3aXRoIGtmcmVlX3JjdSgpLAp3b3VsZCBi ZSBhbGwgd2UgbmVlZC4gIElmIHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIGRtYV9mZW5jZSBk cm9wcwp0byAwIGFuZCB0aGVuIHRoZSBkbWFfZmVuY2UgaXMgZnJlZWQgd2l0aCBrZnJlZV9yY3Us IHdlJ3JlIGd1YXJhbnRlZWQKdGhhdCB0aGVyZSBpcyBhbiBSQ1UgZ3JhY2UgcGVyaW9kIGJldHdl ZW4gd2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50CmhpdHMgMCBhbmQgdGhlIG1lbW9yeSBpcyByZWNs YWltZWQuICBTaW5jZSBhbGwgdGhpcyBoYXBwZW5zIGluc2lkZSB0aGUKUkNVIHJlYWQgbG9jaywg aWYgd2UgcmFjZWQgd2l0aCBzb21lb25lIGF0dGVtcHRpbmcgdG8gc3dhcCBvdXQgdGhlCnBvaW50 ZXIgYW5kIGRyb3AgdGhlIHJlZmVyZW5jZSBjb3VudCB0byB6ZXJvLCB3ZSBoYXZlIG9uZSBvZiB0 d28KY2FzZXM6CgogMS4gV2UgZ2V0IHRoZSBvbGQgcG9pbnRlciBidXQgc3VjY2Vzc2Z1bGx5IHRh a2UgYSByZWZlcmVuY2UuICBJbiB0aGlzCmNhc2UsIGl0J3MgdGhlIHNhbWUgYXMgaWYgd2Ugd2Vy ZSBjYWxsZWQgYSBmZXcgY3ljbGVzIGVhcmxpZXIgYW5kCnN0cmFpZ2h0LXVwIHdvbiB0aGUgcmFj ZS4gIFdlIGdldCB0aGUgb2xkIHBvaW50ZXIgYW5kLCBiZWNhdXNlIHdlIG5vdwpoYXZlIGEgcmVm ZXJlbmNlLCB0aGUgb2JqZWN0IGlzIG5ldmVyIGZyZWVkLgoKIDIuIFdlIGdldCB0aGUgb2xkIHBv aW50ZXIgYnV0IHJlZmNvdW50IGlzIGFscmVhZHkgemVybyBieSB0aGUgdGltZSB3ZQpnZXQgaGVy ZS4gIEluIHRoaXMgY2FzZSwga3JlZl9nZXRfdW5sZXNzX3plcm8oKSByZXR1cm5zIGZhbHNlIGFu ZApkbWFfZmVuY2VfZ2V0X3JjdSgpIHJldHVybnMgTlVMTC4KCklmIHRoZXNlIHdlcmUgdGhlIG9u bHkgdHdvIGNhc2VzIHdlIGNhcmVkIGFib3V0LCBhbGwgb2YKZG1hX2ZlbmNlX2dldF9yY3Vfc2Fm ZSgpIGNvdWxkIGJlIGltcGxlbWVudGVkIGFzIGZvbGxvd3M6CgpzdGF0aWMgaW5saW5lIHN0cnVj dCBkbWFfZmVuY2UgKgpkbWFfZmVuY2VfZ2V0X3JjdV9zYWZlKHN0cnVjdCBkbWFfZmVuY2UgKipm ZW5jZXApCnsKICAgIHN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlOwoKICAgIGZlbmNlID0gcmN1X2Rl cmVmZXJlbmNlKCpmZW5jZXApOwogICAgaWYgKGZlbmNlKQogICAgICAgIGZlbmNlID0gZG1hX2Zl bmNlX2dldF9yY3UoZmVuY2UpOwoKICAgIHJldHVybiBmZW5jZTsKfQoKYW5kIHdlIHdlJ2QgYmUg ZG9uZS4gIFRoZSBjYXNlIHRoZSBhYm92ZSBjb2RlIGRvZXNuJ3QgaGFuZGxlIGlzIGlmIHRoZQp0 aGluZyB3ZSdyZSByYWNpbmcgd2l0aCBzd2FwcyBpdCB0byBhIG5vbi1OVUxMIHBvaW50ZXIuICBU byBoYW5kbGUKdGhhdCBjYXNlLCB3ZSB0aHJvdyBhIGxvb3AgYXJvdW5kIHRoZSB3aG9sZSB0aGlu ZyBhcyBmb2xsb3dzOgoKc3RhdGljIGlubGluZSBzdHJ1Y3QgZG1hX2ZlbmNlICoKZG1hX2ZlbmNl X2dldF9yY3Vfc2FmZShzdHJ1Y3QgZG1hX2ZlbmNlICoqZmVuY2VwKQp7CiAgICBzdHJ1Y3QgZG1h X2ZlbmNlICpmZW5jZTsKCiAgICBkbyB7CiAgICAgICAgZmVuY2UgPSByY3VfZGVyZWZlcmVuY2Uo KmZlbmNlcCk7CiAgICAgICAgaWYgKCFmZW5jZSkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cgog ICAgICAgIGZlbmNlID0gZG1hX2ZlbmNlX2dldF9yY3UoZmVuY2UpOwogICAgfSB3aGlsZSAoIWZl bmNlKTsKCiAgICByZXR1cm4gZmVuY2U7Cn0KCk9rLCBncmVhdCwgd2UndmUgZ290IGFuIGltcGxl bWVudGF0aW9uLCByaWdodD8gIFVuZm9ydHVuYXRlbHksIHRoaXMgaXMKd2hlcmUgU0xBQl9UWVBF U0FGRV9CWV9SQ1UgY3Jhc2hlcyB0aGUgcGFydHkuICBUaGUgZ2lhbnQgZGlzY2xhaW1lcgphYm91 dCBTTEFCX1RZUEVTQUZFX0JZX1JDVSBpcyB0aGF0IG1lbW9yeSBnZXRzIHJlY3ljbGVkIGltbWVk aWF0ZWx5CmFuZCBkb2Vzbid0IHdhaXQgZm9yIGFuIFJDVSBncmFjZSBwZXJpb2QuICBZb3UncmUg Z3VhcmFudGVlZCB0aGF0Cm1lbW9yeSBleGlzdHMgYXQgdGhhdCBwb2ludGVyIHNvIHlvdSB3b24n dCBnZXQgYSBuYXN0eSBTRUdGQVVMVCBhbmQKeW91J3JlIGd1YXJhbnRlZWQgdGhhdCB0aGUgbWVt b3J5IGlzIHN0aWxsIGEgZG1hX2ZlbmNlLCBidXQgeW91J3JlIG5vdApndWFyYW50ZWVkIGFueXRo aW5nIGVsc2UuICBJbiBwYXJ0aWN1bGFyLCB0aGVyZSdzIGEgM3JkIGNhc2U6CgogMy4gV2UgZ2V0 IGFuIG9sZCBwb2ludGVyIGJ1dCBpdCdzIGJlZW4gcmVjeWNsZWQgYW5kIHBvaW50cyB0byBhCnRv dGFsbHkgZGlmZmVyZW50IGRtYV9mZW5jZSB3aG9zZSByZWZlcmVuY2UgY291bnQgaXMgbm9uLXpl cm8uICBJbgp0aGlzIGNhc2UsIHJjdV9kZXJlZmVyZW5jZSByZXR1cm5zIG5vbi1udWxsIGFuZCBr cmVmX2dldF91bmxlc3NfemVybygpCnN1Y2NlZWRzIGJ1dCB3ZSBzdGlsbCBtYW5hZ2VkIHRvIGVu ZCB1cCB3aXRoIHRoZSB3cm9uZyBmZW5jZS4KClRvIGRlYWwgd2l0aCAzLCB3ZSBkbyB0aGlzOgoK ICAgIC8qIFRoZSBhdG9taWNfaW5jX25vdF96ZXJvKCkgaW5zaWRlIGRtYV9mZW5jZV9nZXRfcmN1 KCkKICAgICAqIHByb3ZpZGVzIGEgZnVsbCBtZW1vcnkgYmFycmllciB1cG9uIHN1Y2Nlc3MgKHN1 Y2ggYXMgbm93KS4KICAgICAqIFRoaXMgaXMgcGFpcmVkIHdpdGggdGhlIHdyaXRlIGJhcnJpZXIg ZnJvbSBhc3NpZ25pbmcKICAgICAqIHRvIHRoZSBfX3JjdSBwcm90ZWN0ZWQgZmVuY2UgcG9pbnRl ciBzbyB0aGF0IGlmIHRoYXQKICAgICAqIHBvaW50ZXIgc3RpbGwgbWF0Y2hlcyB0aGUgY3VycmVu dCBmZW5jZSwgd2Uga25vdyB3ZQogICAgICogaGF2ZSBzdWNjZXNzZnVsbHkgYWNxdWlyZSBhIHJl ZmVyZW5jZSB0byBpdC4gSWYgaXQgbm8KICAgICAqIGxvbmdlciBtYXRjaGVzLCB3ZSBhcmUgaG9s ZGluZyBhIHJlZmVyZW5jZSB0byBzb21lIG90aGVyCiAgICAgKiByZWFsbG9jYXRlZCBwb2ludGVy LiBUaGlzIGlzIHBvc3NpYmxlIGlmIHRoZSBhbGxvY2F0b3IKICAgICAqIGlzIHVzaW5nIGEgZnJl ZWxpc3QgbGlrZSBTTEFCX1RZUEVTQUZFX0JZX1JDVSB3aGVyZSB0aGUKICAgICAqIGZlbmNlIHJl bWFpbnMgdmFsaWQgZm9yIHRoZSBSQ1UgZ3JhY2UgcGVyaW9kLCBidXQgaXQKICAgICAqIG1heSBi ZSByZWFsbG9jYXRlZC4gV2hlbiB1c2luZyBzdWNoIGFsbG9jYXRvcnMsIHdlIGFyZQogICAgICog cmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoZSByZWZlcmVuY2Ugd2UgZ2V0IGlzIHRvCiAgICAg KiB0aGUgcmlnaHQgZmVuY2UsIGFzIGJlbG93LgogICAgICovCiAgICBpZiAoZmVuY2UgPT0gcmN1 X2FjY2Vzc19wb2ludGVyKCpmZW5jZXApKQogICAgICAgIHJldHVybiByY3VfcG9pbnRlcl9oYW5k b2ZmKGZlbmNlKTsKCiAgICBkbWFfZmVuY2VfcHV0KGZlbmNlKTsKCldlIGRlcmVmZXJlbmNlIGZl bmNlcCBvbmUgbW9yZSB0aW1lIGFuZCBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUKcG9pbnRlciB3 ZSBmZXRjaGVkIGF0IHRoZSBzdGFydCBzdGlsbCBtYXRjaGVzLiAgVGhlcmUgYXJlIHNvbWUgc2Vy aW91cwptZW1vcnkgYmFycmllciB0cmlja3MgZ29pbmcgb24gaGVyZS4gIEluIHBhcnRpY3VsYXIs IHdlJ3JlIGRlcGVuZGluZwpvbiB0aGUgZmFjdCB0aGF0IGtyZWZfZ2V0X3VubGVzc196ZXJvKCkg ZG9lcyBhbiBhdG9taWMgd2hpY2ggbWVhbnMgYQptZW1vcnkgYmFycmllciBiZXR3ZWVuIHdoZW4g dGhlIG90aGVyIHRocmVhZCB3ZSdyZSByYWNpbmcgd2l0aCBzd2FwcGVkCm91dCB0aGUgcG9pbnRl ciBhbmQgd2hlbiB0aGUgYXRvbWljIGhhcHBlbmVkLiAgQXNzdW1pbmcgdGhhdCB0aGUgb3RoZXIK dGhyZWFkIHN3YXBwZWQgb3V0IHRoZSBwb2ludGVyIEJFRk9SRSBkcm9wcGluZyB0aGUgcmVmZXJl bmNlLCB3ZSBjYW4KZGV0ZWN0IHRoZSByZWN5Y2xlIHJhY2Ugd2l0aCB0aGlzIHBvaW50ZXIgY2hl Y2suICBJZiB0aGlzIGxhc3QgY2hlY2sKc3VjY2VlZHMsIHdlIHJldHVybiB0aGUgZmVuY2UuICBJ ZiBpdCBmYWlscywgdGhlbiB3ZSBlbmRlZCB1cCB3aXRoIHRoZQp3cm9uZyBkbWFfZmVuY2UgYW5k IHdlIGRyb3AgdGhlIHJlZmVyZW5jZSB3ZSBhY3F1aXJlZCBhYm92ZSBhbmQgdHJ5CmFnYWluLgoK QWdhaW4sIHRoZSBpbXBvcnRhbnQgaXNzdWUgaGVyZSB0aGF0IGNhdXNlcyBwcm9ibGVtcyBpcyB0 aGF0IHRoZXJlJ3MKbm8gUkNVIGdyYWNlIHBlcmlvZCBiZXR3ZWVuIHRoZSBrcmVmIGhpdHRpbmcg emVybyBhbmQgdGhlIGRtYV9mZW5jZQpiZWluZyByZWN5Y2xlZC4gIElmIGEgZG1hX2ZlbmNlIGlz IGZyZWVkIHdpdGgga2ZyZWVfcmN1KCksIHdlIGhhdmUKc3VjaCBhIGdyYWNlIHBlcmlvZCBhbmQg aXQncyBmaW5lLiAgSWYgd2UgcmVjeWNsaW5nLCB3ZSBjYW4gZW5kIHVwIGluCmFsbCBzb3J0cyBv ZiB3ZWlyZCBjb3JuZXJzIGlmIHdlJ3JlIG5vdCBjYXJlZnVsIHRvIGVuc3VyZSB0aGF0IHRoZQpm ZW5jZSB3ZSBnb3QgaXMgdGhlIGZlbmNlIHdlIHRoaW5rIHdlIGdvdC4KCkJlZm9yZSBJIG1vdmUg b24sIHRoZXJlJ3Mgb25lIG1vcmUgaW1wb3J0YW50IHBvaW50OiAgVGhpcyBjYW4gaGFwcGVuCndp dGhvdXQgU0xBQl9UWVBFU0FGRV9CWV9SQ1UuICBSZWFsbHksIGFueSBkbWFfZmVuY2UgcmVjeWNs aW5nIHNjaGVtZQp3aGljaCBkb2Vzbid0IGVuc3VyZSBhbiBSQ1UgZ3JhY2UgcGVyaW9kIGJldHdl ZW4ga2VyZWYtPnplcm8gYW5kCnJlY3ljbGUgd2lsbCBydW4gYWZvdWwgb2YgdGhpcy4gIFNMQUJf VFlQRVNBRkVfQllfUkNVIGp1c3QgaGFwcGVucyB0bwpiZSB0aGUgd2F5IGk5MTUgZ2V0cyBpbnRv IHRoaXMgbWVzcy4KCj4gV2UgZG8gbGVhaywgYW5kIGJhZGx5LiBBbnkgX19yY3UgcHJvdGVjdGVk IGZlbmNlIHBvaW50ZXIgd2hlcmUgYQo+IHNoYXJlZCBmZW5jZSBjb3VsZCBzaG93IHVwIGlzIGFm ZmVjdGVkLiBBbmQgdGhlIHBvaW50IG9mIGRtYV9mZW5jZSBpcwo+IHRoYXQgdGhleSdyZSBzaGFy ZWFibGUsIGFuZCB3ZSdyZSBpbnZlbnRpbmcgZXZlciBtb3JlIHdheXMgdG8gZG8gc28KPiAoc3lu Y19maWxlLCBkcm1fc3luY29iaiwgaW1wbGljaXQgZmVuY2luZyBtYXliZSBzb29uIHdpdGgKPiBp bXBvcnQvZXhwb3J0IGlvY3RsIG9uIHRvcCwgaW4vb3V0IGZlbmNlcyBpbiBDUyBpb2N0bCwgYXRv bWljIGlvY3RsLAo+IC4uLikuCj4KPiBTbyB3aXRob3V0IGEgZnVsbCBhdWRpdCBhbnl0aGluZyB0 aGF0IHVzZXMgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIGlzCj4gcHJvYmFibHkgYnVzdGVkOgo+Cj4g cmN1X3JlYWRfbG9jaygpOwo+IGZlbmNlID0gcmN1X2RlcmVmZXJlbmNlKCk7Cj4gZmVuY2UgPSBk bWFfZmVuY2VfZ2V0X3JjdSgpOwo+IHJjdV9yZWFkX2xvY2soKTsKPgo+IC8qIHVzZSB0aGUgZmVu Y2Ugbm93IHRoYXQgd2UgYWNxdWlyZWQgYSBmdWxsIHJlZmVyZW5jZSAqLwo+Cj4gQW5kIEkgZG9u J3QgbWVhbiAieW91IG1pZ2h0IHdhaXQgYSBiaXQgdG9vIG11Y2giIGJ1c3RlZCwgYnV0ICJ0aGlz IGNhbgo+IGxlYWQgdG8gbG9vcHMgaW4gdGhlIGRtYV9mZW5jZSBkZXBlbmRlbmN5IGNoYWluLCBy ZXN1bHRpbmcgaW4KPiBkZWFkbG9ja3MiIGtpbmQgb2YgYnVzdGVkLgoKWXVwLgoKPiBXaGF0J3Mg d29yc2UsIHRoZSBzdGFuZGFyZCByY3UgbG9ja2xlc3MKPiBhY2Nlc3MgcGF0dGVybiBpcyBhbHNv IGJ1c3RlZCBjb21wbGV0ZWx5Ogo+Cj4gcmN1X3JlYWRfbG9jaygpOwo+IGZlbmNlID0gcmN1X2Rl cmVmZW5jZSgpOwo+IC8qIGxvY2tsZXNzbHkgY2hlY2sgdGhlIHN0YXRlIG9mIGZlbmNlICovCj4g cmN1X3JlYWRfdW5sb2NrKCk7CgpZZWFoLCB0aGlzIG9uZSdzIGJyb2tlbiB0b28uICBJdCBkZXBl bmRzIG9uIHdoYXQgeW91J3JlIGRvaW5nIHdpdGgKdGhhdCBzdGF0ZSBqdXN0IGhvdyBidXN0ZWQg YW5kIHdoYXQgdGhhdCBicmVha2FnZSBjb3N0cyB5b3UgYnV0IGl0J3MKZGVmaW5pdGVseSBidXN0 ZWQuCgo+IGJlY2F1c2Ugb25jZSB5b3UgaGF2ZSBUWVBFU0FGRV9CWV9SQ1UgcmN1X3JlYWRfbG9j ayBkb2Vzbid0IHByZXZlbnQgYQo+IHVzZS1hZnRlci1mcmVlIGFueW1vcmUuIFRoZSBvbmx5IHRo aW5nIGl0IGd1YXJhbnRlZXMgaXMgdGhhdCB5b3VyCj4gZmVuY2UgcG9pbnRlciBrZWVwcyBwb2lu dGluZyBhdCBlaXRoZXIgZnJlZWQgbWVtb3J5LCBvciBhIGZlbmNlLCBidXQKPiBub3RoaW5nIGVs c2UuIFlvdSBoYXZlIHRvIHdyYXAgeW91ciByY3VfZGVyZWZlbmNlIGFuZCBjb2RlIGludG8gYQo+ IHNlcWxvY2sgb2Ygc29tZSBraW5kLCBlaXRoZXIgYSByZWFsIG9uZSBsaWtlIGRtYV9yZXN2LCBv ciBhbgo+IG9wZW4tY29kZWQgb25lIGxpa2UgZG1hX2ZlbmNlX2dldF9yY3Vfc2FmZSB1c2VzLiBB bmQgeWVzIHRoZSBsYXR0ZXIgaXMKPiBhIHNwZWNpYWxpemVkIHNlcWxvY2ssIGV4Y2VwdCBpdCBm YWlscyB0byBwcm9wZXJseSBkb2N1bWVudCBpbgo+IGNvbW1lbnRzIHdoZXJlIGFsbCB0aGUgcmVx dWlyZWQgYmFycmllcnMgYXJlLgo+Cj4gdGxkcjsgYWxsIHRoZSBjb2RlIHVzaW5nIGRtYV9mZW5j ZV9nZXRfcmN1IG5lZWRzIHRvIGJlIGFzc3VtZWQgdG8gYmUgYnJva2VuLgo+Cj4gSGVjayB0aGlz IGlzIGZyYWdpbGUgYW5kIHRyaWNreSBlbm91Z2ggdGhhdCBpOTE1IHNob3QgaXRzIG93biBsZWcg b2ZmCj4gcm91dGluZWx5ICh0aGVyZSdzIGEgYnVnZml4IGZsb2F0aW5nIGFyb3VuZCBqdXN0IG5v dyksIHNvIG5vdCBldmVuCj4gaW50ZXJuYWxseSB3ZSdyZSB2ZXJ5IGdvb2QgYXQgZ2V0dGluZyB0 aGlzIHJpZ2h0Lgo+Cj4gPiA+IElmIG9uZSBoYXMgYSBzdGFibGUgcG9pbnRlciB0byBhIGZlbmNl IGRtYV9mZW5jZV9nZXRfcmN1IGlzIEkgdGhpbmsKPiA+ID4gZW5vdWdoIHRvIGRlYWwgd2l0aCBT TEFCX1RZUEVTQUZFX0JZX1JDVSB1c2VkIGJ5IGk5MTVfcmVxdWVzdCAoYXMgZG1hCj4gPiA+IGZl bmNlIGlzIGEgYmFzZSBvYmplY3QgdGhlcmUpLiBVbmxlc3MgeW91IGZvdW5kIGEgYnVnIGluIHJx IGZpZWxkCj4gPiA+IHJlY3ljbGluZy4gQnV0IGFjY2VzcyB0byB0aGUgZG1hIGZlbmNlIGlzIGFs bCB0aWdodGx5IGNvbnRyb2xsZWQgc28gSQo+ID4gPiBkb24ndCBnZXQgd2hhdCBsZWFrcy4KPiA+ ID4KPiA+ID4+IFRoaXMgcGF0Y2ggc2VyaWVzIHN0b3BzIHVzIHVzaW5nIFNMQUJfVFlQRVNBRkVf QllfUkNVIGZvciBpOTE1X3JlcXVlc3QKPiA+ID4+IGFuZCwgaW5zdGVhZCwgZG9lcyBhbiBSQ1Ut c2FmZSBzbGFiIGZyZWUgdmlhIHJjdV9jYWxsKCkuICBUaGlzIHNob3VsZAo+ID4gPj4gbGV0IHVz IGtlZXAgbW9zdCBvZiB0aGUgcGVyZiBiZW5lZml0cyBvZiBzbGFiIGFsbG9jYXRpb24gd2hpbGUg YXZvaWRpbmcKPiA+ID4+IHRoZSBiZWFyIHRyYXBzIGluaGVyZW50IGluIFNMQUJfVFlQRVNBRkVf QllfUkNVLiAgSXQgdGhlbiByZW1vdmVzCj4gPiA+PiBzdXBwb3J0Cj4gPiA+PiBmb3IgU0xBQl9U WVBFU0FGRV9CWV9SQ1UgZnJvbSBkbWFfZmVuY2UgZW50aXJlbHkuCj4gPiA+Cj4gPiA+IEFjY29y ZGluZyB0byB0aGUgcmF0aW9uYWxlIGJlaGluZCBTTEFCX1RZUEVTQUZFX0JZX1JDVSB0cmFkaXRp b25hbCBSQ1UKPiA+ID4gZnJlZWluZyBjYW4gYmUgYSBsb3QgbW9yZSBjb3N0bHkgc28gSSB0aGlu ayB3ZSBuZWVkIGEgY2xlYXIKPiA+ID4ganVzdGlmaWNhdGlvbiBvbiB3aHkgdGhpcyBjaGFuZ2Ug aXMgYmVpbmcgY29uc2lkZXJlZC4KPiA+Cj4gPiBUaGUgcHJvYmxlbSBpcyB0aGF0IFNMQUJfVFlQ RVNBRkVfQllfUkNVIHJlcXVpcmVzIHRoYXQgd2UgdXNlIGEgc2VxdWVuY2UKPiA+IGNvdW50ZXIg dG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgZ3JhYiB0aGUgcmVmZXJlbmNlIHRvIGEgcmVhbGxv Y2F0ZWQKPiA+IGRtYV9mZW5jZS4KPiA+Cj4gPiBVcGRhdGluZyB0aGUgc2VxdWVuY2UgY291bnRl ciBldmVyeSB0aW1lIHdlIGFkZCBhIGZlbmNlIG5vdyBtZWFucyB0d28KPiA+IGFkZGl0aW9ucyB3 cml0ZXMgYW5kIG9uZSBhZGRpdGlvbmFsIGJhcnJpZXIgZm9yIGFuIGV4dHJlbWVseSBob3QgcGF0 aC4KPiA+IFRoZSBleHRyYSBvdmVyaGVhZCBvZiBSQ1UgZnJlZWluZyBpcyBjb21wbGV0ZWx5IG5l Z2xpZ2libGUgY29tcGFyZWQgdG8gdGhhdC4KPiA+Cj4gPiBUaGUgZ29vZCBuZXdzIGlzIHRoYXQg SSB0aGluayBpZiB3ZSBhcmUganVzdCBhIGJpdCBtb3JlIGNsZXZlciBhYm91dCBvdXIKPiA+IGhh bmRsZSB3ZSBjYW4gYm90aCBhdm9pZCB0aGUgc2VxdWVuY2UgY291bnRlciBhbmQga2VlcAo+ID4g U0xBQl9UWVBFU0FGRV9CWV9SQ1UgYXJvdW5kLgoKV2UncmUgYWxyZWFkeSB0cnlpbmcgdG8gZG8g aGFuZGxlIGNsZXZlcm5lc3MgYXMgZGVzY3JpYmVkIGFib3ZlLiAgQnV0LAphcyBEYW5pZWwgc2Fp ZCBhbmQgSSBwdXQgaW4gc29tZSBjb21taXQgbWVzc2FnZSwgd2UncmUgcHJvYmFibHkgb25seQpk b2luZyBpdCBpbiBhYm91dCAxLzMgb2YgdGhlIHBsYWNlcyB3ZSBuZWVkIHRvIGJlLgoKPiBZb3Ug c3RpbGwgbmVlZCBhIHNlcWxvY2ssIG9yIHNvbWV0aGluZyBlbHNlIHRoYXQncyBzZXJ2aW5nIGFz IHlvdXIKPiBzZXFsb2NrLiBkbWFfZmVuY2VfbGlzdCBiZWhpbmQgYSBzaW5nbGUgX19yY3UgcHJv dGVjdGVkIHBvaW50ZXIsIHdpdGgKPiBhbGwgc3Vic2VxdWVudCBmZW5jZSBwb2ludGVycyBfbm90 XyBiZWluZyByY3UgcHJvdGVjdGVkIChpLmUuIGZ1bGwKPiByZWZlcmVuY2UsIG9uIGV2ZXJ5IGNo YW5nZSB3ZSBhbGxvY2F0ZSBtaWdodCB3b3JrLiBXaGljaCBpcyBhIHZlcnkKPiBmdW5ueSB3YXkg b2YgaW1wbGVtZW50aW5nIHNvbWV0aGluZyBsaWtlIGEgc2VxbG9jay4KPgo+IEFuZCB0aGF0IG9u bHkgY292ZXJzIGRtYV9yZXN2LCB5b3UgX2hhdmVfIHRvIGRvIHRoaXMgX2V2ZXJ5d2hlcmVfIGlu Cj4gZXZlcnkgZHJpdmVyLiBFeGNlcHQgaWYgeW91IGNhbiBwcm9vZiB0aGF0IHlvdXIgX19yY3Ug ZmVuY2UgcG9pbnRlcgo+IG9ubHkgZXZlciBwb2ludHMgYXQgeW91ciBvd24gZHJpdmVyJ3MgZmVu Y2VzLgo+Cj4gU28gdW5sZXNzIHlvdSdyZSB2b2x1bnRlZXJpbmcgdG8gYXVkaXQgYWxsIHRoZSBk cml2ZXJzLCBhbmQgY29uc3RhbnRseQo+IHJlLWF1ZGl0IHRoZW0gKGJlY2F1c2UgcmN1IG9ubHkg Z3VhcmFudGVlaW5nIHR5cGUtc2FmZXR5IGJ1dCBub3QKPiBhY3R1YWxseSBwcmV2ZW50aW5nIHVz ZS1hZnRlci1mcmVlIGlzIHZlcnkgdW51c3VhbCBpbiB0aGUga2VybmVsKSBqdXN0Cj4gZml4aW5n IGRtYV9yZXN2IGRvZXNuJ3Qgc29sdmUgdGhlIHByb2JsZW0gaGVyZSBhdCBhbGwuCj4KPiA+IEJ1 dCB0aGlzIG5lZWRzIG1vcmUgY29kZSBjbGVhbnVwIGFuZCBhYnN0cmFjdGluZyB0aGUgc2VxdWVu Y2UgY291bnRlcgo+ID4gdXNhZ2UgaW4gYSBtYWNyby4KPgo+IFRoZSBvdGhlciB0aGluZyBpcyB0 aGF0IHRoaXMgZG9lc24ndCBldmVuIG1ha2Ugc2Vuc2UgZm9yIGk5MTUgYW55bW9yZS4KCkknbSBu b3Qgc3VyZSBJJ2QgZ28gdGhhdCBmYXIuICBZZXMsIHdlJ3ZlIGdvdCB0aGUgVUxMUyBoYWNrIGJ1 dAppOTE1X3JlcXVlc3QgaXMgZ29pbmcgdG8gc3RheSBhcm91bmQgZm9yIGEgd2hpbGUuICBXaGF0 J3MgcmVhbGx5Cm92ZXJibG93biBoZXJlIGlzIHRoZSBiYXppbGxpb25zIG9mIHJlcXVlc3RzLiAg R0wgZHJpdmVycyBzdWJtaXQgdGVucwpvciBtYXliZSAxMDBpc2ggYmF0Y2hlcyBwZXIgZnJhbWUu ICBNZWRpYSBoYXMgdG8gcGluZy1wb25nIGEgYml0IG1vcmUKYnV0IGl0IHNob3VsZCBzdGlsbCBi ZSA8IDEwMDAvc2Vjb25kLiAgSWYgd2UncmUgcmVhbGx5CmRtYV9mZW5jZV9yZWxlYXNlLWJvdW5k LCB3ZSdyZSBpbiBhIG1pY3JvYmVuY2htYXJrLgoKLS1KYXNvbgoKPiBUaGUgc29sdXRpb24gdG8g dGhlICJ1c2Vyc3BhY2Ugd2FudHMgdG8gc3VibWl0IGJhemlsbGlvbiByZXF1ZXN0cyIKPiBwcm9i bGVtIGlzIGRpcmVjdCB1c2Vyc3BhY2Ugc3VibWl0LiBDdXJyZW50IGh3IGRvZXNuJ3QgaGF2ZSB1 c2Vyc3BhY2UKPiByaW5nYnVmZmVyLCBidXQgd2UgaGF2ZSBhIHByZXR0eSBjbGV2ZXIgdHJpY2sg aW4gdGhlIHdvcmtzIHRvIG1ha2UKPiB0aGlzIHBvc3NpYmxlIHdpdGggY3VycmVudCBodywgZXNz ZW50aWFsbHkgYnkgc3VibWl0dGluZyBhIENTIHRoYXQKPiBsb29wcyBvbiBpdHNlbGYsIGFuZCB0 aGVuIGluc2VydGluZyBiYXRjaGVzIGludG8gdGhpcyAicmluZyIgYnkKPiBsYXRjaGluZyBhIGNv bmRpdGlvbmFsIGJyYW5jaCBpbiB0aGlzIENTLiBJdCdzIG5vdCBwcmV0dHksIGJ1dCBpdCBnZXRz Cj4gdGhlIGpvYiBkb25lIGFuZCBvdXRyaWdodCByZW1vdmVzIHRoZSBuZWVkIGZvciBwbGFpZCBt b2RlIHRocm91Z2hwdXQKPiBvZiBpOTE1X3JlcXVlc3QgZG1hIGZlbmNlcy4KPiAtRGFuaWVsCj4K PiA+Cj4gPiBSZWdhcmRzLAo+ID4gQ2hyaXN0aWFuLgo+ID4KPiA+Cj4gPiA+Cj4gPiA+IFJlZ2Fy ZHMsCj4gPiA+Cj4gPiA+IFR2cnRrbwo+ID4gPgo+ID4gPj4KPiA+ID4+IE5vdGU6IFRoZSBsYXN0 IHBhdGNoIGlzIGxhYmxlZCBET05PVE1FUkdFLiAgVGhpcyB3YXMgYXQgRGFuaWVsIFZldHRlcidz Cj4gPiA+PiByZXF1ZXN0IGFzIHdlIG1heSB3YW50IHRvIGxldCB0aGlzIGJha2UgZm9yIGEgY291 cGxlIHJlbGVhc2VzIGJlZm9yZSB3ZQo+ID4gPj4gcmlwIG91dCBkbWFfZmVuY2VfZ2V0X3JjdV9z YWZlIGVudGlyZWx5Lgo+ID4gPj4KPiA+ID4+IFNpZ25lZC1vZmYtYnk6IEphc29uIEVrc3RyYW5k IDxqYXNvbkBqbGVrc3RyYW5kLm5ldD4KPiA+ID4+IENjOiBKb24gQmxvb21maWVsZCA8am9uLmJs b29tZmllbGRAaW50ZWwuY29tPgo+ID4gPj4gQ2M6IERhbmllbCBWZXR0ZXIgPGRhbmllbC52ZXR0 ZXJAZmZ3bGwuY2g+Cj4gPiA+PiBDYzogQ2hyaXN0aWFuIEvDtm5pZyA8Y2hyaXN0aWFuLmtvZW5p Z0BhbWQuY29tPgo+ID4gPj4gQ2M6IERhdmUgQWlybGllIDxhaXJsaWVkQHJlZGhhdC5jb20+Cj4g PiA+PiBDYzogTWF0dGhldyBBdWxkIDxtYXR0aGV3LmF1bGRAaW50ZWwuY29tPgo+ID4gPj4gQ2M6 IE1hYXJ0ZW4gTGFua2hvcnN0IDxtYWFydGVuLmxhbmtob3JzdEBsaW51eC5pbnRlbC5jb20+Cj4g PiA+Pgo+ID4gPj4gSmFzb24gRWtzdHJhbmQgKDUpOgo+ID4gPj4gICAgZHJtL2k5MTU6IE1vdmUg aW50ZWxfZW5naW5lX2ZyZWVfcmVxdWVzdF9wb29sIHRvIGk5MTVfcmVxdWVzdC5jCj4gPiA+PiAg ICBkcm0vaTkxNTogVXNlIGEgc2ltcGxlciBzY2hlbWUgZm9yIGNhY2hpbmcgaTkxNV9yZXF1ZXN0 Cj4gPiA+PiAgICBkcm0vaTkxNTogU3RvcCB1c2luZyBTTEFCX1RZUEVTQUZFX0JZX1JDVSBmb3Ig aTkxNV9yZXF1ZXN0Cj4gPiA+PiAgICBkbWEtYnVmOiBTdG9wIHVzaW5nIFNMQUJfVFlQRVNBRkVf QllfUkNVIGluIHNlbGZ0ZXN0cwo+ID4gPj4gICAgRE9OT1RNRVJHRTogZG1hLWJ1ZjogR2V0IHJp ZCBvZiBkbWFfZmVuY2VfZ2V0X3JjdV9zYWZlCj4gPiA+Pgo+ID4gPj4gICBkcml2ZXJzL2RtYS1i dWYvZG1hLWZlbmNlLWNoYWluLmMgICAgICAgICB8ICAgOCArLQo+ID4gPj4gICBkcml2ZXJzL2Rt YS1idWYvZG1hLXJlc3YuYyAgICAgICAgICAgICAgICB8ICAgNCArLQo+ID4gPj4gICBkcml2ZXJz L2RtYS1idWYvc3QtZG1hLWZlbmNlLWNoYWluLmMgICAgICB8ICAyNCArLS0tCj4gPiA+PiAgIGRy aXZlcnMvZG1hLWJ1Zi9zdC1kbWEtZmVuY2UuYyAgICAgICAgICAgIHwgIDI3ICstLS0KPiA+ID4+ ICAgZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2ZlbmNlLmMgfCAgIDQgKy0KPiA+ ID4+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZW5naW5lX2NzLmMgfCAgIDggLS0K PiA+ID4+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9hY3RpdmUuaCAgICAgICAgfCAgIDQg Ky0KPiA+ID4+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZXF1ZXN0LmMgICAgICAgfCAx NDcgKysrKysrKysrKysrLS0tLS0tLS0tLQo+ID4gPj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X3JlcXVlc3QuaCAgICAgICB8ICAgMiAtCj4gPiA+PiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1 L2k5MTVfdm1hLmMgICAgICAgICAgIHwgICA0ICstCj4gPiA+PiAgIGluY2x1ZGUvZHJtL2RybV9z eW5jb2JqLmggICAgICAgICAgICAgICAgIHwgICA0ICstCj4gPiA+PiAgIGluY2x1ZGUvbGludXgv ZG1hLWZlbmNlLmggICAgICAgICAgICAgICAgIHwgIDUwIC0tLS0tLS0tCj4gPiA+PiAgIGluY2x1 ZGUvbGludXgvZG1hLXJlc3YuaCAgICAgICAgICAgICAgICAgIHwgICA0ICstCj4gPiA+PiAgIDEz IGZpbGVzIGNoYW5nZWQsIDExMCBpbnNlcnRpb25zKCspLCAxODAgZGVsZXRpb25zKC0pCj4gPiA+ Pgo+ID4KPgo+Cj4gLS0KPiBEYW5pZWwgVmV0dGVyCj4gU29mdHdhcmUgRW5naW5lZXIsIEludGVs IENvcnBvcmF0aW9uCj4gaHR0cDovL2Jsb2cuZmZ3bGwuY2gKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1n ZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==