The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: Borislav Petkov <bp@suse.de>
To: Brijesh Singh <brijesh.singh@amd.com>
Cc: linux-kernel@vger.kernel.org, x86@kernel.org,
	kvm@vger.kernel.org, "Thomas Gleixner" <tglx@linutronix.de>,
	"Ingo Molnar" <mingo@redhat.com>,
	"H . Peter Anvin" <hpa@zytor.com>,
	"Andy Lutomirski" <luto@kernel.org>,
	"Tom Lendacky" <thomas.lendacky@amd.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Radim Krčmář" <rkrcmar@redhat.com>
Subject: Re: [Part1 PATCH v4 16/17] X86/KVM: Unencrypt shared per-cpu variables when SEV is active
Date: Tue, 19 Sep 2017 13:06:11 +0200	[thread overview]
Message-ID: <20170919110611.GN4733@nazgul.tnic> (raw)
In-Reply-To: <20170916123418.37807-17-brijesh.singh@amd.com>

On Sat, Sep 16, 2017 at 07:34:17AM -0500, Brijesh Singh wrote:
> When SEV is active, guest memory is encrypted with guest-specific key, a

						with a guest-specific key

> guest memory region shared with hypervisor must be mapped as unencrypted

			     with the hypervisor must be mapped as decrypted

> before we share it.

before we can share it.

> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: "H. Peter Anvin" <hpa@zytor.com>
> Cc: Borislav Petkov <bp@suse.de>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: "Radim Krčmář" <rkrcmar@redhat.com>
> Cc: Tom Lendacky <thomas.lendacky@amd.com>
> Cc: x86@kernel.org
> Cc: linux-kernel@vger.kernel.org
> Cc: kvm@vger.kernel.org
> Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
> ---
>  arch/x86/kernel/kvm.c | 46 +++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 43 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index 874827b0d7ca..9ccb48b027e4 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -75,8 +75,8 @@ static int parse_no_kvmclock_vsyscall(char *arg)
>  
>  early_param("no-kvmclock-vsyscall", parse_no_kvmclock_vsyscall);
>  
> -static DEFINE_PER_CPU(struct kvm_vcpu_pv_apf_data, apf_reason) __aligned(64);
> -static DEFINE_PER_CPU(struct kvm_steal_time, steal_time) __aligned(64);
> +static DEFINE_PER_CPU_UNENCRYPTED(struct kvm_vcpu_pv_apf_data, apf_reason) __aligned(64);
> +static DEFINE_PER_CPU_UNENCRYPTED(struct kvm_steal_time, steal_time) __aligned(64);
>  static int has_steal_clock = 0;
>  
>  /*
> @@ -305,7 +305,7 @@ static void kvm_register_steal_time(void)
>  		cpu, (unsigned long long) slow_virt_to_phys(st));
>  }
>  
> -static DEFINE_PER_CPU(unsigned long, kvm_apic_eoi) = KVM_PV_EOI_DISABLED;
> +static DEFINE_PER_CPU_UNENCRYPTED(unsigned long, kvm_apic_eoi) = KVM_PV_EOI_DISABLED;
>  
>  static notrace void kvm_guest_apic_eoi_write(u32 reg, u32 val)
>  {
> @@ -419,9 +419,46 @@ void kvm_disable_steal_time(void)
>  	wrmsr(MSR_KVM_STEAL_TIME, 0, 0);
>  }
>  
> +static inline void __init __set_percpu_var_unencrypted(
> +		void *var, int size)

Yuck, line ending with opening brace. Do the obvious thing:

static inline void __init __set_percpu_decrypted(void *var, int size)

> +{
> +	unsigned long pa = slow_virt_to_phys(var);
> +
> +	/* decrypt the memory in-place */
> +	sme_early_decrypt(pa, size);
> +
> +	/* clear the C-bit from the page table */
> +	early_set_memory_decrypted(pa, size);

So those two do a lot of work like TLB flushing and WBINVD for each
per-CPU variable and normally I'd say you do this on one go instead of
variable per variable and thus save yourself the subsequent expensive
invalidation calls but we do it once only during boot so maybe something
to think about later, when there's more time and boredom.

:)

