Re: [RFC PATCH 4/4] x86/vdso: x86/sgx: Allow the user to exit the vDSO loop on interrupts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2020-08-26 20:32, Sean Christopherson wrote:
> On Mon, Aug 24, 2020 at 03:36:29PM +0200, Jethro Beekman wrote:
>> On 2020-08-22 23:55, Andy Lutomirski wrote:
>>> On Thu, Aug 20, 2020 at 10:53 AM Jethro Beekman <jethro@xxxxxxxxxxxx> wrote:
>>>>
>>>> On 2020-08-20 19:44, Andy Lutomirski wrote:
>>>>> This is a genuine semantic question: is __vdso_sgx_enter_enclave()
>>>>> like read on a pipe (returns -EINTR on a signal) or is it more like a
>>>>> restartable syscall or a normal library function that just keeps
>>>>> running if your signal handler does nothing?  You could siglongjmp()
>>>>> out, but that's a bit gross.
>>>>>
>>>>> I wouldn't object to an option to __vdso_sgx_enter_enclave() to make
>>>>> it return -EINTR if signaled by a non-SA_RESTART signal.  Implementing
>>>>> it might be distinctly nontrivial, though.
>>>>>
>>>>> But this isn't what this patch does, and I suspect we've been talking
>>>>> past each other.  This patch makes __vdso_sgx_enter_enclave() return
>>>>> if there's an *interrupt*.  If you push a keyboard button, move your
>>>>> mouse, get a network interrupt on that core, etc, it will return.
>>>>> This is nonsense.
>>>>
>>>> It's not nontrivial to return on signals, this patch does it. This patch *also* returns when there's a HW interrupt, but that's not important.
>>>
>>> Allow me to quote the changelog of the patch:
>>>
>>> This allows the user's runtime to switch
>>> contexts at opportune times without additional overhead, e.g. when using
>>> an M:N threading model (where M user threads run N TCSs, with N > M).
>>>
>>> NAK.
>>>
>>>>
>>>> It sounds like you're saying you want to subdivide AEXs into “interrupts
>>>> that lead to user-observable signals” and “other interrupts”, and then
>>>> hide the second category from the user. I wouldn't object to that, but I
>>>> don't know how to code this. It seems like a lot of work compared to the
>>>> obvious solution (this patch).
>>>
>>> The obvious solution is NAKked.
>>>
>>> Does siglongjmp() really not work for you?
>>
>> Allow me to quote the changelog of "[PATCH v36 18/24] x86/vdso: Add support
>> for exception fixup in vDSO functions":
>>
>> Putting everything together, userspace enclaves will utilize a library
>> that must be prepared to handle any and (almost) all exceptions any time
>> at least one thread may be executing in an enclave.  Leveraging signals
>> to handle the enclave exceptions is unpleasant, to put it mildly, e.g.
>> the SGX library must constantly (un)register its signal handler based
>> on whether or not at least one thread is executing in an enclave, and
>> filter and forward exceptions that aren't related to its enclaves.  This
>> becomes particularly nasty when using multiple levels of libraries that
>> register signal handlers, e.g. running an enclave via cgo inside of the
>> Go runtime.
>>
>>
>> If I could use signal handlers I wouldn't use the VDSO call. (Corollary: if I
>> wasn't using the VDSO call, I wouldn't have to think about this because what
>> I want is already supported).
> 
> Jethro, I think what you're requesting is simply not possible.  Or rather,
> the SGX vDSO can't provide any additional value relative to what can be
> provided by userspace.
> 
> What Andy is saying is that having the vDSO take action on interrupts is
> undesirable/NAK'd from a kernel perspective, as it's ugly and unreliable.
> It happens to mostly work for SIGALRM because there is an interrupt
> associated with the expiration of the timer[*].  But even then it will
> work if and only if the interrupt arrives while the enclave is running.
> If the interrupt arrives just before ENCLU, either on initial entry or
> on resume from the callback, SIGALRM will be delivered and the userspace
> M:N scheduler that is relying on an exit from the enclave will miss its
> "tick".
> 
> The vDSO could check for pending signals, but that effectively provides no
> value as opposed to checking for signals in the callback (or caller).
> 
> The goal of the SGX vDSO is to obviate the need for handling signals that
> are due to exceptions that are directly associated with the enclave.  IMO,
> the SIGALRM request is completely out of scope as it is not a problem that
> is unique to SGX, i.e. wanting to do M:N scheduling in a library without
> hooking SIGALRM is a generic request.  The fact that the SGX architcture has
> a quirk that allows for a semi-functional hack is not justification for
> supporting such a hack in the kernel.
> 
> [*] Is it even guaranteed that an interrupt will precede SIGALRM?  Not that
>     it matters for this discussion.
> 

Let's make sure the VDSO call has a flags parameter and we can talk about this after merge.

--
Jethro Beekman | Fortanix

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature


[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux