@@ -320,7 +320,7 @@ static void sgx_add_page_worker(struct work_struct *work)
do {
schedule();
- if (encl->flags & SGX_ENCL_SUSPEND)
+ if (encl->flags & SGX_ENCL_INVALIDATED)
skip_rest = true;
mutex_lock(&encl->lock);
@@ -135,16 +135,13 @@ void sgx_zap_tcs_ptes(struct sgx_encl *encl, struct vm_area_struct *vma)
bool sgx_pin_mm(struct sgx_encl *encl)
{
- if (encl->flags & SGX_ENCL_SUSPEND)
- return false;
-
mutex_lock(&encl->lock);
- if (!(encl->flags & SGX_ENCL_INVALIDATED)) {
- atomic_inc(&encl->mm->mm_count);
- } else {
+ if (encl->flags & SGX_ENCL_INVALIDATED) {
mutex_unlock(&encl->lock);
return false;
}
+
+ atomic_inc(&encl->mm->mm_count);
mutex_unlock(&encl->lock);
down_read(&encl->mm->mmap_sem);
@@ -259,8 +259,6 @@ static struct sgx_encl_page *sgx_vma_do_fault(struct vm_area_struct *vma,
list_add_tail(&entry->load_list, &encl->load_list);
out:
mutex_unlock(&encl->lock);
- if (encl->flags & SGX_ENCL_SUSPEND)
- free_flags |= SGX_FREE_SKIP_EREMOVE;
if (epc_page)
sgx_free_page(epc_page, encl, free_flags);
if (secs_epc_page)
@@ -361,8 +359,7 @@ static int sgx_vma_access(struct vm_area_struct *vma, unsigned long addr,
if (!(encl->flags & SGX_ENCL_DEBUG) ||
!(encl->flags & SGX_ENCL_INITIALIZED) ||
- (encl->flags & SGX_ENCL_INVALIDATED) ||
- (encl->flags & SGX_ENCL_SUSPEND))
+ (encl->flags & SGX_ENCL_INVALIDATED))
return -EFAULT;
sgx_dbg(encl, "%s addr=0x%lx, len=%d\n", op_str, addr, len);
Reduced the use of SGX_ENCL_SUSPEND only to three situations: - sgx_free_epc_page() checks this flags in order not to call ENCLS(EREMOVE) to an uninitialized EPC page. - sgx_find_encl() must be able to return SGX_POWER_LOST_ENCLAVE error code. In other cases SGX_ENCL_INVALIDATED will fully cover it. Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> --- drivers/platform/x86/intel_sgx_ioctl.c | 2 +- drivers/platform/x86/intel_sgx_util.c | 9 +++------ drivers/platform/x86/intel_sgx_vma.c | 5 +---- 3 files changed, 5 insertions(+), 11 deletions(-)