From: Kees Cook <keescook@chromium.org>
To: Balbir Singh <sblbir@amazon.com>
Cc: tglx@linutronix.de, linux-kernel@vger.kernel.org,
jpoimboe@redhat.com, tony.luck@intel.com,
benh@kernel.crashing.org, x86@kernel.org, dave.hansen@intel.com
Subject: Re: [PATCH v2 1/4] arch/x86/kvm: Refactor l1d flush lifecycle management
Date: Tue, 7 Apr 2020 11:21:11 -0700 [thread overview]
Message-ID: <202004071121.AE5534C@keescook> (raw)
In-Reply-To: <20200406031946.11815-2-sblbir@amazon.com>
On Mon, Apr 06, 2020 at 01:19:43PM +1000, Balbir Singh wrote:
> Split out the allocation and free routines to be used in a follow
> up set of patches (to reuse for L1D flushing).
>
> Signed-off-by: Balbir Singh <sblbir@amazon.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
-Kees
> ---
> arch/x86/include/asm/cacheflush.h | 3 +++
> arch/x86/kernel/Makefile | 1 +
> arch/x86/kernel/l1d_flush.c | 36 +++++++++++++++++++++++++++++++
> arch/x86/kvm/vmx/vmx.c | 25 +++------------------
> 4 files changed, 43 insertions(+), 22 deletions(-)
> create mode 100644 arch/x86/kernel/l1d_flush.c
>
> diff --git a/arch/x86/include/asm/cacheflush.h b/arch/x86/include/asm/cacheflush.h
> index 63feaf2a5f93..6419a4cef0e8 100644
> --- a/arch/x86/include/asm/cacheflush.h
> +++ b/arch/x86/include/asm/cacheflush.h
> @@ -6,6 +6,9 @@
> #include <asm-generic/cacheflush.h>
> #include <asm/special_insns.h>
>
> +#define L1D_CACHE_ORDER 4
> void clflush_cache_range(void *addr, unsigned int size);
> +void *alloc_l1d_flush_pages(void);
> +void cleanup_l1d_flush_pages(void *l1d_flush_pages);
>
> #endif /* _ASM_X86_CACHEFLUSH_H */
> diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
> index d6d61c4455fa..48f443e6c2de 100644
> --- a/arch/x86/kernel/Makefile
> +++ b/arch/x86/kernel/Makefile
> @@ -160,3 +160,4 @@ ifeq ($(CONFIG_X86_64),y)
> endif
>
> obj-$(CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT) += ima_arch.o
> +obj-y += l1d_flush.o
> diff --git a/arch/x86/kernel/l1d_flush.c b/arch/x86/kernel/l1d_flush.c
> new file mode 100644
> index 000000000000..05f375c33423
> --- /dev/null
> +++ b/arch/x86/kernel/l1d_flush.c
> @@ -0,0 +1,36 @@
> +#include <linux/mm.h>
> +#include <asm/cacheflush.h>
> +
> +void *alloc_l1d_flush_pages(void)
> +{
> + struct page *page;
> + void *l1d_flush_pages = NULL;
> + int i;
> +
> + /*
> + * This allocation for l1d_flush_pages is not tied to a VM/task's
> + * lifetime and so should not be charged to a memcg.
> + */
> + page = alloc_pages(GFP_KERNEL, L1D_CACHE_ORDER);
> + if (!page)
> + return NULL;
> + l1d_flush_pages = page_address(page);
> +
> + /*
> + * Initialize each page with a different pattern in
> + * order to protect against KSM in the nested
> + * virtualization case.
> + */
> + for (i = 0; i < 1u << L1D_CACHE_ORDER; ++i) {
> + memset(l1d_flush_pages + i * PAGE_SIZE, i + 1,
> + PAGE_SIZE);
> + }
> + return l1d_flush_pages;
> +}
> +EXPORT_SYMBOL_GPL(alloc_l1d_flush_pages);
> +
> +void cleanup_l1d_flush_pages(void *l1d_flush_pages)
> +{
> + free_pages((unsigned long)l1d_flush_pages, L1D_CACHE_ORDER);
> +}
> +EXPORT_SYMBOL_GPL(cleanup_l1d_flush_pages);
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 9eaccf92d616..209e63798435 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -203,14 +203,10 @@ static const struct {
> [VMENTER_L1D_FLUSH_NOT_REQUIRED] = {"not required", false},
> };
>
> -#define L1D_CACHE_ORDER 4
> static void *vmx_l1d_flush_pages;
>
> static int vmx_setup_l1d_flush(enum vmx_l1d_flush_state l1tf)
> {
> - struct page *page;
> - unsigned int i;
> -
> if (!boot_cpu_has_bug(X86_BUG_L1TF)) {
> l1tf_vmx_mitigation = VMENTER_L1D_FLUSH_NOT_REQUIRED;
> return 0;
> @@ -253,24 +249,9 @@ static int vmx_setup_l1d_flush(enum vmx_l1d_flush_state l1tf)
>
> if (l1tf != VMENTER_L1D_FLUSH_NEVER && !vmx_l1d_flush_pages &&
> !boot_cpu_has(X86_FEATURE_FLUSH_L1D)) {
> - /*
> - * This allocation for vmx_l1d_flush_pages is not tied to a VM
> - * lifetime and so should not be charged to a memcg.
> - */
> - page = alloc_pages(GFP_KERNEL, L1D_CACHE_ORDER);
> - if (!page)
> + vmx_l1d_flush_pages = alloc_l1d_flush_pages();
> + if (!vmx_l1d_flush_pages)
> return -ENOMEM;
> - vmx_l1d_flush_pages = page_address(page);
> -
> - /*
> - * Initialize each page with a different pattern in
> - * order to protect against KSM in the nested
> - * virtualization case.
> - */
> - for (i = 0; i < 1u << L1D_CACHE_ORDER; ++i) {
> - memset(vmx_l1d_flush_pages + i * PAGE_SIZE, i + 1,
> - PAGE_SIZE);
> - }
> }
>
> l1tf_vmx_mitigation = l1tf;
> @@ -7992,7 +7973,7 @@ static struct kvm_x86_ops vmx_x86_ops __ro_after_init = {
> static void vmx_cleanup_l1d_flush(void)
> {
> if (vmx_l1d_flush_pages) {
> - free_pages((unsigned long)vmx_l1d_flush_pages, L1D_CACHE_ORDER);
> + cleanup_l1d_flush_pages(vmx_l1d_flush_pages);
> vmx_l1d_flush_pages = NULL;
> }
> /* Restore state so sysfs ignores VMX */
> --
> 2.17.1
>
--
Kees Cook
next prev parent reply other threads:[~2020-04-07 18:21 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-06 3:19 [PATCH v2 0/4] arch/x86: Optionally flush L1D on context switch Balbir Singh
2020-04-06 3:19 ` [PATCH v2 1/4] arch/x86/kvm: Refactor l1d flush lifecycle management Balbir Singh
2020-04-07 18:21 ` Kees Cook [this message]
2020-04-06 3:19 ` [PATCH v2 2/4] arch/x86: Refactor tlbflush and l1d flush Balbir Singh
2020-04-07 18:25 ` Kees Cook
2020-04-08 0:22 ` Singh, Balbir
2020-04-06 3:19 ` [PATCH v2 3/4] arch/x86: Optionally flush L1D on context switch Balbir Singh
2020-04-07 18:26 ` Kees Cook
2020-04-07 23:37 ` Benjamin Herrenschmidt
2020-04-07 23:39 ` Singh, Balbir
2020-04-07 23:49 ` Thomas Gleixner
2020-05-19 23:41 ` Singh, Balbir
2020-04-07 23:52 ` Thomas Gleixner
2020-04-08 0:14 ` Singh, Balbir
2020-04-06 3:19 ` [PATCH v2 4/4] arch/x86: Add L1D flushing Documentation Balbir Singh
2020-05-19 15:39 ` Randy Dunlap
2020-05-20 0:47 ` Singh, Balbir
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=202004071121.AE5534C@keescook \
--to=keescook@chromium.org \
--cc=benh@kernel.crashing.org \
--cc=dave.hansen@intel.com \
--cc=jpoimboe@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=sblbir@amazon.com \
--cc=tglx@linutronix.de \
--cc=tony.luck@intel.com \
--cc=x86@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.