[for_v22,09/11] x86/sgx: Refactor error handling for user of sgx_encl_grow()
diff mbox series

Message ID 20190808001254.11926-10-sean.j.christopherson@intel.com
State New
Headers show
Series
  • x86/sgx: Bug fixes for v22
Related show

Commit Message

Sean Christopherson Aug. 8, 2019, 12:12 a.m. UTC
Refactor sgx_encl_add_page() and sgx_encl_create() to prepare for
changes to sgx_encl_grow() that will introduce additional error paths.
Neither approach scales well as is, and it'll help readability for both
flows to use similar style error handling.

No functional change intended.

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
---
 arch/x86/kernel/cpu/sgx/driver/ioctl.c | 40 ++++++++++++++------------
 1 file changed, 21 insertions(+), 19 deletions(-)

Comments

Jarkko Sakkinen Aug. 8, 2019, 3:49 p.m. UTC | #1
On Wed, Aug 07, 2019 at 05:12:52PM -0700, Sean Christopherson wrote:
> Refactor sgx_encl_add_page() and sgx_encl_create() to prepare for
> changes to sgx_encl_grow() that will introduce additional error paths.
> Neither approach scales well as is, and it'll help readability for both
> flows to use similar style error handling.
> 
> No functional change intended.
> 
> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>

Acked-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>

/Jarkko

Patch
diff mbox series

diff --git a/arch/x86/kernel/cpu/sgx/driver/ioctl.c b/arch/x86/kernel/cpu/sgx/driver/ioctl.c
index 18f6925ab2ed..fec5e0a346f5 100644
--- a/arch/x86/kernel/cpu/sgx/driver/ioctl.c
+++ b/arch/x86/kernel/cpu/sgx/driver/ioctl.c
@@ -283,14 +283,14 @@  static int sgx_encl_create(struct sgx_encl *encl, struct sgx_secs *secs)
 	ssaframesize = sgx_calc_ssaframesize(secs->miscselect, secs->xfrm);
 	if (sgx_validate_secs(secs, ssaframesize)) {
 		ret = -EINVAL;
-		goto err_out;
+		goto err_out_unlock;
 	}
 
 	backing = shmem_file_setup("SGX backing", encl_size + (encl_size >> 5),
 				   VM_NORESERVE);
 	if (IS_ERR(backing)) {
 		ret = PTR_ERR(backing);
-		goto err_out;
+		goto err_out_unlock;
 	}
 
 	encl->backing = backing;
@@ -300,7 +300,7 @@  static int sgx_encl_create(struct sgx_encl *encl, struct sgx_secs *secs)
 	secs_epc = sgx_alloc_page(&encl->secs, true);
 	if (IS_ERR(secs_epc)) {
 		ret = PTR_ERR(secs_epc);
-		goto err_out;
+		goto err_out_backing;
 	}
 
 	encl->secs.epc_page = secs_epc;
@@ -338,15 +338,12 @@  static int sgx_encl_create(struct sgx_encl *encl, struct sgx_secs *secs)
 	return 0;
 
 err_out:
-	if (encl->secs.epc_page) {
-		sgx_free_page(encl->secs.epc_page);
-		encl->secs.epc_page = NULL;
-	}
+	sgx_free_page(encl->secs.epc_page);
+	encl->secs.epc_page = NULL;
 
-	if (encl->backing) {
-		fput(encl->backing);
-		encl->backing = NULL;
-	}
+err_out_backing:
+	fput(encl->backing);
+	encl->backing = NULL;
 
 err_out_unlock:
 	mutex_unlock(&encl->lock);
@@ -525,23 +522,28 @@  static int sgx_encl_add_page(struct sgx_encl *encl, unsigned long addr,
 
 	if (encl->flags & (SGX_ENCL_INITIALIZED | SGX_ENCL_DEAD)) {
 		ret = -EFAULT;
-		goto out;
+		goto err_out_unlock;
 	}
 
 	encl_page = sgx_encl_page_alloc(encl, addr, prot);
 	if (IS_ERR(encl_page)) {
 		ret = PTR_ERR(encl_page);
-		goto out;
+		goto err_out_unlock;
 	}
 
 	ret = __sgx_encl_add_page(encl, encl_page, data, secinfo, mrmask);
-	if (ret) {
-		radix_tree_delete(&encl_page->encl->page_tree,
-				  PFN_DOWN(encl_page->desc));
-		kfree(encl_page);
-	}
+	if (ret)
+		goto err_out;
 
-out:
+	mutex_unlock(&encl->lock);
+	return 0;
+
+err_out:
+	radix_tree_delete(&encl_page->encl->page_tree,
+			  PFN_DOWN(encl_page->desc));
+	kfree(encl_page);
+
+err_out_unlock:
 	mutex_unlock(&encl->lock);
 	return ret;
 }