From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (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 C4DD11AA8B for ; Fri, 4 Aug 2023 22:03:44 +0000 (UTC) Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-d052f58b7deso2589068276.2 for ; Fri, 04 Aug 2023 15:03:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1691186623; x=1691791423; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=Z5QE4e6WPNCCTrcuQvD50h/cVU5OOyClG9aBSPF6enk=; b=vM4uC4RuClRcmFO2qH/TANlQsWDEW+w4U9sW+sG8F4CCDdcV2tNthcz4YJ6PXz+56B oqFUNpVY1eBEVrxwliIA57bmsHnqMhmzXjy8U521V1m+rWHXTXQ/nE9iB9PLwoS2cdGY 7UF3A0KKoCLferkfuF10jA2qDrwRUIQERhyJN66ymiLypJRXtzrYN9HmsXdOXjm4P3TN 8r6STBjd9bG6Nix6A+scDPT6fGkyHJA56x9OaL5i8xMACEqeMxgiVcUju8xRuBySakA/ RLQ9me9mrk7MBFj6YOhouZwKr3MwcQlfeVPnrAJGTBAcNtiUcjLAzNf1ojAR1NejBXa+ Dt4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691186623; x=1691791423; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=Z5QE4e6WPNCCTrcuQvD50h/cVU5OOyClG9aBSPF6enk=; b=fyUQhwGSg1b6wAa7B8MvoPeSuVqaJ81QZbwUQ9DvM7PV8GaSpPzvAgMvjIPiLLFZ0b wYDAbz8Xx4KzKdONHVOhjbiCKky9DsZ2/OQU51xGDapMvvRb4q2/HYD7nzm8nL55FGMW 4j+VsM7Jn17fyskHAse8CsMbqlJoaLJqkI6CIp+iv6s07hTkwxJHc7loaG/iOp8/SDb0 SyHVtNFkvf5gd4kRgF2bpgxb5D5OyKAUaQKt5QTyPBefGJ0tRmFNqLRrIXG8f+wwU+Jk g9qF+NfaY9PmNdxK1Nfbu2DHPUbr6/a6OmZvSyppC6hIBcY7HYaCXJcjjtcjXdkC51eb rFzg== X-Gm-Message-State: AOJu0YyUPXcZtl+/cOQuJQig8ZlKg7wHKlMTpoZleSURtL0DkBIfO9BZ 3KvtKszddZ3iFuUf8GbH+xZ4MKqnLZg= X-Google-Smtp-Source: AGHT+IFjaw3aSm7rjvvmijnXEXzRTq5HabQb/vYjmBeBj+YyrmCXw7NTiGSmKknyLfkweNzeT9xhYtbm3aE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:f807:0:b0:d09:b450:22eb with SMTP id u7-20020a25f807000000b00d09b45022ebmr14827ybd.1.1691186623542; Fri, 04 Aug 2023 15:03:43 -0700 (PDT) Date: Fri, 4 Aug 2023 15:03:41 -0700 In-Reply-To: <20230706145247.ddjqsvmfdeimzva6@linux.intel.com> Precedence: bulk X-Mailing-List: kvmarm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20230704075054.3344915-1-stevensd@google.com> <20230704075054.3344915-3-stevensd@google.com> <20230705031002.xrxk42hli6oavtlt@linux.intel.com> <20230705105343.iounmlflfued7lco@linux.intel.com> <20230706145247.ddjqsvmfdeimzva6@linux.intel.com> Message-ID: Subject: Re: [PATCH v7 2/8] KVM: Introduce __kvm_follow_pfn function From: Sean Christopherson To: Yu Zhang Cc: David Stevens , Marc Zyngier , Michael Ellerman , Peter Xu , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Thu, Jul 06, 2023, Yu Zhang wrote: > On Thu, Jul 06, 2023 at 02:29:24PM +0900, David Stevens wrote: > > On Wed, Jul 5, 2023 at 7:53=E2=80=AFPM Yu Zhang wrote: > > > > > > On Wed, Jul 05, 2023 at 06:22:59PM +0900, David Stevens wrote: > > > > On Wed, Jul 5, 2023 at 12:10=E2=80=AFPM Yu Zhang wrote: > > > > > > > > > > > @@ -2514,35 +2512,26 @@ static bool hva_to_pfn_fast(unsigned lo= ng addr, bool write_fault, > > > > > > * The slow path to get the pfn of the specified host virtual = address, > > > > > > * 1 indicates success, -errno is returned if error is detecte= d. > > > > > > */ > > > > > > -static int hva_to_pfn_slow(unsigned long addr, bool *async, bo= ol write_fault, > > > > > > - bool interruptible, bool *writable, kv= m_pfn_t *pfn) > > > > > > +static int hva_to_pfn_slow(struct kvm_follow_pfn *foll, kvm_pf= n_t *pfn) > > > > > > { > > > > > > - unsigned int flags =3D FOLL_HWPOISON; > > > > > > + unsigned int flags =3D FOLL_HWPOISON | FOLL_GET | foll->f= lags; > > > > > > struct page *page; > > > > > > int npages; > > > > > > > > > > > > might_sleep(); > > > > > > > > > > > > - if (writable) > > > > > > - *writable =3D write_fault; > > > > > > - > > > > > > - if (write_fault) > > > > > > - flags |=3D FOLL_WRITE; > > > > > > - if (async) > > > > > > - flags |=3D FOLL_NOWAIT; > > > > > > - if (interruptible) > > > > > > - flags |=3D FOLL_INTERRUPTIBLE; > > > > > > - > > > > > > - npages =3D get_user_pages_unlocked(addr, 1, &page, flags)= ; > > > > > > + npages =3D get_user_pages_unlocked(foll->hva, 1, &page, f= lags); > > > > > > if (npages !=3D 1) > > > > > > return npages; > > > > > > > > > > > > + foll->writable =3D (foll->flags & FOLL_WRITE) && foll->al= low_write_mapping; > > > > > > + > > > > > > /* map read fault as writable if possible */ > > > > > > - if (unlikely(!write_fault) && writable) { > > > > > > + if (unlikely(!foll->writable) && foll->allow_write_mappin= g) { > > > > > > > > > > I guess !foll->writable should be !(foll->flags & FOLL_WRITE) her= e. > > > > > > > > The two statements are logically equivalent, although I guess using > > > > !(foll->flags & FOLL_WRITE) may be a little clearer, if a little mo= re > > > > verbose. > > > > > > Well, as the comment says, we wanna try to map the read fault as writ= able > > > whenever possible. And __gfn_to_pfn_memslot() will only set the FOLL_= WRITE > > > for write faults. So I guess using !foll->writable will not allow thi= s. > > > Did I miss anything? > >=20 > > We just set the foll->writable out parameter to be equal to > > ((foll->flags & FOLL_WRITE) && foll->allow_write_mapping). Taking a =3D > > foll->flags & FOLL_WRITE and b =3D foll->allow_write_mapping, we have > > !(a && b) && b -> (!a || !b) && b -> (!a && b) || (!b && b) -> !a && > > b. >=20 > Ouch, my bad again... I typed "!foll->writable", but missed the "!" in > my head while calculating... Thanks! :) The code is funky and confusing though. Specifically, FOLL_WRITE without allow_write_mapping is nonsensical, and yields the even more nonsensical ou= tput of a successful FOLL_WRITE with foll->writable=3D=3D%false. It "works" because callers only consume foll->writable when foll->allow_wri= te_mapping is true, but relying on that is ugly and completely unnecessary. Similarl= y, the "allow" terminology is misleading. FOLL_WRITE *always* allows writable map= pings. This wasn't as much of problem in the previous code because the lower level= s took the pointer, i.e. avoided the "allow" terminology entirely. So we should either keep that behavior, i.e. replace "bool allow_write_mapp= ing" with "bool *writable", or rename allow_write_mapping to something like opportunistically_map_writable, and then unconditionally set foll->writable whenever KVM obtains a writable mapping, i.e. regardless of whether the ori= ginal fault was a read or a write. My vote is for the latter. If opportunistically_map_writable is too verbos= e, try_map_writable would be another option. Hmm, I'll make "try_map_writable= " my official vote. Ah, and I also vote to use an if-elif instead of unconditionally setting fo= ll->writable. That makes the relationship between FOLL_WRITE and try_map_writable a bit m= ore obvious IMO. E.g. static bool hva_to_pfn_fast(struct kvm_follow_pfn *foll, kvm_pfn_t *pfn) { struct page *page[1]; /* * Fast pin a writable pfn only if it is a write fault request * or the caller allows to map a writable pfn for a read fault * request. */ if (!((foll->flags & FOLL_WRITE) || foll->try_map_writable)) return false; if (get_user_page_fast_only(foll->hva, FOLL_WRITE, page)) { *pfn =3D page_to_pfn(page[0]); foll->writable =3D true; return true; } return false; } /* * The slow path to get the pfn of the specified host virtual address, * 1 indicates success, -errno is returned if error is detected. */ static int hva_to_pfn_slow(struct kvm_follow_pfn *foll, kvm_pfn_t *pfn) { unsigned int flags =3D FOLL_HWPOISON | FOLL_GET | foll->flags; struct page *page; int npages; might_sleep(); npages =3D get_user_pages_unlocked(foll->hva, 1, &page, flags); if (npages !=3D 1) return npages; if (foll->flags & FOLL_WRITE) { foll->writable =3D true; } else if (foll->try_map_writable) { struct page *wpage; /* map read fault as writable if possible */ if (get_user_page_fast_only(foll->hva, FOLL_WRITE, &wpage)) { foll->writable =3D true; put_page(page); page =3D wpage; } } *pfn =3D page_to_pfn(page); return npages; } 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 lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (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 ED426C00528 for ; Fri, 4 Aug 2023 22:05:58 +0000 (UTC) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.a=rsa-sha256 header.s=20221208 header.b=vM4uC4Ru; dkim-atps=neutral Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4RHftD56vnz3cQT for ; Sat, 5 Aug 2023 08:05:56 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.a=rsa-sha256 header.s=20221208 header.b=vM4uC4Ru; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=flex--seanjc.bounces.google.com (client-ip=2607:f8b0:4864:20::b4a; helo=mail-yb1-xb4a.google.com; envelope-from=3v3xnzaykda46so1xqu22uzs.q20zw18b33q-rs9zw676.2dzop6.25u@flex--seanjc.bounces.google.com; receiver=lists.ozlabs.org) Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4RHfqp1gH1z2xVP for ; Sat, 5 Aug 2023 08:03:48 +1000 (AEST) Received: by mail-yb1-xb4a.google.com with SMTP id 3f1490d57ef6-d087ffcc43cso2579527276.3 for ; Fri, 04 Aug 2023 15:03:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1691186623; x=1691791423; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=Z5QE4e6WPNCCTrcuQvD50h/cVU5OOyClG9aBSPF6enk=; b=vM4uC4RuClRcmFO2qH/TANlQsWDEW+w4U9sW+sG8F4CCDdcV2tNthcz4YJ6PXz+56B oqFUNpVY1eBEVrxwliIA57bmsHnqMhmzXjy8U521V1m+rWHXTXQ/nE9iB9PLwoS2cdGY 7UF3A0KKoCLferkfuF10jA2qDrwRUIQERhyJN66ymiLypJRXtzrYN9HmsXdOXjm4P3TN 8r6STBjd9bG6Nix6A+scDPT6fGkyHJA56x9OaL5i8xMACEqeMxgiVcUju8xRuBySakA/ RLQ9me9mrk7MBFj6YOhouZwKr3MwcQlfeVPnrAJGTBAcNtiUcjLAzNf1ojAR1NejBXa+ Dt4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691186623; x=1691791423; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=Z5QE4e6WPNCCTrcuQvD50h/cVU5OOyClG9aBSPF6enk=; b=TepmQWbIAiuLUPRoIvF7s926Et1xBGZZpytgjnD+GAiIA3f4DiFTMJ/J7/xtGGO/oA 02zJaH2FErWYO5EyvcQnIkAvRaUB8g1F+cOVdyt6G/c7/gVMfdb8EpUYyILm0ljbEEEu ikIWzOii575XCV1QP/tG2SMwn1VAjk5gdPW+xJFDH/3vUSa/Wmv7fsCYscTMpJiA4vNb 7hwWqj6FJf1UqAGXx99Ja1XOOG7wOB9He0iKauRPNN1uR4cJdhd5trX0/jOSlGLbbC3D ykVWg4jyg5IEmKQ3DtERDBXetfrkAV3M8xoXxlcXDOuDWsUJ2qVQAcCdDSqa8Sj9RsrV ORuw== X-Gm-Message-State: AOJu0YxXH5Ul5+2kZe1uKmYUhTAyynCCAq+n1sQOitLtOzEq3C7APf11 Igy5KoGjKYJStzPi0wJtqzKaYzyXJL0= X-Google-Smtp-Source: AGHT+IFjaw3aSm7rjvvmijnXEXzRTq5HabQb/vYjmBeBj+YyrmCXw7NTiGSmKknyLfkweNzeT9xhYtbm3aE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:f807:0:b0:d09:b450:22eb with SMTP id u7-20020a25f807000000b00d09b45022ebmr14827ybd.1.1691186623542; Fri, 04 Aug 2023 15:03:43 -0700 (PDT) Date: Fri, 4 Aug 2023 15:03:41 -0700 In-Reply-To: <20230706145247.ddjqsvmfdeimzva6@linux.intel.com> Mime-Version: 1.0 References: <20230704075054.3344915-1-stevensd@google.com> <20230704075054.3344915-3-stevensd@google.com> <20230705031002.xrxk42hli6oavtlt@linux.intel.com> <20230705105343.iounmlflfued7lco@linux.intel.com> <20230706145247.ddjqsvmfdeimzva6@linux.intel.com> Message-ID: Subject: Re: [PATCH v7 2/8] KVM: Introduce __kvm_follow_pfn function From: Sean Christopherson To: Yu Zhang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kvm@vger.kernel.org, Marc Zyngier , linux-kernel@vger.kernel.org, Peter Xu , David Stevens , kvmarm@lists.linux.dev, linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" On Thu, Jul 06, 2023, Yu Zhang wrote: > On Thu, Jul 06, 2023 at 02:29:24PM +0900, David Stevens wrote: > > On Wed, Jul 5, 2023 at 7:53=E2=80=AFPM Yu Zhang wrote: > > > > > > On Wed, Jul 05, 2023 at 06:22:59PM +0900, David Stevens wrote: > > > > On Wed, Jul 5, 2023 at 12:10=E2=80=AFPM Yu Zhang wrote: > > > > > > > > > > > @@ -2514,35 +2512,26 @@ static bool hva_to_pfn_fast(unsigned lo= ng addr, bool write_fault, > > > > > > * The slow path to get the pfn of the specified host virtual = address, > > > > > > * 1 indicates success, -errno is returned if error is detecte= d. > > > > > > */ > > > > > > -static int hva_to_pfn_slow(unsigned long addr, bool *async, bo= ol write_fault, > > > > > > - bool interruptible, bool *writable, kv= m_pfn_t *pfn) > > > > > > +static int hva_to_pfn_slow(struct kvm_follow_pfn *foll, kvm_pf= n_t *pfn) > > > > > > { > > > > > > - unsigned int flags =3D FOLL_HWPOISON; > > > > > > + unsigned int flags =3D FOLL_HWPOISON | FOLL_GET | foll->f= lags; > > > > > > struct page *page; > > > > > > int npages; > > > > > > > > > > > > might_sleep(); > > > > > > > > > > > > - if (writable) > > > > > > - *writable =3D write_fault; > > > > > > - > > > > > > - if (write_fault) > > > > > > - flags |=3D FOLL_WRITE; > > > > > > - if (async) > > > > > > - flags |=3D FOLL_NOWAIT; > > > > > > - if (interruptible) > > > > > > - flags |=3D FOLL_INTERRUPTIBLE; > > > > > > - > > > > > > - npages =3D get_user_pages_unlocked(addr, 1, &page, flags)= ; > > > > > > + npages =3D get_user_pages_unlocked(foll->hva, 1, &page, f= lags); > > > > > > if (npages !=3D 1) > > > > > > return npages; > > > > > > > > > > > > + foll->writable =3D (foll->flags & FOLL_WRITE) && foll->al= low_write_mapping; > > > > > > + > > > > > > /* map read fault as writable if possible */ > > > > > > - if (unlikely(!write_fault) && writable) { > > > > > > + if (unlikely(!foll->writable) && foll->allow_write_mappin= g) { > > > > > > > > > > I guess !foll->writable should be !(foll->flags & FOLL_WRITE) her= e. > > > > > > > > The two statements are logically equivalent, although I guess using > > > > !(foll->flags & FOLL_WRITE) may be a little clearer, if a little mo= re > > > > verbose. > > > > > > Well, as the comment says, we wanna try to map the read fault as writ= able > > > whenever possible. And __gfn_to_pfn_memslot() will only set the FOLL_= WRITE > > > for write faults. So I guess using !foll->writable will not allow thi= s. > > > Did I miss anything? > >=20 > > We just set the foll->writable out parameter to be equal to > > ((foll->flags & FOLL_WRITE) && foll->allow_write_mapping). Taking a =3D > > foll->flags & FOLL_WRITE and b =3D foll->allow_write_mapping, we have > > !(a && b) && b -> (!a || !b) && b -> (!a && b) || (!b && b) -> !a && > > b. >=20 > Ouch, my bad again... I typed "!foll->writable", but missed the "!" in > my head while calculating... Thanks! :) The code is funky and confusing though. Specifically, FOLL_WRITE without allow_write_mapping is nonsensical, and yields the even more nonsensical ou= tput of a successful FOLL_WRITE with foll->writable=3D=3D%false. It "works" because callers only consume foll->writable when foll->allow_wri= te_mapping is true, but relying on that is ugly and completely unnecessary. Similarl= y, the "allow" terminology is misleading. FOLL_WRITE *always* allows writable map= pings. This wasn't as much of problem in the previous code because the lower level= s took the pointer, i.e. avoided the "allow" terminology entirely. So we should either keep that behavior, i.e. replace "bool allow_write_mapp= ing" with "bool *writable", or rename allow_write_mapping to something like opportunistically_map_writable, and then unconditionally set foll->writable whenever KVM obtains a writable mapping, i.e. regardless of whether the ori= ginal fault was a read or a write. My vote is for the latter. If opportunistically_map_writable is too verbos= e, try_map_writable would be another option. Hmm, I'll make "try_map_writable= " my official vote. Ah, and I also vote to use an if-elif instead of unconditionally setting fo= ll->writable. That makes the relationship between FOLL_WRITE and try_map_writable a bit m= ore obvious IMO. E.g. static bool hva_to_pfn_fast(struct kvm_follow_pfn *foll, kvm_pfn_t *pfn) { struct page *page[1]; /* * Fast pin a writable pfn only if it is a write fault request * or the caller allows to map a writable pfn for a read fault * request. */ if (!((foll->flags & FOLL_WRITE) || foll->try_map_writable)) return false; if (get_user_page_fast_only(foll->hva, FOLL_WRITE, page)) { *pfn =3D page_to_pfn(page[0]); foll->writable =3D true; return true; } return false; } /* * The slow path to get the pfn of the specified host virtual address, * 1 indicates success, -errno is returned if error is detected. */ static int hva_to_pfn_slow(struct kvm_follow_pfn *foll, kvm_pfn_t *pfn) { unsigned int flags =3D FOLL_HWPOISON | FOLL_GET | foll->flags; struct page *page; int npages; might_sleep(); npages =3D get_user_pages_unlocked(foll->hva, 1, &page, flags); if (npages !=3D 1) return npages; if (foll->flags & FOLL_WRITE) { foll->writable =3D true; } else if (foll->try_map_writable) { struct page *wpage; /* map read fault as writable if possible */ if (get_user_page_fast_only(foll->hva, FOLL_WRITE, &wpage)) { foll->writable =3D true; put_page(page); page =3D wpage; } } *pfn =3D page_to_pfn(page); return npages; } 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 88FB1C00528 for ; Fri, 4 Aug 2023 22:04:13 +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:Cc:To:From:Subject:Message-ID: References:Mime-Version:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=u5LB8EpSZSdTHL/erDyqFqsuzkqRMvh4MLJi9942CDs=; b=tUYImq5GYreIV+1rWRiqUhkv4V vqUeA6GU2Q3sj1oztf6NTuK4c1qDGwP5L4DVZ4PVqn++n1BRmBvMV6ZbfqoLpTN1q1W9/ZLukPYoy xilDGjqMoLIKVMQS8nU5tZJJtsZNw678vqvQsnwmEK2qOB+WXYthsg3gTBTRk3oRuYj9CPR3sNogK 4Yrc2/tnJixGfjsmmo6HKrGY8trURIWqn1Q6edF7wnVJhoCGabFk08XLNuuHqxE2Ah2mR8dn2Wu3h 5ALQ/43njU8Eh+nE4PNZsfKaFHfSnGjGQ8mFbn5FijGpQZEs4Mo+hFkyFBrqm0g0g/ihlrWT9n4Ie rfX9t0+Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qS2ti-00DKjX-36; Fri, 04 Aug 2023 22:03:50 +0000 Received: from mail-yb1-xb49.google.com ([2607:f8b0:4864:20::b49]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qS2tg-00DKj5-05 for linux-arm-kernel@lists.infradead.org; Fri, 04 Aug 2023 22:03:49 +0000 Received: by mail-yb1-xb49.google.com with SMTP id 3f1490d57ef6-c5a479bc2d4so2595037276.1 for ; Fri, 04 Aug 2023 15:03:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1691186623; x=1691791423; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=Z5QE4e6WPNCCTrcuQvD50h/cVU5OOyClG9aBSPF6enk=; b=vM4uC4RuClRcmFO2qH/TANlQsWDEW+w4U9sW+sG8F4CCDdcV2tNthcz4YJ6PXz+56B oqFUNpVY1eBEVrxwliIA57bmsHnqMhmzXjy8U521V1m+rWHXTXQ/nE9iB9PLwoS2cdGY 7UF3A0KKoCLferkfuF10jA2qDrwRUIQERhyJN66ymiLypJRXtzrYN9HmsXdOXjm4P3TN 8r6STBjd9bG6Nix6A+scDPT6fGkyHJA56x9OaL5i8xMACEqeMxgiVcUju8xRuBySakA/ RLQ9me9mrk7MBFj6YOhouZwKr3MwcQlfeVPnrAJGTBAcNtiUcjLAzNf1ojAR1NejBXa+ Dt4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691186623; x=1691791423; h=content-transfer-encoding:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=Z5QE4e6WPNCCTrcuQvD50h/cVU5OOyClG9aBSPF6enk=; b=d+VejmVrC2rlBGiRjWA8uMJMU7fqD8hXX3h9FrfROGZRZpJVT9N5hkdypTa4SRamyO 5oMS8ctccV8fYU03v6G78QSC8KTXHV7FdLN8e6PIRQp8FafS1wDSK3BSZ78EI0sbEZOl DlMI8pjFyiL/KyjJMN1+FD2TH38AZ35UMoqNCaPYjUv/wUwkVJUEGCA6CCUk9K1VSK5c 8CjagnUcpu6G7wGrhdrOqc9VYO9AkIyqCSa8LlNhXJM60h7Xzvgl0o+1iO9i+98AJUAt hJVZbIXH0NpKaiYCFg3KikuZXtUNgVcFtDmtP7SkC6jrBeaX8k7xY9GTIUSTGiWDDCgk lW3g== X-Gm-Message-State: AOJu0Yy1YNriXFnFKuGnsmaMe2rwhzcQApsqrnvMOP+wYl1LGFlmWGyK fgKLucP42l+NOUb0OihZJDPK6oTlpPs= X-Google-Smtp-Source: AGHT+IFjaw3aSm7rjvvmijnXEXzRTq5HabQb/vYjmBeBj+YyrmCXw7NTiGSmKknyLfkweNzeT9xhYtbm3aE= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:f807:0:b0:d09:b450:22eb with SMTP id u7-20020a25f807000000b00d09b45022ebmr14827ybd.1.1691186623542; Fri, 04 Aug 2023 15:03:43 -0700 (PDT) Date: Fri, 4 Aug 2023 15:03:41 -0700 In-Reply-To: <20230706145247.ddjqsvmfdeimzva6@linux.intel.com> Mime-Version: 1.0 References: <20230704075054.3344915-1-stevensd@google.com> <20230704075054.3344915-3-stevensd@google.com> <20230705031002.xrxk42hli6oavtlt@linux.intel.com> <20230705105343.iounmlflfued7lco@linux.intel.com> <20230706145247.ddjqsvmfdeimzva6@linux.intel.com> Message-ID: Subject: Re: [PATCH v7 2/8] KVM: Introduce __kvm_follow_pfn function From: Sean Christopherson To: Yu Zhang Cc: David Stevens , Marc Zyngier , Michael Ellerman , Peter Xu , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230804_150348_092078_119A86B8 X-CRM114-Status: GOOD ( 29.82 ) 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 T24gVGh1LCBKdWwgMDYsIDIwMjMsIFl1IFpoYW5nIHdyb3RlOgo+IE9uIFRodSwgSnVsIDA2LCAy MDIzIGF0IDAyOjI5OjI0UE0gKzA5MDAsIERhdmlkIFN0ZXZlbnMgd3JvdGU6Cj4gPiBPbiBXZWQs IEp1bCA1LCAyMDIzIGF0IDc6NTPigK9QTSBZdSBaaGFuZyA8eXUuYy56aGFuZ0BsaW51eC5pbnRl bC5jb20+IHdyb3RlOgo+ID4gPgo+ID4gPiBPbiBXZWQsIEp1bCAwNSwgMjAyMyBhdCAwNjoyMjo1 OVBNICswOTAwLCBEYXZpZCBTdGV2ZW5zIHdyb3RlOgo+ID4gPiA+IE9uIFdlZCwgSnVsIDUsIDIw MjMgYXQgMTI6MTDigK9QTSBZdSBaaGFuZyA8eXUuYy56aGFuZ0BsaW51eC5pbnRlbC5jb20+IHdy b3RlOgo+ID4gPiA+ID4KPiA+ID4gPiA+ID4gQEAgLTI1MTQsMzUgKzI1MTIsMjYgQEAgc3RhdGlj IGJvb2wgaHZhX3RvX3Bmbl9mYXN0KHVuc2lnbmVkIGxvbmcgYWRkciwgYm9vbCB3cml0ZV9mYXVs dCwKPiA+ID4gPiA+ID4gICAqIFRoZSBzbG93IHBhdGggdG8gZ2V0IHRoZSBwZm4gb2YgdGhlIHNw ZWNpZmllZCBob3N0IHZpcnR1YWwgYWRkcmVzcywKPiA+ID4gPiA+ID4gICAqIDEgaW5kaWNhdGVz IHN1Y2Nlc3MsIC1lcnJubyBpcyByZXR1cm5lZCBpZiBlcnJvciBpcyBkZXRlY3RlZC4KPiA+ID4g PiA+ID4gICAqLwo+ID4gPiA+ID4gPiAtc3RhdGljIGludCBodmFfdG9fcGZuX3Nsb3codW5zaWdu ZWQgbG9uZyBhZGRyLCBib29sICphc3luYywgYm9vbCB3cml0ZV9mYXVsdCwKPiA+ID4gPiA+ID4g LSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwgYm9vbCAqd3JpdGFi bGUsIGt2bV9wZm5fdCAqcGZuKQo+ID4gPiA+ID4gPiArc3RhdGljIGludCBodmFfdG9fcGZuX3Ns b3coc3RydWN0IGt2bV9mb2xsb3dfcGZuICpmb2xsLCBrdm1fcGZuX3QgKnBmbikKPiA+ID4gPiA+ ID4gIHsKPiA+ID4gPiA+ID4gLSAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gRk9MTF9IV1BPSVNP TjsKPiA+ID4gPiA+ID4gKyAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gRk9MTF9IV1BPSVNPTiB8 IEZPTExfR0VUIHwgZm9sbC0+ZmxhZ3M7Cj4gPiA+ID4gPiA+ICAgICAgIHN0cnVjdCBwYWdlICpw YWdlOwo+ID4gPiA+ID4gPiAgICAgICBpbnQgbnBhZ2VzOwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4g PiAgICAgICBtaWdodF9zbGVlcCgpOwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiAtICAgICBpZiAo d3JpdGFibGUpCj4gPiA+ID4gPiA+IC0gICAgICAgICAgICAgKndyaXRhYmxlID0gd3JpdGVfZmF1 bHQ7Cj4gPiA+ID4gPiA+IC0KPiA+ID4gPiA+ID4gLSAgICAgaWYgKHdyaXRlX2ZhdWx0KQo+ID4g PiA+ID4gPiAtICAgICAgICAgICAgIGZsYWdzIHw9IEZPTExfV1JJVEU7Cj4gPiA+ID4gPiA+IC0g ICAgIGlmIChhc3luYykKPiA+ID4gPiA+ID4gLSAgICAgICAgICAgICBmbGFncyB8PSBGT0xMX05P V0FJVDsKPiA+ID4gPiA+ID4gLSAgICAgaWYgKGludGVycnVwdGlibGUpCj4gPiA+ID4gPiA+IC0g ICAgICAgICAgICAgZmxhZ3MgfD0gRk9MTF9JTlRFUlJVUFRJQkxFOwo+ID4gPiA+ID4gPiAtCj4g PiA+ID4gPiA+IC0gICAgIG5wYWdlcyA9IGdldF91c2VyX3BhZ2VzX3VubG9ja2VkKGFkZHIsIDEs ICZwYWdlLCBmbGFncyk7Cj4gPiA+ID4gPiA+ICsgICAgIG5wYWdlcyA9IGdldF91c2VyX3BhZ2Vz X3VubG9ja2VkKGZvbGwtPmh2YSwgMSwgJnBhZ2UsIGZsYWdzKTsKPiA+ID4gPiA+ID4gICAgICAg aWYgKG5wYWdlcyAhPSAxKQo+ID4gPiA+ID4gPiAgICAgICAgICAgICAgIHJldHVybiBucGFnZXM7 Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ICsgICAgIGZvbGwtPndyaXRhYmxlID0gKGZvbGwtPmZs YWdzICYgRk9MTF9XUklURSkgJiYgZm9sbC0+YWxsb3dfd3JpdGVfbWFwcGluZzsKPiA+ID4gPiA+ ID4gKwo+ID4gPiA+ID4gPiAgICAgICAvKiBtYXAgcmVhZCBmYXVsdCBhcyB3cml0YWJsZSBpZiBw b3NzaWJsZSAqLwo+ID4gPiA+ID4gPiAtICAgICBpZiAodW5saWtlbHkoIXdyaXRlX2ZhdWx0KSAm JiB3cml0YWJsZSkgewo+ID4gPiA+ID4gPiArICAgICBpZiAodW5saWtlbHkoIWZvbGwtPndyaXRh YmxlKSAmJiBmb2xsLT5hbGxvd193cml0ZV9tYXBwaW5nKSB7Cj4gPiA+ID4gPgo+ID4gPiA+ID4g SSBndWVzcyAhZm9sbC0+d3JpdGFibGUgc2hvdWxkIGJlICEoZm9sbC0+ZmxhZ3MgJiBGT0xMX1dS SVRFKSBoZXJlLgo+ID4gPiA+Cj4gPiA+ID4gVGhlIHR3byBzdGF0ZW1lbnRzIGFyZSBsb2dpY2Fs bHkgZXF1aXZhbGVudCwgYWx0aG91Z2ggSSBndWVzcyB1c2luZwo+ID4gPiA+ICEoZm9sbC0+Zmxh Z3MgJiBGT0xMX1dSSVRFKSBtYXkgYmUgYSBsaXR0bGUgY2xlYXJlciwgaWYgYSBsaXR0bGUgbW9y ZQo+ID4gPiA+IHZlcmJvc2UuCj4gPiA+Cj4gPiA+IFdlbGwsIGFzIHRoZSBjb21tZW50IHNheXMs IHdlIHdhbm5hIHRyeSB0byBtYXAgdGhlIHJlYWQgZmF1bHQgYXMgd3JpdGFibGUKPiA+ID4gd2hl bmV2ZXIgcG9zc2libGUuIEFuZCBfX2dmbl90b19wZm5fbWVtc2xvdCgpIHdpbGwgb25seSBzZXQg dGhlIEZPTExfV1JJVEUKPiA+ID4gZm9yIHdyaXRlIGZhdWx0cy4gU28gSSBndWVzcyB1c2luZyAh Zm9sbC0+d3JpdGFibGUgd2lsbCBub3QgYWxsb3cgdGhpcy4KPiA+ID4gRGlkIEkgbWlzcyBhbnl0 aGluZz8KPiA+IAo+ID4gV2UganVzdCBzZXQgdGhlIGZvbGwtPndyaXRhYmxlIG91dCBwYXJhbWV0 ZXIgdG8gYmUgZXF1YWwgdG8KPiA+ICgoZm9sbC0+ZmxhZ3MgJiBGT0xMX1dSSVRFKSAmJiBmb2xs LT5hbGxvd193cml0ZV9tYXBwaW5nKS4gVGFraW5nIGEgPQo+ID4gZm9sbC0+ZmxhZ3MgJiBGT0xM X1dSSVRFIGFuZCBiID0gZm9sbC0+YWxsb3dfd3JpdGVfbWFwcGluZywgd2UgaGF2ZQo+ID4gIShh ICYmIGIpICYmIGIgLT4gKCFhIHx8ICFiKSAmJiBiIC0+ICghYSAmJiBiKSB8fCAoIWIgJiYgYikg LT4gIWEgJiYKPiA+IGIuCj4gCj4gT3VjaCwgbXkgYmFkIGFnYWluLi4uIEkgdHlwZWQgIiFmb2xs LT53cml0YWJsZSIsIGJ1dCBtaXNzZWQgdGhlICIhIiBpbgo+IG15IGhlYWQgd2hpbGUgY2FsY3Vs YXRpbmcuLi4gVGhhbmtzISA6KQoKVGhlIGNvZGUgaXMgZnVua3kgYW5kIGNvbmZ1c2luZyB0aG91 Z2guICBTcGVjaWZpY2FsbHksIEZPTExfV1JJVEUgd2l0aG91dAphbGxvd193cml0ZV9tYXBwaW5n IGlzIG5vbnNlbnNpY2FsLCBhbmQgeWllbGRzIHRoZSBldmVuIG1vcmUgbm9uc2Vuc2ljYWwgb3V0 cHV0Cm9mIGEgc3VjY2Vzc2Z1bCBGT0xMX1dSSVRFIHdpdGggZm9sbC0+d3JpdGFibGU9PSVmYWxz ZS4KCkl0ICJ3b3JrcyIgYmVjYXVzZSBjYWxsZXJzIG9ubHkgY29uc3VtZSBmb2xsLT53cml0YWJs ZSB3aGVuIGZvbGwtPmFsbG93X3dyaXRlX21hcHBpbmcKaXMgdHJ1ZSwgYnV0IHJlbHlpbmcgb24g dGhhdCBpcyB1Z2x5IGFuZCBjb21wbGV0ZWx5IHVubmVjZXNzYXJ5LiAgIFNpbWlsYXJseSwgdGhl CiJhbGxvdyIgdGVybWlub2xvZ3kgaXMgbWlzbGVhZGluZy4gIEZPTExfV1JJVEUgKmFsd2F5cyog YWxsb3dzIHdyaXRhYmxlIG1hcHBpbmdzLgoKVGhpcyB3YXNuJ3QgYXMgbXVjaCBvZiBwcm9ibGVt IGluIHRoZSBwcmV2aW91cyBjb2RlIGJlY2F1c2UgdGhlIGxvd2VyIGxldmVscyB0b29rCnRoZSBw b2ludGVyLCBpLmUuIGF2b2lkZWQgdGhlICJhbGxvdyIgdGVybWlub2xvZ3kgZW50aXJlbHkuCgpT byB3ZSBzaG91bGQgZWl0aGVyIGtlZXAgdGhhdCBiZWhhdmlvciwgaS5lLiByZXBsYWNlICJib29s IGFsbG93X3dyaXRlX21hcHBpbmciCndpdGggImJvb2wgKndyaXRhYmxlIiwgb3IgcmVuYW1lIGFs bG93X3dyaXRlX21hcHBpbmcgdG8gc29tZXRoaW5nIGxpa2UKb3Bwb3J0dW5pc3RpY2FsbHlfbWFw X3dyaXRhYmxlLCBhbmQgdGhlbiB1bmNvbmRpdGlvbmFsbHkgc2V0IGZvbGwtPndyaXRhYmxlCndo ZW5ldmVyIEtWTSBvYnRhaW5zIGEgd3JpdGFibGUgbWFwcGluZywgaS5lLiByZWdhcmRsZXNzIG9m IHdoZXRoZXIgdGhlIG9yaWdpbmFsCmZhdWx0IHdhcyBhIHJlYWQgb3IgYSB3cml0ZS4KCk15IHZv dGUgaXMgZm9yIHRoZSBsYXR0ZXIuICBJZiBvcHBvcnR1bmlzdGljYWxseV9tYXBfd3JpdGFibGUg aXMgdG9vIHZlcmJvc2UsCnRyeV9tYXBfd3JpdGFibGUgd291bGQgYmUgYW5vdGhlciBvcHRpb24u ICBIbW0sIEknbGwgbWFrZSAidHJ5X21hcF93cml0YWJsZSIgbXkKb2ZmaWNpYWwgdm90ZS4KCkFo LCBhbmQgSSBhbHNvIHZvdGUgdG8gdXNlIGFuIGlmLWVsaWYgaW5zdGVhZCBvZiB1bmNvbmRpdGlv bmFsbHkgc2V0dGluZyBmb2xsLT53cml0YWJsZS4KVGhhdCBtYWtlcyB0aGUgcmVsYXRpb25zaGlw IGJldHdlZW4gRk9MTF9XUklURSBhbmQgdHJ5X21hcF93cml0YWJsZSBhIGJpdCBtb3JlCm9idmlv dXMgSU1PLiAgRS5nLgoKc3RhdGljIGJvb2wgaHZhX3RvX3Bmbl9mYXN0KHN0cnVjdCBrdm1fZm9s bG93X3BmbiAqZm9sbCwga3ZtX3Bmbl90ICpwZm4pCnsKCXN0cnVjdCBwYWdlICpwYWdlWzFdOwoK CS8qCgkgKiBGYXN0IHBpbiBhIHdyaXRhYmxlIHBmbiBvbmx5IGlmIGl0IGlzIGEgd3JpdGUgZmF1 bHQgcmVxdWVzdAoJICogb3IgdGhlIGNhbGxlciBhbGxvd3MgdG8gbWFwIGEgd3JpdGFibGUgcGZu IGZvciBhIHJlYWQgZmF1bHQKCSAqIHJlcXVlc3QuCgkgKi8KCWlmICghKChmb2xsLT5mbGFncyAm IEZPTExfV1JJVEUpIHx8IGZvbGwtPnRyeV9tYXBfd3JpdGFibGUpKQoJCXJldHVybiBmYWxzZTsK CglpZiAoZ2V0X3VzZXJfcGFnZV9mYXN0X29ubHkoZm9sbC0+aHZhLCBGT0xMX1dSSVRFLCBwYWdl KSkgewoJCSpwZm4gPSBwYWdlX3RvX3BmbihwYWdlWzBdKTsKCQlmb2xsLT53cml0YWJsZSA9IHRy dWU7CgkJcmV0dXJuIHRydWU7Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgovKgogKiBUaGUgc2xvdyBw YXRoIHRvIGdldCB0aGUgcGZuIG9mIHRoZSBzcGVjaWZpZWQgaG9zdCB2aXJ0dWFsIGFkZHJlc3Ms CiAqIDEgaW5kaWNhdGVzIHN1Y2Nlc3MsIC1lcnJubyBpcyByZXR1cm5lZCBpZiBlcnJvciBpcyBk ZXRlY3RlZC4KICovCnN0YXRpYyBpbnQgaHZhX3RvX3Bmbl9zbG93KHN0cnVjdCBrdm1fZm9sbG93 X3BmbiAqZm9sbCwga3ZtX3Bmbl90ICpwZm4pCnsKCXVuc2lnbmVkIGludCBmbGFncyA9IEZPTExf SFdQT0lTT04gfCBGT0xMX0dFVCB8IGZvbGwtPmZsYWdzOwoJc3RydWN0IHBhZ2UgKnBhZ2U7Cglp bnQgbnBhZ2VzOwoKCW1pZ2h0X3NsZWVwKCk7CgoJbnBhZ2VzID0gZ2V0X3VzZXJfcGFnZXNfdW5s b2NrZWQoZm9sbC0+aHZhLCAxLCAmcGFnZSwgZmxhZ3MpOwoJaWYgKG5wYWdlcyAhPSAxKQoJCXJl dHVybiBucGFnZXM7CgoJaWYgKGZvbGwtPmZsYWdzICYgRk9MTF9XUklURSkgewoJCWZvbGwtPndy aXRhYmxlID0gdHJ1ZTsKCX0gZWxzZSBpZiAoZm9sbC0+dHJ5X21hcF93cml0YWJsZSkgewoJCXN0 cnVjdCBwYWdlICp3cGFnZTsKCgkJLyogbWFwIHJlYWQgZmF1bHQgYXMgd3JpdGFibGUgaWYgcG9z c2libGUgKi8KCQlpZiAoZ2V0X3VzZXJfcGFnZV9mYXN0X29ubHkoZm9sbC0+aHZhLCBGT0xMX1dS SVRFLCAmd3BhZ2UpKSB7CgkJCWZvbGwtPndyaXRhYmxlID0gdHJ1ZTsKCQkJcHV0X3BhZ2UocGFn ZSk7CgkJCXBhZ2UgPSB3cGFnZTsKCQl9Cgl9CgkqcGZuID0gcGFnZV90b19wZm4ocGFnZSk7Cgly ZXR1cm4gbnBhZ2VzOwp9CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBs aXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtYXJtLWtlcm5lbAo=