All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kai Huang <kai.huang@intel.com>
To: Jarkko Sakkinen <jarkko@kernel.org>
Cc: Sean Christopherson <seanjc@google.com>,
	kvm@vger.kernel.org, linux-sgx@vger.kernel.org, x86@kernel.org,
	linux-kernel@vger.kernel.org, luto@kernel.org,
	dave.hansen@intel.com, rick.p.edgecombe@intel.com,
	haitao.huang@intel.com, pbonzini@redhat.com, bp@alien8.de,
	tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com
Subject: Re: [PATCH v2 07/25] x86/sgx: Initialize virtual EPC driver even when SGX driver is disabled
Date: Tue, 16 Mar 2021 09:48:59 +1300	[thread overview]
Message-ID: <20210316094859.7b5947b743a81dff7434615c@intel.com> (raw)
In-Reply-To: <YE9mVUF0KOPNSfA9@kernel.org>

On Mon, 15 Mar 2021 15:51:17 +0200 Jarkko Sakkinen wrote:
> On Mon, Mar 15, 2021 at 03:04:59PM +0200, Jarkko Sakkinen wrote:
> > On Mon, Mar 15, 2021 at 04:13:17PM +1300, Kai Huang wrote:
> > > On Sun, 14 Mar 2021 17:27:18 +0200 Jarkko Sakkinen wrote:
> > > > On Sun, Mar 14, 2021 at 05:25:26PM +0200, Jarkko Sakkinen wrote:
> > > > > On Sat, Mar 13, 2021 at 09:07:36PM +0200, Jarkko Sakkinen wrote:
> > > > > > On Sat, Mar 13, 2021 at 09:05:36PM +0200, Jarkko Sakkinen wrote:
> > > > > > > On Fri, Mar 12, 2021 at 01:44:58PM -0800, Sean Christopherson wrote:
> > > > > > > > On Tue, Mar 09, 2021, Kai Huang wrote:
> > > > > > > > > Modify sgx_init() to always try to initialize the virtual EPC driver,
> > > > > > > > > even if the SGX driver is disabled.  The SGX driver might be disabled
> > > > > > > > > if SGX Launch Control is in locked mode, or not supported in the
> > > > > > > > > hardware at all.  This allows (non-Linux) guests that support non-LC
> > > > > > > > > configurations to use SGX.
> > > > > > > > > 
> > > > > > > > > Acked-by: Dave Hansen <dave.hansen@intel.com>
> > > > > > > > > Signed-off-by: Kai Huang <kai.huang@intel.com>
> > > > > > > > > ---
> > > > > > > > >  arch/x86/kernel/cpu/sgx/main.c | 10 +++++++++-
> > > > > > > > >  1 file changed, 9 insertions(+), 1 deletion(-)
> > > > > > > > > 
> > > > > > > > > diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c
> > > > > > > > > index 44fe91a5bfb3..8c922e68274d 100644
> > > > > > > > > --- a/arch/x86/kernel/cpu/sgx/main.c
> > > > > > > > > +++ b/arch/x86/kernel/cpu/sgx/main.c
> > > > > > > > > @@ -712,7 +712,15 @@ static int __init sgx_init(void)
> > > > > > > > >  		goto err_page_cache;
> > > > > > > > >  	}
> > > > > > > > >  
> > > > > > > > > -	ret = sgx_drv_init();
> > > > > > > > > +	/*
> > > > > > > > > +	 * Always try to initialize the native *and* KVM drivers.
> > > > > > > > > +	 * The KVM driver is less picky than the native one and
> > > > > > > > > +	 * can function if the native one is not supported on the
> > > > > > > > > +	 * current system or fails to initialize.
> > > > > > > > > +	 *
> > > > > > > > > +	 * Error out only if both fail to initialize.
> > > > > > > > > +	 */
> > > > > > > > > +	ret = !!sgx_drv_init() & !!sgx_vepc_init();
> > > > > > > > 
> > > > > > > > I love this code.
> > > > > > > > 
> > > > > > > > Reviewed-by: Sean Christopherson <seanjc@google.com>
> > > > > > > 
> > > > > > > I'm still wondering why this code let's go through when sgx_drv_init()
> > > > > > > succeeds and sgx_vepc_init() fails.
> > > > > > > 
> > > > > > > The inline comment explains only the mirrored case (which does make
> > > > > > > sense).
> > > > > > 
> > > > > > I.e. if sgx_drv_init() succeeds, I'd expect that sgx_vepc_init() must
> > > > > > succeed. Why expect legitly anything else?
> > > > >  
> > > > > Apologies coming with these ideas at this point, but here is what this
> > > > > led me.
> > > > > 
> > > > > I think that the all this complexity comes from a bad code structure.
> > > > > 
> > > > > So, what is essentially happening here:
> > > > > 
> > > > > - We essentially want to make EPC always work.
> > > > > - Driver optionally.
> > > > > 
> > > > > So what this sums to is something like:
> > > > > 
> > > > >         ret = sgx_epc_init();
> > > > >         if (ret) {
> > > > >                 pr_err("EPC initialization failed.\n");
> > > > >                 return ret;
> > > > >         }
> > > > > 
> > > > >         ret = sgx_drv_init();
> > > > >         if (ret)
> > > > >                 pr_info("Driver could not be initialized.\n");
> > > > > 
> > > > >         /* continue */
> > > > > 
> > > > > I.e. I think there should be a single EPC init, which does both EPC
> > > > > bootstrapping and vepc, and driver initialization comes after that.
> > > > 
> > > > In other words, from SGX point of view, the thing that KVM needs is
> > > > to cut out EPC and driver part into different islands. How this is now
> > > > implemented in the current patch set is half-way there but not yet what
> > > > it should be.
> > > 
> > > Well conceptually, SGX virtualization and SGX driver are two independently
> > > functionalities can be enabled separately, although they both requires some
> > > come functionalities, such as /dev/sgx_provision, which we have moved to
> > > sgx/main.c exactly for this purpose. THerefore, conceptually, it is bad to make
> > > assumption that, if SGX virtualization initialization succeeded, SGX driver
> > > must succeed -- we can potentially add more staff in SGX virtualization in the
> > > future..
> > > 
> > > If the name sgx_vepc_init() confuses you, I can rename it to sgx_virt_init().
> > 
> > I don't understand what would be the bad thing here. Can you open that
> > up please? I'm neither capable of predicting the future...

Conceptually they are two different functionalities, and doesn't depend on each
other. Why calling SGX driver initialization only when SGX virtualization
succeeded?

We might want to add reclaiming EPC page (VMM EPC oversubscription) from KVM
guest in the future, which may bring more initialization staff sgx_vepc_init(),
and those new staff should not impact SGX driver.

I don't see your approach is any better, both from concept and flexibility.

Like I said, we can rename to sgx_virt_init() to be more generic, but I
strongly disagree your approach.

> 
> Right, so since vepc_init() does only just device file initialization the
> current function structure is fine. I totally forgot that sgx_drv_init()
> does not call EPC initialization when I wrote the above :-) We refactored
> during the inital cycle the driver so many times that I sometimes fix up
> thing, sorry about.
> 
> To meld this into code:
> 
>         ret = sgx_vepc_init();
>         if (ret != -ENODEV) {
>                 pr_err("vEPC initialization failed with %d.\n", ret);
>                 return ret;
>         }
> 
>         ret = sgx_drv_init();
>         if (ret != ENODEV)
>                 pr_info("Driver initialization failed %d.\n", ret);

Hmm.. Let's say an extreme case: misc_register() failed in sgx_vepc_init(), due
to -ENOMEM. Then OOM kill gets involved, and kills bunch of apps. And then In
this case, theoretically, misc_register() in sgx_drv_init() doesn't need to
fail.

The point is really SGX driver and SGX virt are two independent
functionalities, so don't make dependency on them, manually. Plus I don't see
any benefit of your approach, but only cons.

> 
> This would also give more accurate information how far the initialization
> went.
> 
> /Jarkko

  reply	other threads:[~2021-03-15 20:50 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-09  1:38 [PATCH v2 00/25] KVM SGX virtualization support Kai Huang
2021-03-09  1:38 ` [PATCH v2 01/25] x86/cpufeatures: Make SGX_LC feature bit depend on SGX bit Kai Huang
2021-03-12 21:05   ` Sean Christopherson
2021-03-09  1:39 ` [PATCH v2 02/25] x86/cpufeatures: Add SGX1 and SGX2 sub-features Kai Huang
2021-03-12 21:10   ` Sean Christopherson
2021-03-09  1:39 ` [PATCH v2 03/25] x86/sgx: Wipe out EREMOVE from sgx_free_epc_page() Kai Huang
2021-03-10  9:35   ` Kai Huang
2021-03-11  2:01   ` [PATCH v3 " Kai Huang
2021-03-12 21:21     ` Sean Christopherson
2021-03-13 10:45       ` Jarkko Sakkinen
2021-03-15  7:12         ` Kai Huang
2021-03-15 13:18           ` Jarkko Sakkinen
2021-03-15 13:19             ` Jarkko Sakkinen
2021-03-15 20:29               ` Kai Huang
2021-03-15 22:59                 ` Jarkko Sakkinen
2021-03-15 23:50                   ` Kai Huang
2021-03-15 23:11                 ` Jarkko Sakkinen
2021-03-09  1:39 ` [PATCH v2 04/25] x86/sgx: Add SGX_CHILD_PRESENT hardware error code Kai Huang
2021-03-09  1:39 ` [PATCH v2 05/25] x86/sgx: Introduce virtual EPC for use by KVM guests Kai Huang
2021-03-09  1:39 ` [PATCH v2 06/25] x86/cpu/intel: Allow SGX virtualization without Launch Control support Kai Huang
2021-03-12 21:33   ` Sean Christopherson
2021-03-09  1:39 ` [PATCH v2 07/25] x86/sgx: Initialize virtual EPC driver even when SGX driver is disabled Kai Huang
2021-03-12 21:44   ` Sean Christopherson
2021-03-13 19:05     ` Jarkko Sakkinen
2021-03-13 19:07       ` Jarkko Sakkinen
2021-03-14 15:25         ` Jarkko Sakkinen
2021-03-14 15:27           ` Jarkko Sakkinen
2021-03-15  3:13             ` Kai Huang
2021-03-15 13:04               ` Jarkko Sakkinen
2021-03-15 13:51                 ` Jarkko Sakkinen
2021-03-15 20:48                   ` Kai Huang [this message]
2021-03-15 23:05                     ` Jarkko Sakkinen
2021-03-15 23:08                       ` Jarkko Sakkinen
2021-03-15 23:49                         ` Kai Huang
2021-03-16 12:44                           ` Jarkko Sakkinen
2021-03-16  1:13                         ` Sean Christopherson
2021-03-16 12:46                           ` Jarkko Sakkinen
2021-03-18  0:04                             ` Kai Huang
2021-03-09  1:39 ` [PATCH v2 08/25] x86/sgx: Expose SGX architectural definitions to the kernel Kai Huang
2021-03-12 21:58   ` Sean Christopherson
2021-03-15  3:36     ` Kai Huang
2021-03-09  1:39 ` [PATCH v2 09/25] x86/sgx: Move ENCLS leaf definitions to sgx.h Kai Huang
2021-03-09  1:39 ` [PATCH v2 10/25] x86/sgx: Add SGX2 ENCLS leaf definitions (EAUG, EMODPR and EMODT) Kai Huang
2021-03-09  1:39 ` [PATCH v2 11/25] x86/sgx: Add encls_faulted() helper Kai Huang
2021-03-09  1:39 ` [PATCH v2 12/25] x86/sgx: Add helper to update SGX_LEPUBKEYHASHn MSRs Kai Huang
2021-03-09  1:39 ` [PATCH v2 13/25] x86/sgx: Add helpers to expose ECREATE and EINIT to KVM Kai Huang
2021-03-15  4:08   ` Kai Huang
2021-03-09  1:39 ` [PATCH v2 14/25] x86/sgx: Move provisioning device creation out of SGX driver Kai Huang
2021-03-09  1:40 ` [PATCH v2 15/25] KVM: x86: Export kvm_mmu_gva_to_gpa_{read,write}() for SGX (VMX) Kai Huang
2021-03-09  1:40 ` [PATCH v2 16/25] KVM: x86: Define new #PF SGX error code bit Kai Huang
2021-03-09  1:40 ` [PATCH v2 17/25] KVM: x86: Add support for reverse CPUID lookup of scattered features Kai Huang
2021-03-09  1:40 ` [PATCH v2 18/25] KVM: x86: Add reverse-CPUID lookup support for scattered SGX features Kai Huang
2021-03-09  1:40 ` [PATCH v2 19/25] KVM: VMX: Add basic handling of VM-Exit from SGX enclave Kai Huang
2021-03-09  1:40 ` [PATCH v2 20/25] KVM: VMX: Frame in ENCLS handler for SGX virtualization Kai Huang
2021-03-09  1:40 ` [PATCH v2 21/25] KVM: VMX: Add SGX ENCLS[ECREATE] handler to enforce CPUID restrictions Kai Huang
2021-03-09  1:40 ` [PATCH v2 22/25] KVM: VMX: Add emulation of SGX Launch Control LE hash MSRs Kai Huang
2021-03-09  1:40 ` [PATCH v2 23/25] KVM: VMX: Add ENCLS[EINIT] handler to support SGX Launch Control (LC) Kai Huang
2021-03-09  1:40 ` [PATCH v2 24/25] KVM: VMX: Enable SGX virtualization for SGX1, SGX2 and LC Kai Huang
2021-03-09  1:41 ` [PATCH v2 25/25] KVM: x86: Add capability to grant VM access to privileged SGX attribute Kai Huang
2021-03-09  9:30 ` [PATCH v2 00/25] KVM SGX virtualization support Borislav Petkov
2021-03-09 18:08   ` Kai Huang
2021-03-09 18:49   ` Paolo Bonzini
2021-03-12 22:04     ` Sean Christopherson
2021-03-13  4:30       ` Kai Huang
2021-03-10  9:27   ` Kai Huang
2021-03-10 13:29     ` Borislav Petkov
2021-03-11  2:05       ` Kai Huang
2021-03-10 18:01   ` Jarkko Sakkinen
2021-03-10 20:44     ` Kai Huang

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=20210316094859.7b5947b743a81dff7434615c@intel.com \
    --to=kai.huang@intel.com \
    --cc=bp@alien8.de \
    --cc=dave.hansen@intel.com \
    --cc=haitao.huang@intel.com \
    --cc=hpa@zytor.com \
    --cc=jarkko@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sgx@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mingo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=rick.p.edgecombe@intel.com \
    --cc=seanjc@google.com \
    --cc=tglx@linutronix.de \
    --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.