From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9BC662BAF7 for ; Fri, 19 Apr 2024 21:07:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713560824; cv=none; b=j22YrE6ZOFu8hocC2kAYSQQsRhFST/kPMNynfAqwc440WZiXhUDHUH4Rbldu8x1s+vw1Omvx4OhrJAuSERqW7LMMPPYKuNGIL/jiS/ODsPW6I9kEYOljzX1v4LRJfT0o8hJ+J66ed9AOY2sPTJdKvvJFnJyhPsTtbedRfoPevAY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713560824; c=relaxed/simple; bh=5/awzNU8HVXAcVpqIF8P0kyvvgiFFv7R/U2Ux5fpBds=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=iAne9h+lTt+VArarF2ilZuqwsvU8wstpgArWlJLPwLCy8AWTNG0BwU26099E3vVwZ0mplO3fnwoekmOjpfcxEmt7LRQtntD2tsqEPowi+gef/LxxOLutGWlvTllVJbwiXYhhkvi6VVuULcE0M+K8cz1ZIiGQ6p7bdh4YdAbgOTg= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=05yDoLI2; arc=none smtp.client-ip=209.85.210.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="05yDoLI2" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-6ed20fb620fso2152495b3a.2 for ; Fri, 19 Apr 2024 14:07:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713560823; x=1714165623; darn=lists.linux.dev; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=vDccPRw3/PnxvI5b+QrmqH79otR7qScpzAtcfP56j+c=; b=05yDoLI2GE8cAKH5jLbXQh7qa9bBLboYfP+d2ZkijAStAzmEE7ibqvjKURd8w5LNk9 liScbZSM3zJGhKc/O26OqOvUjZt62W0D9b3H7aqC/Tu3YfWFuq9073c8cu2b0jRfj/vn PxT+zgj5bWYYcZGUUBHUetGUVeN7CyBekhPmosDFXBL4uvXR1gqel7Zo9U7Zg16mPfX7 8OJW+PLD/DQGMfJ+eu6G61IvM7jiggvnJFx0BxGG5BO80XnP1gmk0O8zEtwxuJRUATIj Zs2gU+qOlZ9i5pDpnyq4hn58aB2wi60fIvs4EaprvU5VAA8CL8tyfIobMJbjJx4fqd44 tl6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713560823; x=1714165623; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vDccPRw3/PnxvI5b+QrmqH79otR7qScpzAtcfP56j+c=; b=UCiozZyWojrpR5NoO0KrIcaosOp0qojBHbn4nAHyjjaqZYkkOvRTLb9KF8YslNhi9/ 8q9B06Qy//biDSQTf6QbZ15mApH679V3rsIYl76m1h2HlIVoVYct/q+Hgi8JkaoUMzSI 3wW70okQe+ChjhUmolueRdtFBlOl8BQ7inuJdoJS3Mvpnhmz69bAwTvcJTqwP/EiFYxk QJUnEKZUGX6dJBH+yTEwy3tumWGjXSbbbWndTvQ1lOhI33bK/9xNEu+eySC8dDKA/nCl 6lJHYJYM7icxCpbwruDNEQGrf8z7kabynnPM9lWrVH6dg1myIF/MB+th8yAo4iHE90Vt Q8nQ== X-Forwarded-Encrypted: i=1; AJvYcCVAXopTDqjcfGrbywj6vke5LIRJQg3jI3+tXpyxsTi3FNG1Wwg9uLCWI/1/OQ0aeg8KlnV4/VPCcBRynAVUhAJ/ceqn5qEM X-Gm-Message-State: AOJu0YyOWgHf9XP75sIJ5g2k69kc35Bw+4nC3D6btm5BJv+zyJBCUMJL 5572eD4Z/lo5ex9p/GMLgBz02NmQTUYF68RN0oA6MXTU51HgklPYCBIkn0tpXg== X-Google-Smtp-Source: AGHT+IHw/NlYfJI+uhC54L32I8Lr7TROJVo7EQ9Q27rPiTvl8C0kR92yS8I4f6VA8oYKT2j68BaI1g== X-Received: by 2002:a05:6a21:6da2:b0:1a3:63fa:f760 with SMTP id wl34-20020a056a216da200b001a363faf760mr4253434pzb.14.1713560822638; Fri, 19 Apr 2024 14:07:02 -0700 (PDT) Received: from google.com (210.73.125.34.bc.googleusercontent.com. [34.125.73.210]) by smtp.gmail.com with ESMTPSA id go20-20020a056a003b1400b006e6233563cesm3661623pfb.218.2024.04.19.14.07.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Apr 2024 14:07:01 -0700 (PDT) Date: Fri, 19 Apr 2024 14:06:56 -0700 From: David Matlack To: James Houghton Cc: Andrew Morton , Paolo Bonzini , Yu Zhao , Marc Zyngier , Oliver Upton , Sean Christopherson , Jonathan Corbet , James Morse , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Shaoqin Huang , Gavin Shan , Ricardo Koller , Raghavendra Rao Ananta , Ryan Roberts , David Rientjes , Axel Rasmussen , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-mm@kvack.org, linux-trace-kernel@vger.kernel.org Subject: Re: [PATCH v3 5/7] KVM: x86: Participate in bitmap-based PTE aging Message-ID: References: <20240401232946.1837665-1-jthoughton@google.com> <20240401232946.1837665-6-jthoughton@google.com> Precedence: bulk X-Mailing-List: kvmarm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On 2024-04-19 01:47 PM, James Houghton wrote: > On Thu, Apr 11, 2024 at 10:28 AM David Matlack wrote: > > On 2024-04-11 10:08 AM, David Matlack wrote: > > bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) > > { > > bool young = false; > > > > if (!range->arg.metadata->bitmap && kvm_memslots_have_rmaps(kvm)) > > young = kvm_handle_gfn_range(kvm, range, kvm_age_rmap); > > > > if (tdp_mmu_enabled) > > young |= kvm_tdp_mmu_age_gfn_range(kvm, range); > > > > return young; > > } > > > > bool kvm_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) > > { > > bool young = false; > > > > if (!range->arg.metadata->bitmap && kvm_memslots_have_rmaps(kvm)) > > young = kvm_handle_gfn_range(kvm, range, kvm_test_age_rmap); > > > > if (tdp_mmu_enabled) > > young |= kvm_tdp_mmu_test_age_gfn(kvm, range); > > > > return young; > > > Yeah I think this is the right thing to do. Given your other > suggestions (on patch 3), I think this will look something like this > -- let me know if I've misunderstood something: > > bool check_rmap = !bitmap && kvm_memslot_have_rmaps(kvm); > > if (check_rmap) > KVM_MMU_LOCK(kvm); > > rcu_read_lock(); // perhaps only do this when we don't take the MMU lock? > > if (check_rmap) > kvm_handle_gfn_range(/* ... */ kvm_test_age_rmap) > > if (tdp_mmu_enabled) > kvm_tdp_mmu_test_age_gfn() // modified to be RCU-safe > > rcu_read_unlock(); > if (check_rmap) > KVM_MMU_UNLOCK(kvm); I was thinking a little different. If you follow my suggestion to first make the TDP MMU aging lockless, you'll end up with something like this prior to adding bitmap support (note: the comments are just for demonstrative purposes): bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) { bool young = false; /* Shadow MMU aging holds write-lock. */ if (kvm_memslots_have_rmaps(kvm)) { write_lock(&kvm->mmu_lock); young = kvm_handle_gfn_range(kvm, range, kvm_age_rmap); write_unlock(&kvm->mmu_lock); } /* TDM MMU aging is lockless. */ if (tdp_mmu_enabled) young |= kvm_tdp_mmu_age_gfn_range(kvm, range); return young; } Then when you add bitmap support it would look something like this: bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) { unsigned long *bitmap = range->arg.metadata->bitmap; bool young = false; /* SHadow MMU aging holds write-lock and does not support bitmap. */ if (kvm_memslots_have_rmaps(kvm) && !bitmap) { write_lock(&kvm->mmu_lock); young = kvm_handle_gfn_range(kvm, range, kvm_age_rmap); write_unlock(&kvm->mmu_lock); } /* TDM MMU aging is lockless and supports bitmap. */ if (tdp_mmu_enabled) young |= kvm_tdp_mmu_age_gfn_range(kvm, range); return young; } rcu_read_lock/unlock() would be called in kvm_tdp_mmu_age_gfn_range(). That brings up a question I've been wondering about. If KVM only advertises support for the bitmap lookaround when shadow roots are not allocated, does that mean MGLRU will be blind to accesses made by L2 when nested virtualization is enabled? And does that mean the Linux MM will think all L2 memory is cold (i.e. good candidate for swapping) because it isn't seeing accesses made by L2? 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0499FC04FF6 for ; Fri, 19 Apr 2024 21:07:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Ptw/6Schk+KpbflUGHpgD62BhX0w6lcP3yzq/9fKSFI=; b=Btfu+0Ihe1fDzK iOXrlqhdayjnr2C1AJs+voy4LyO5eIa7nVscLjf8caB788Tuxod19a1T+xIf6yeSSmddwiGONepGu LS2HeE7SMNB7hGk2lfRZRRARHzvmhgGtRXPMONEMPDFUagCxUBxSrZDk0BeUUwFfLBqTuJxuH4cj0 vvn40klLg3GXFs06UH2rf21RdHC1GDveFU/7Aq9RPDNs4pLzsFtp9hMYK6MdDtkyLyqKtwT6zzoqO ZZv50KZNseA8FF/jb3XhWVkwLogS5JONMUIL6bA8IdxKF/MoyRQVFYuV5LeGo+ydnQ+5oJqmJRjh0 DsDG1ahFXjUcO4xs8ELg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rxvRy-00000006ylr-1CmK; Fri, 19 Apr 2024 21:07:14 +0000 Received: from mail-pf1-x42c.google.com ([2607:f8b0:4864:20::42c]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rxvRr-00000006yij-2Gf6 for linux-arm-kernel@lists.infradead.org; Fri, 19 Apr 2024 21:07:12 +0000 Received: by mail-pf1-x42c.google.com with SMTP id d2e1a72fcca58-6ed0e9ccca1so2345244b3a.0 for ; Fri, 19 Apr 2024 14:07:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713560823; x=1714165623; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=vDccPRw3/PnxvI5b+QrmqH79otR7qScpzAtcfP56j+c=; b=UpcIB4ranA3guXxA0TB61DBPvoq/MkJ+hbsfcsXt/ho6OR1DHASXC5Bb4iCNgOLJT/ 4i/Zp7CxZ/gZ+Wq0PLz5RyljzWz8BAPIzDlRdfY5WGGjOFMGfm4bX2+ypZMyucpehfEg h8j3Lj7vAJw8lVG9GvM9oieaGORggrOYbcN/rI7ZOZLZdWl58CAzTLBUqjxnk+1AQvPm JgV/b2lUZACfa3bRpDAmWVa7fAt83CaBrXwnGTa6Flp1eowmUjozf+dTsHzWw5H2aw8R ucWhEhC+SsXJ/+F6SOYIJFmTmcu7z483FWSRVabTf3D+CVKif8bg50qutiH/2VXDsSr5 r5YQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713560823; x=1714165623; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vDccPRw3/PnxvI5b+QrmqH79otR7qScpzAtcfP56j+c=; b=vWozV9zqblHNpwaG1ll8iHLughfoDUpbyzJEwVBQJSG8dWMFmr3OPf88HrtuNvjw2S X4HsphRhHdy55utI/lbTXnDF1XaSjzr2bxJgNW21MIFRkMb2Of456nzRqMXFyyjHVqvr ZuCtMifAceS6RYq/LpjIfiDZRwWIHw9nfWu9u2H/Pqgu1aBhqjCuTZzqoj7v6LK599v6 m0iRMpljq59PneyZs6YtKavimEJbjW+FletRRJjCsR2dEpnol9/dbgQhVnFYusC1sP0p TKnW7wvJnczttmA256vv6EgO1uWORGZ6p8iJXS2O65n+H4lgbgzk81qb8TDIpTCtkgy+ 6zIQ== X-Forwarded-Encrypted: i=1; AJvYcCX3/87ZhE1SY/fhkomrwOwP6uuMEFQbMlGo/TXscgU5ktyFvYNB7tBFfGQCixWrKuwqvw6D0F/0TpbcP1saNHC6ltkNvuWlmxeJiVWr7KmTa8ZmSP8= X-Gm-Message-State: AOJu0YxCnjbYKUGcdiId1ylVS9ubJhPD6A80NMdtnd7F7KRYKiITEGSA Ieg53ZAnd4FpQyE1sBxSp2Ph1BUQt9m+cpXdK+urHOPLvPcLdyXYajOFuhtpkg== X-Google-Smtp-Source: AGHT+IHw/NlYfJI+uhC54L32I8Lr7TROJVo7EQ9Q27rPiTvl8C0kR92yS8I4f6VA8oYKT2j68BaI1g== X-Received: by 2002:a05:6a21:6da2:b0:1a3:63fa:f760 with SMTP id wl34-20020a056a216da200b001a363faf760mr4253434pzb.14.1713560822638; Fri, 19 Apr 2024 14:07:02 -0700 (PDT) Received: from google.com (210.73.125.34.bc.googleusercontent.com. [34.125.73.210]) by smtp.gmail.com with ESMTPSA id go20-20020a056a003b1400b006e6233563cesm3661623pfb.218.2024.04.19.14.07.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Apr 2024 14:07:01 -0700 (PDT) Date: Fri, 19 Apr 2024 14:06:56 -0700 From: David Matlack To: James Houghton Cc: Andrew Morton , Paolo Bonzini , Yu Zhao , Marc Zyngier , Oliver Upton , Sean Christopherson , Jonathan Corbet , James Morse , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Shaoqin Huang , Gavin Shan , Ricardo Koller , Raghavendra Rao Ananta , Ryan Roberts , David Rientjes , Axel Rasmussen , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-mm@kvack.org, linux-trace-kernel@vger.kernel.org Subject: Re: [PATCH v3 5/7] KVM: x86: Participate in bitmap-based PTE aging Message-ID: References: <20240401232946.1837665-1-jthoughton@google.com> <20240401232946.1837665-6-jthoughton@google.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240419_140707_855475_E5C472DE X-CRM114-Status: GOOD ( 21.75 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMjAyNC0wNC0xOSAwMTo0NyBQTSwgSmFtZXMgSG91Z2h0b24gd3JvdGU6Cj4gT24gVGh1LCBB cHIgMTEsIDIwMjQgYXQgMTA6MjjigK9BTSBEYXZpZCBNYXRsYWNrIDxkbWF0bGFja0Bnb29nbGUu Y29tPiB3cm90ZToKPiA+IE9uIDIwMjQtMDQtMTEgMTA6MDggQU0sIERhdmlkIE1hdGxhY2sgd3Jv dGU6Cj4gPiBib29sIGt2bV9hZ2VfZ2ZuKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9nZm5f cmFuZ2UgKnJhbmdlKQo+ID4gewo+ID4gICAgICAgICBib29sIHlvdW5nID0gZmFsc2U7Cj4gPgo+ ID4gICAgICAgICBpZiAoIXJhbmdlLT5hcmcubWV0YWRhdGEtPmJpdG1hcCAmJiBrdm1fbWVtc2xv dHNfaGF2ZV9ybWFwcyhrdm0pKQo+ID4gICAgICAgICAgICAgICAgIHlvdW5nID0ga3ZtX2hhbmRs ZV9nZm5fcmFuZ2Uoa3ZtLCByYW5nZSwga3ZtX2FnZV9ybWFwKTsKPiA+Cj4gPiAgICAgICAgIGlm ICh0ZHBfbW11X2VuYWJsZWQpCj4gPiAgICAgICAgICAgICAgICAgeW91bmcgfD0ga3ZtX3RkcF9t bXVfYWdlX2dmbl9yYW5nZShrdm0sIHJhbmdlKTsKPiA+Cj4gPiAgICAgICAgIHJldHVybiB5b3Vu ZzsKPiA+IH0KPiA+Cj4gPiBib29sIGt2bV90ZXN0X2FnZV9nZm4oc3RydWN0IGt2bSAqa3ZtLCBz dHJ1Y3Qga3ZtX2dmbl9yYW5nZSAqcmFuZ2UpCj4gPiB7Cj4gPiAgICAgICAgIGJvb2wgeW91bmcg PSBmYWxzZTsKPiA+Cj4gPiAgICAgICAgIGlmICghcmFuZ2UtPmFyZy5tZXRhZGF0YS0+Yml0bWFw ICYmIGt2bV9tZW1zbG90c19oYXZlX3JtYXBzKGt2bSkpCj4gPiAgICAgICAgICAgICAgICAgeW91 bmcgPSBrdm1faGFuZGxlX2dmbl9yYW5nZShrdm0sIHJhbmdlLCBrdm1fdGVzdF9hZ2Vfcm1hcCk7 Cj4gPgo+ID4gICAgICAgICBpZiAodGRwX21tdV9lbmFibGVkKQo+ID4gICAgICAgICAgICAgICAg IHlvdW5nIHw9IGt2bV90ZHBfbW11X3Rlc3RfYWdlX2dmbihrdm0sIHJhbmdlKTsKPiA+Cj4gPiAg ICAgICAgIHJldHVybiB5b3VuZzsKPiAKPiAKPiBZZWFoIEkgdGhpbmsgdGhpcyBpcyB0aGUgcmln aHQgdGhpbmcgdG8gZG8uIEdpdmVuIHlvdXIgb3RoZXIKPiBzdWdnZXN0aW9ucyAob24gcGF0Y2gg MyksIEkgdGhpbmsgdGhpcyB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpcwo+IC0tIGxldCBt ZSBrbm93IGlmIEkndmUgbWlzdW5kZXJzdG9vZCBzb21ldGhpbmc6Cj4gCj4gYm9vbCBjaGVja19y bWFwID0gIWJpdG1hcCAmJiBrdm1fbWVtc2xvdF9oYXZlX3JtYXBzKGt2bSk7Cj4gCj4gaWYgKGNo ZWNrX3JtYXApCj4gICBLVk1fTU1VX0xPQ0soa3ZtKTsKPiAKPiByY3VfcmVhZF9sb2NrKCk7IC8v IHBlcmhhcHMgb25seSBkbyB0aGlzIHdoZW4gd2UgZG9uJ3QgdGFrZSB0aGUgTU1VIGxvY2s/Cj4g Cj4gaWYgKGNoZWNrX3JtYXApCj4gICBrdm1faGFuZGxlX2dmbl9yYW5nZSgvKiAuLi4gKi8ga3Zt X3Rlc3RfYWdlX3JtYXApCj4gCj4gaWYgKHRkcF9tbXVfZW5hYmxlZCkKPiAgIGt2bV90ZHBfbW11 X3Rlc3RfYWdlX2dmbigpIC8vIG1vZGlmaWVkIHRvIGJlIFJDVS1zYWZlCj4gCj4gcmN1X3JlYWRf dW5sb2NrKCk7Cj4gaWYgKGNoZWNrX3JtYXApCj4gICBLVk1fTU1VX1VOTE9DSyhrdm0pOwoKSSB3 YXMgdGhpbmtpbmcgYSBsaXR0bGUgZGlmZmVyZW50LiBJZiB5b3UgZm9sbG93IG15IHN1Z2dlc3Rp b24gdG8gZmlyc3QKbWFrZSB0aGUgVERQIE1NVSBhZ2luZyBsb2NrbGVzcywgeW91J2xsIGVuZCB1 cCB3aXRoIHNvbWV0aGluZyBsaWtlIHRoaXMKcHJpb3IgdG8gYWRkaW5nIGJpdG1hcCBzdXBwb3J0 IChub3RlOiB0aGUgY29tbWVudHMgYXJlIGp1c3QgZm9yCmRlbW9uc3RyYXRpdmUgcHVycG9zZXMp OgoKYm9vbCBrdm1fYWdlX2dmbihzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fZ2ZuX3Jhbmdl ICpyYW5nZSkKewogICAgICAgIGJvb2wgeW91bmcgPSBmYWxzZTsKCgkvKiBTaGFkb3cgTU1VIGFn aW5nIGhvbGRzIHdyaXRlLWxvY2suICovCiAgICAgICAgaWYgKGt2bV9tZW1zbG90c19oYXZlX3Jt YXBzKGt2bSkpIHsKICAgICAgICAgICAgICAgIHdyaXRlX2xvY2soJmt2bS0+bW11X2xvY2spOwog ICAgICAgICAgICAgICAgeW91bmcgPSBrdm1faGFuZGxlX2dmbl9yYW5nZShrdm0sIHJhbmdlLCBr dm1fYWdlX3JtYXApOwogICAgICAgICAgICAgICAgd3JpdGVfdW5sb2NrKCZrdm0tPm1tdV9sb2Nr KTsKICAgICAgICB9CgoJLyogVERNIE1NVSBhZ2luZyBpcyBsb2NrbGVzcy4gKi8KICAgICAgICBp ZiAodGRwX21tdV9lbmFibGVkKQogICAgICAgICAgICAgICAgeW91bmcgfD0ga3ZtX3RkcF9tbXVf YWdlX2dmbl9yYW5nZShrdm0sIHJhbmdlKTsKCiAgICAgICAgcmV0dXJuIHlvdW5nOwp9CgpUaGVu IHdoZW4geW91IGFkZCBiaXRtYXAgc3VwcG9ydCBpdCB3b3VsZCBsb29rIHNvbWV0aGluZyBsaWtl IHRoaXM6Cgpib29sIGt2bV9hZ2VfZ2ZuKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9nZm5f cmFuZ2UgKnJhbmdlKQp7CiAgICAgICAgdW5zaWduZWQgbG9uZyAqYml0bWFwID0gcmFuZ2UtPmFy Zy5tZXRhZGF0YS0+Yml0bWFwOwogICAgICAgIGJvb2wgeW91bmcgPSBmYWxzZTsKCgkvKiBTSGFk b3cgTU1VIGFnaW5nIGhvbGRzIHdyaXRlLWxvY2sgYW5kIGRvZXMgbm90IHN1cHBvcnQgYml0bWFw LiAqLwogICAgICAgIGlmIChrdm1fbWVtc2xvdHNfaGF2ZV9ybWFwcyhrdm0pICYmICFiaXRtYXAp IHsKICAgICAgICAgICAgICAgIHdyaXRlX2xvY2soJmt2bS0+bW11X2xvY2spOwogICAgICAgICAg ICAgICAgeW91bmcgPSBrdm1faGFuZGxlX2dmbl9yYW5nZShrdm0sIHJhbmdlLCBrdm1fYWdlX3Jt YXApOwogICAgICAgICAgICAgICAgd3JpdGVfdW5sb2NrKCZrdm0tPm1tdV9sb2NrKTsKICAgICAg ICB9CgoJLyogVERNIE1NVSBhZ2luZyBpcyBsb2NrbGVzcyBhbmQgc3VwcG9ydHMgYml0bWFwLiAq LwogICAgICAgIGlmICh0ZHBfbW11X2VuYWJsZWQpCiAgICAgICAgICAgICAgICB5b3VuZyB8PSBr dm1fdGRwX21tdV9hZ2VfZ2ZuX3JhbmdlKGt2bSwgcmFuZ2UpOwoKICAgICAgICByZXR1cm4geW91 bmc7Cn0KCnJjdV9yZWFkX2xvY2svdW5sb2NrKCkgd291bGQgYmUgY2FsbGVkIGluIGt2bV90ZHBf bW11X2FnZV9nZm5fcmFuZ2UoKS4KClRoYXQgYnJpbmdzIHVwIGEgcXVlc3Rpb24gSSd2ZSBiZWVu IHdvbmRlcmluZyBhYm91dC4gSWYgS1ZNIG9ubHkKYWR2ZXJ0aXNlcyBzdXBwb3J0IGZvciB0aGUg Yml0bWFwIGxvb2thcm91bmQgd2hlbiBzaGFkb3cgcm9vdHMgYXJlIG5vdAphbGxvY2F0ZWQsIGRv ZXMgdGhhdCBtZWFuIE1HTFJVIHdpbGwgYmUgYmxpbmQgdG8gYWNjZXNzZXMgbWFkZSBieSBMMgp3 aGVuIG5lc3RlZCB2aXJ0dWFsaXphdGlvbiBpcyBlbmFibGVkPyBBbmQgZG9lcyB0aGF0IG1lYW4g dGhlIExpbnV4IE1NCndpbGwgdGhpbmsgYWxsIEwyIG1lbW9yeSBpcyBjb2xkIChpLmUuIGdvb2Qg Y2FuZGlkYXRlIGZvciBzd2FwcGluZykKYmVjYXVzZSBpdCBpc24ndCBzZWVpbmcgYWNjZXNzZXMg bWFkZSBieSBMMj8KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LWFybS1rZXJuZWwK