cxl: Rework detach context functions
authorMichael Neuling <mikey@neuling.org>
Wed, 27 May 2015 06:07:08 +0000 (16:07 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 3 Jun 2015 03:27:18 +0000 (13:27 +1000)
Rework __detach_context() and cxl_context_detach() so we can reuse them in the
kernel API.

Signed-off-by: Michael Neuling <mikey@neuling.org>
Acked-by: Ian Munsie <imunsie@au1.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
drivers/misc/cxl/context.c
drivers/misc/cxl/cxl.h

index 36bb8e4195d5cfc97f575ca16d53c7630e9a353f..7d857b7d686d8729dc91606df36a062ac7391100 100644 (file)
@@ -174,7 +174,7 @@ int cxl_context_iomap(struct cxl_context *ctx, struct vm_area_struct *vma)
  * return until all outstanding interrupts for this context have completed. The
  * hardware should no longer access *ctx after this has returned.
  */
-static void __detach_context(struct cxl_context *ctx)
+int __detach_context(struct cxl_context *ctx)
 {
        enum cxl_context_status status;
 
@@ -183,12 +183,10 @@ static void __detach_context(struct cxl_context *ctx)
        ctx->status = CLOSED;
        mutex_unlock(&ctx->status_mutex);
        if (status != STARTED)
-               return;
+               return -EBUSY;
 
        WARN_ON(cxl_detach_process(ctx));
-       afu_release_irqs(ctx, ctx);
-       flush_work(&ctx->fault_work); /* Only needed for dedicated process */
-       wake_up_all(&ctx->wq);
+       return 0;
 }
 
 /*
@@ -199,7 +197,15 @@ static void __detach_context(struct cxl_context *ctx)
  */
 void cxl_context_detach(struct cxl_context *ctx)
 {
-       __detach_context(ctx);
+       int rc;
+
+       rc = __detach_context(ctx);
+       if (rc)
+               return;
+
+       afu_release_irqs(ctx, ctx);
+       flush_work(&ctx->fault_work); /* Only needed for dedicated process */
+       wake_up_all(&ctx->wq);
 }
 
 /*
@@ -216,7 +222,7 @@ void cxl_context_detach_all(struct cxl_afu *afu)
                 * Anything done in here needs to be setup before the IDR is
                 * created and torn down after the IDR removed
                 */
-               __detach_context(ctx);
+               cxl_context_detach(ctx);
 
                /*
                 * We are force detaching - remove any active PSA mappings so
index a4dadc5b5dd7e50bf8e5bf1e4d02afeda180bb4f..7b7509c79e1145974ea7873cec90fd0e5700428b 100644 (file)
@@ -636,6 +636,7 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master,
                     struct address_space *mapping);
 void cxl_context_free(struct cxl_context *ctx);
 int cxl_context_iomap(struct cxl_context *ctx, struct vm_area_struct *vma);
+int __detach_context(struct cxl_context *ctx);
 
 /* This matches the layout of the H_COLLECT_CA_INT_INFO retbuf */
 struct cxl_irq_info {