All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Walbran <qwandor@google.com>
To: Quentin Perret <qperret@google.com>
Cc: Android Kernel Team <kernel-team@android.com>,
	Marc Zyngier <maz@kernel.org>,
	linux-kernel@vger.kernel.org,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>,
	kvmarm@lists.cs.columbia.edu,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v4 03/21] KVM: arm64: Provide the host_stage2_try() helper macro
Date: Tue, 17 Aug 2021 14:06:32 +0100	[thread overview]
Message-ID: <CA+_y_2EFZjEQEvX-ipy7Z40jDaeD8hd7YnxswkgGCp8VM4eHGw@mail.gmail.com> (raw)
In-Reply-To: <20210809152448.1810400-4-qperret@google.com>


[-- Attachment #1.1.1: Type: text/plain, Size: 3942 bytes --]

On Mon, 9 Aug 2021 at 16:24, Quentin Perret <qperret@google.com> wrote:

> We currently unmap all MMIO mappings from the host stage-2 to recycle
> the pages whenever we run out. In order to make this pattern easy to
> re-use from other places, factor the logic out into a dedicated macro.
> While at it, apply the macro for the kvm_pgtable_stage2_set_owner()
> calls. They're currently only called early on and are guaranteed to
> succeed, but making them robust to the -ENOMEM case doesn't hurt and
> will avoid painful debugging sessions later on.
>
> Reviewed-by: Fuad Tabba <tabba@google.com>
> Signed-off-by: Quentin Perret <qperret@google.com>
> ---
>  arch/arm64/kvm/hyp/nvhe/mem_protect.c | 40 +++++++++++++++------------
>  1 file changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> index d938ce95d3bd..74280a753efb 100644
> --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> @@ -208,6 +208,25 @@ static inline int __host_stage2_idmap(u64 start, u64
> end,
>                                       prot, &host_s2_pool);
>  }
>
> +/*
> + * The pool has been provided with enough pages to cover all of memory
> with
> + * page granularity, but it is difficult to know how much of the MMIO
> range
> + * we will need to cover upfront, so we may need to 'recycle' the pages
> if we
> + * run out.
> + */
> +#define host_stage2_try(fn, ...)                                       \
> +       ({                                                              \
> +               int __ret;                                              \
> +               hyp_assert_lock_held(&host_kvm.lock);                   \
> +               __ret = fn(__VA_ARGS__);                                \
> +               if (__ret == -ENOMEM) {                                 \
> +                       __ret = host_stage2_unmap_dev_all();            \
> +                       if (!__ret)                                     \
> +                               __ret = fn(__VA_ARGS__);                \
> +               }                                                       \
> +               __ret;                                                  \
> +        })
> +
>  static int host_stage2_idmap(u64 addr)
>  {
>         enum kvm_pgtable_prot prot = KVM_PGTABLE_PROT_R |
> KVM_PGTABLE_PROT_W;
> @@ -223,22 +242,7 @@ static int host_stage2_idmap(u64 addr)
>         if (ret)
>                 goto unlock;
>
> -       ret = __host_stage2_idmap(range.start, range.end, prot);
> -       if (ret != -ENOMEM)
> -               goto unlock;
> -
> -       /*
> -        * The pool has been provided with enough pages to cover all of
> memory
> -        * with page granularity, but it is difficult to know how much of
> the
> -        * MMIO range we will need to cover upfront, so we may need to
> 'recycle'
> -        * the pages if we run out.
> -        */
> -       ret = host_stage2_unmap_dev_all();
> -       if (ret)
> -               goto unlock;
> -
> -       ret = __host_stage2_idmap(range.start, range.end, prot);
> -
> +       ret = host_stage2_try(__host_stage2_idmap, range.start, range.end,
> prot);
>  unlock:
>         hyp_spin_unlock(&host_kvm.lock);
>
> @@ -257,8 +261,8 @@ int __pkvm_mark_hyp(phys_addr_t start, phys_addr_t end)
>                 return -EINVAL;
>
>         hyp_spin_lock(&host_kvm.lock);
> -       ret = kvm_pgtable_stage2_set_owner(&host_kvm.pgt, start, end -
> start,
> -                                          &host_s2_pool, pkvm_hyp_id);
> +       ret = host_stage2_try(kvm_pgtable_stage2_set_owner, &host_kvm.pgt,
> +                             start, end - start, &host_s2_pool,
> pkvm_hyp_id);
>         hyp_spin_unlock(&host_kvm.lock);
>
>         return ret != -EAGAIN ? ret : 0;
> --
> 2.32.0.605.g8dce9f2422-goog
>
>
Reviewed-by: Andrew Walbran <qwandor@google.com>

[-- Attachment #1.1.2: Type: text/html, Size: 5193 bytes --]

[-- Attachment #1.2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 3998 bytes --]

[-- Attachment #2: Type: text/plain, Size: 151 bytes --]

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

  reply	other threads:[~2021-08-18 18:21 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-09 15:24 [PATCH v4 00/21] Track shared pages at EL2 in protected mode Quentin Perret
2021-08-09 15:24 ` Quentin Perret
2021-08-09 15:24 ` Quentin Perret
2021-08-09 15:24 ` [PATCH v4 01/21] KVM: arm64: Add hyp_spin_is_locked() for basic locking assertions at EL2 Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24 ` [PATCH v4 02/21] KVM: arm64: Introduce hyp_assert_lock_held() Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24 ` [PATCH v4 03/21] KVM: arm64: Provide the host_stage2_try() helper macro Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-17 13:06   ` Andrew Walbran [this message]
2021-08-09 15:24 ` [PATCH v4 04/21] KVM: arm64: Introduce helper to retrieve a PTE and its level Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-17 13:53   ` Andrew Walbran
2021-08-17 13:53     ` Andrew Walbran
2021-08-17 13:53     ` Andrew Walbran
2021-08-09 15:24 ` [PATCH v4 05/21] KVM: arm64: Expose page-table helpers Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:56   ` Fuad Tabba
2021-08-10  4:56     ` Fuad Tabba
2021-08-10  4:56     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 06/21] KVM: arm64: Optimize host memory aborts Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24 ` [PATCH v4 07/21] KVM: arm64: Rename KVM_PTE_LEAF_ATTR_S2_IGNORED Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24 ` [PATCH v4 08/21] KVM: arm64: Don't overwrite software bits with owner id Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24 ` [PATCH v4 09/21] KVM: arm64: Tolerate re-creating hyp mappings to set software bits Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24 ` [PATCH v4 10/21] KVM: arm64: Enable forcing page-level stage-2 mappings Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:33   ` Fuad Tabba
2021-08-10  4:33     ` Fuad Tabba
2021-08-10  4:33     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 11/21] KVM: arm64: Allow populating software bits Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:56   ` Fuad Tabba
2021-08-10  4:56     ` Fuad Tabba
2021-08-10  4:56     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 12/21] KVM: arm64: Add helpers to tag shared pages in SW bits Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24 ` [PATCH v4 13/21] KVM: arm64: Expose host stage-2 manipulation helpers Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:36   ` Fuad Tabba
2021-08-10  4:36     ` Fuad Tabba
2021-08-10  4:36     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 14/21] KVM: arm64: Expose pkvm_hyp_id Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:57   ` Fuad Tabba
2021-08-10  4:57     ` Fuad Tabba
2021-08-10  4:57     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 15/21] KVM: arm64: Introduce addr_is_memory() Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:37   ` Fuad Tabba
2021-08-10  4:37     ` Fuad Tabba
2021-08-10  4:37     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 16/21] KVM: arm64: Enable retrieving protections attributes of PTEs Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:38   ` Fuad Tabba
2021-08-10  4:38     ` Fuad Tabba
2021-08-10  4:38     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 17/21] KVM: arm64: Mark host bss and rodata section as shared Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:40   ` Fuad Tabba
2021-08-10  4:40     ` Fuad Tabba
2021-08-10  4:40     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 18/21] KVM: arm64: Remove __pkvm_mark_hyp Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:55   ` Fuad Tabba
2021-08-10  4:55     ` Fuad Tabba
2021-08-10  4:55     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 19/21] KVM: arm64: Refactor protected nVHE stage-1 locking Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:41   ` Fuad Tabba
2021-08-10  4:41     ` Fuad Tabba
2021-08-10  4:41     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 20/21] KVM: arm64: Restrict EL2 stage-1 changes in protected mode Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:43   ` Fuad Tabba
2021-08-10  4:43     ` Fuad Tabba
2021-08-10  4:43     ` Fuad Tabba
2021-08-09 15:24 ` [PATCH v4 21/21] KVM: arm64: Make __pkvm_create_mappings static Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-09 15:24   ` Quentin Perret
2021-08-10  4:55   ` Fuad Tabba
2021-08-10  4:55     ` Fuad Tabba
2021-08-10  4:55     ` Fuad Tabba
2021-08-11 11:25 ` [PATCH v4 00/21] Track shared pages at EL2 in protected mode Marc Zyngier
2021-08-11 11:25   ` Marc Zyngier
2021-08-11 11:25   ` Marc Zyngier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CA+_y_2EFZjEQEvX-ipy7Z40jDaeD8hd7YnxswkgGCp8VM4eHGw@mail.gmail.com \
    --to=qwandor@google.com \
    --cc=catalin.marinas@arm.com \
    --cc=kernel-team@android.com \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maz@kernel.org \
    --cc=qperret@google.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.