Skip to content

Commit

Permalink
Fix compilation on 5.8 kernel (#120)
Browse files Browse the repository at this point in the history
* Fix compilation on 5.8 kernel

Signed-off-by: Don Porter <[email protected]>

* Address review comments

* Address review comments
  • Loading branch information
donporter authored Sep 2, 2020
1 parent 75bf89f commit 276c5c6
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 5 deletions.
30 changes: 26 additions & 4 deletions sgx_encl.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,11 @@ static void sgx_add_page_worker(struct work_struct *work)
goto next;
}

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_lock(encl->mm);
#else
down_read(&encl->mm->mmap_sem);
#endif
mutex_lock(&encl->lock);

if (!sgx_process_add_page_req(req, epc_page)) {
Expand All @@ -325,7 +329,11 @@ static void sgx_add_page_worker(struct work_struct *work)
}

mutex_unlock(&encl->lock);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_unlock(encl->mm);
#else
up_read(&encl->mm->mmap_sem);
#endif

next:
kfree(req);
Expand Down Expand Up @@ -639,31 +647,45 @@ int sgx_encl_create(struct sgx_secs *secs)
goto out;
}

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_lock(current->mm);
#else
down_read(&current->mm->mmap_sem);
#endif
ret = sgx_encl_find(current->mm, secs->base, &vma);
if (ret != -ENOENT) {
if (!ret)
ret = -EINVAL;
up_read(&current->mm->mmap_sem);
goto out;
goto out_locked;
}

if (vma->vm_start != secs->base ||
vma->vm_end != (secs->base + secs->size)
/* vma->vm_pgoff != 0 */) {
ret = -EINVAL;
up_read(&current->mm->mmap_sem);
goto out;
goto out_locked;
}

vma->vm_private_data = encl;

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_unlock(current->mm);
#else
up_read(&current->mm->mmap_sem);
#endif

mutex_lock(&sgx_tgid_ctx_mutex);
list_add_tail(&encl->encl_list, &encl->tgid_ctx->encl_list);
mutex_unlock(&sgx_tgid_ctx_mutex);

return 0;
out_locked:
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_unlock(current->mm);
#else
up_read(&current->mm->mmap_sem);
#endif

out:
if (encl)
kref_put(&encl->refcount, sgx_encl_release);
Expand Down
19 changes: 18 additions & 1 deletion sgx_encl2.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,12 +234,22 @@ static int isolate_range(struct sgx_encl *encl,

address = rg->start_addr;
end = address + rg->nr_pages * PAGE_SIZE;

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_lock(encl->mm);
#else
down_read(&encl->mm->mmap_sem);
#endif


for (; address < end; address += PAGE_SIZE) {
ret = sgx_encl_find(encl->mm, address, &vma);
if (ret || encl != vma->vm_private_data) {
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_unlock(encl->mm);
#else
up_read(&encl->mm->mmap_sem);
#endif
return -EINVAL;
}

Expand All @@ -250,7 +260,11 @@ static int isolate_range(struct sgx_encl *encl,
SGX_FAULT_RESERVE, NULL);

if (IS_ERR(encl_page)) {
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_unlock(encl->mm);
#else
up_read(&encl->mm->mmap_sem);
#endif
sgx_err(encl, "sgx: No page found at address 0x%lx\n",
address);
return PTR_ERR(encl_page);
Expand All @@ -264,8 +278,11 @@ static int isolate_range(struct sgx_encl *encl,
encl_page->flags &= ~SGX_ENCL_PAGE_RESERVED;
mutex_unlock(&encl->lock);
}

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_unlock(encl->mm);
#else
up_read(&encl->mm->mmap_sem);
#endif
return 0;
}

Expand Down
9 changes: 9 additions & 0 deletions sgx_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,11 @@ int sgx_get_encl(unsigned long addr, struct sgx_encl **encl)
if (addr & (PAGE_SIZE - 1))
return -EINVAL;

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_lock(mm);
#else
down_read(&mm->mmap_sem);
#endif

ret = sgx_encl_find(mm, addr, &vma);
if (!ret) {
Expand All @@ -94,7 +98,12 @@ int sgx_get_encl(unsigned long addr, struct sgx_encl **encl)
kref_get(&(*encl)->refcount);
}

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_unlock(mm);
#else
up_read(&mm->mmap_sem);
#endif

return ret;
}

Expand Down
9 changes: 9 additions & 0 deletions sgx_page_cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,10 +376,19 @@ static void sgx_swap_pages(unsigned long nr_to_scan)
if (!encl)
goto out;

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_lock(encl->mm);
#else
down_read(&encl->mm->mmap_sem);
#endif

sgx_isolate_pages(encl, &cluster, nr_to_scan);
sgx_write_pages(encl, &cluster);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
mmap_read_unlock(encl->mm);
#else
up_read(&encl->mm->mmap_sem);
#endif

kref_put(&encl->refcount, sgx_encl_release);
out:
Expand Down

0 comments on commit 276c5c6

Please sign in to comment.