> +}
> +
> +/*
> + * Iterate through all possible CPUs and map the memory region pointed
> + * by apf_reason, steal_time and kvm_apic_eoi as unencrypted at once.

s/unencrypted/decrypted/g

> + *
> + * Note: we iterate through all possible CPUs to ensure that CPUs
> + * hotplugged will have their per-cpu variable already mapped as
> + * unencrypted.
> + */
> +static void __init set_percpu_unencrypted(void)
> +{
> +	int cpu;
> +
> +	for_each_possible_cpu(cpu) {
> +		__set_percpu_var_unencrypted(&per_cpu(apf_reason, cpu),
> +			sizeof(struct kvm_vcpu_pv_apf_data));
> +		__set_percpu_var_unencrypted(&per_cpu(steal_time, cpu),
> +			sizeof(struct kvm_steal_time));
> +		__set_percpu_var_unencrypted(&per_cpu(kvm_apic_eoi, cpu),
> +			sizeof(unsigned long));
> +	}

Let it stick out and shorten function name:

	for_each_possible_cpu(cpu) {
                __set_percpu_decrypted(&per_cpu(apf_reason, cpu),   sizeof(struct kvm_vcpu_pv_apf_data));
                __set_percpu_decrypted(&per_cpu(steal_time, cpu),   sizeof(struct kvm_steal_time));
                __set_percpu_decrypted(&per_cpu(kvm_apic_eoi, cpu), sizeof(unsigned long));
        }

Also, we agreed to call everything that's not encrypted "decrypted" so
that we have only two different states: encrypted and decrypted and thus
less confusion.

> +}
> +
>  #ifdef CONFIG_SMP
>  static void __init kvm_smp_prepare_boot_cpu(void)
>  {
> +	if (sev_active())
> +		set_percpu_unencrypted();
> +

Move that sev_active() check into the function and call the latter
sev_map_percpu_data().

-- 
Regards/Gruss,
    Boris.

SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)
-- 

  reply	other threads:[~2017-09-19 11:06 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-16 12:34 [Part1 PATCH v4 00/17] x86: Secure Encrypted Virtualization (AMD) Brijesh Singh
2017-09-16 12:34 ` [Part1 PATCH v4 01/17] Documentation/x86: Add AMD Secure Encrypted Virtualization (SEV) description Brijesh Singh
2017-09-16 15:35   ` Borislav Petkov
2017-09-16 12:34 ` [Part1 PATCH v4 02/17] x86/mm: Add Secure Encrypted Virtualization (SEV) support Brijesh Singh
2017-09-17 14:02   ` Borislav Petkov
2017-09-26 19:06     ` Brijesh Singh
2017-09-16 12:34 ` [Part1 PATCH v4 03/17] x86/mm: Don't attempt to encrypt initrd under SEV Brijesh Singh
2017-09-17 14:04   ` Borislav Petkov
2017-09-16 12:34 ` [Part1 PATCH v4 04/17] x86/realmode: Don't decrypt trampoline area " Brijesh Singh
2017-09-17 14:04   ` Borislav Petkov
2017-09-16 12:34 ` [Part1 PATCH v4 05/17] x86/mm: Use encrypted access of boot related data with SEV Brijesh Singh
2017-09-17 14:05   ` Borislav Petkov
2017-09-16 12:34 ` [Part1 PATCH v4 06/17] x86/mm: Include SEV for encryption memory attribute changes Brijesh Singh
2017-09-17 14:05   ` Borislav Petkov
2017-09-16 12:34 ` [Part1 PATCH v4 07/17] x86/efi: Access EFI data as encrypted when SEV is active Brijesh Singh
2017-09-17 14:05   ` Borislav Petkov
2017-09-16 12:34 ` [Part1 PATCH v4 08/17] resource: Consolidate resource walking code Brijesh Singh
2017-09-17 14:05   ` Borislav Petkov
2017-09-16 12:34 ` [Part1 PATCH v4 09/17] resource: Provide resource struct in resource walk callback Brijesh Singh
2017-09-16 12:34 ` [Part1 PATCH v4 10/17] x86/mm, resource: Use PAGE_KERNEL protection for ioremap of memory pages Brijesh Singh
2017-09-17 14:07   ` Borislav Petkov
2017-09-26 19:11     ` Brijesh Singh
2017-09-16 12:34 ` [Part1 PATCH v4 11/17] x86/mm: DMA support for SEV memory encryption Brijesh Singh
2017-09-17 14:07   ` Borislav Petkov
2017-09-16 12:34 ` [Part1 PATCH v4 12/17] x86/boot: Add early boot support when running with SEV active Brijesh Singh
2017-09-17 14:41   ` Borislav Petkov
2017-09-26 19:10     ` Brijesh Singh
2017-09-16 12:34 ` [Part1 PATCH v4 13/17] x86/io: Unroll string I/O when SEV is active Brijesh Singh
2017-09-17 15:08   ` Borislav Petkov
2017-09-26 19:08     ` Brijesh Singh
2017-09-16 12:34 ` [Part1 PATCH v4 14/17] x86: Add support for changing memory encryption attribute in early boot Brijesh Singh
2017-09-17 15:25   ` Borislav Petkov
2017-09-16 12:34 ` [Part1 PATCH v4 15/17] percpu: introduce DEFINE_PER_CPU_UNENCRYPTED Brijesh Singh
2017-09-19  3:13   ` Tejun Heo
2017-09-19 10:39   ` Borislav Petkov
2017-09-19 13:50     ` Brijesh Singh
2017-09-20  7:34       ` Borislav Petkov
2017-09-20 16:16         ` Brijesh Singh
2017-09-16 12:34 ` [Part1 PATCH v4 16/17] X86/KVM: Unencrypt shared per-cpu variables when SEV is active Brijesh Singh
2017-09-19 11:06   ` Borislav Petkov [this message]
2017-09-19 14:00     ` Brijesh Singh
2017-09-20  7:39       ` Borislav Petkov
2017-09-16 12:34 ` [Part1 PATCH v4 17/17] X86/KVM: Clear encryption attribute " Brijesh Singh
2017-09-19 11:47   ` Borislav Petkov

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=20170919110611.GN4733@nazgul.tnic \
    --to=bp@suse.de \
    --cc=brijesh.singh@amd.com \
    --cc=hpa@zytor.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mingo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=rkrcmar@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=thomas.lendacky@amd.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox