Re: [PATCH v2 07/25] x86/sgx: Initialize virtual EPC driver even when SGX driver is disabled

From: Kai Huang
Date: Wed Mar 17 2021 - 20:05:53 EST


On Tue, 16 Mar 2021 14:46:05 +0200 Jarkko Sakkinen wrote:
> On Mon, Mar 15, 2021 at 06:13:53PM -0700, Sean Christopherson wrote:
> > On Tue, Mar 16, 2021, Jarkko Sakkinen wrote:
> > > On Tue, Mar 16, 2021 at 01:05:05AM +0200, Jarkko Sakkinen wrote:
> > > > The way I've understood it is that given that KVM can support SGX
> > > > without FLC, vEPC should be available even if driver cannot be
> > > > enabled.
> > > >
> > > > This is also exactly what the short summary states.
> > > >
> > > > "Initialize virtual EPC driver even when SGX driver is disabled"
> > > >
> > > > It *does not* state:
> > > >
> > > > "Initialize SGX driver even when vEPC driver is disabled"
> > > >
> > > > Also, this is how I interpret the inline comment.
> > > >
> > > > All this considered, the other direction is undocumented functionality.
> > >
> > > Also:
> > >
> > > 1. There is *zero* good practical reasons to support the "2nd direction".
> >
> > Uh, yes there is. CONFIG_KVM_INTEL=n and X86_FEATURE_VMX=n, either of which
> > will cause vEPC initialization to fail. The former is obvious, the latter is
> > possible via BIOS configuration.
>
> Hmm... So you make the checks as if ret != -ENODEV? That's the sane way to
> deal with that situation IMHO.
>
> /Jarkko

OK. I actually wrote the code to show your idea:

- ret = sgx_drv_init();
- if (ret)
+ /*
+ * Only continue to initialize SGX driver when SGX virtualization
+ * initialization is successful, or is not supported (-ENODEV), since
+ * any other initialization failure means SGX driver is unlikely to be
+ * initialized successfully.
+ */
+ ret = sgx_vepc_init();
+ if (ret && ret != -ENODEV)
goto err_kthread;

+ if (sgx_drv_init()) {
+ /*
+ * Cleanup when *both* SGX virtualization and SGX driver are
+ * not enabled, due to either not supported (-ENODEV), or
+ * somehow fail to initialize.
+ */
+ if (ret && ret != -ENODEV)
+ goto err_kthread;
+ }
+
return 0;

err_kthread:


Is this the code you want?