|
@@ -193,6 +193,16 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
|
|
|
|
|
|
ctx->mmio_err_ff = !!(work.flags & CXL_START_WORK_ERR_FF);
|
|
|
|
|
|
+ /*
|
|
|
+ * Increment the mapped context count for adapter. This also checks
|
|
|
+ * if adapter_context_lock is taken.
|
|
|
+ */
|
|
|
+ rc = cxl_adapter_context_get(ctx->afu->adapter);
|
|
|
+ if (rc) {
|
|
|
+ afu_release_irqs(ctx, ctx);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* We grab the PID here and not in the file open to allow for the case
|
|
|
* where a process (master, some daemon, etc) has opened the chardev on
|
|
@@ -205,15 +215,6 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
|
|
|
ctx->pid = get_task_pid(current, PIDTYPE_PID);
|
|
|
ctx->glpid = get_task_pid(current->group_leader, PIDTYPE_PID);
|
|
|
|
|
|
- /*
|
|
|
- * Increment the mapped context count for adapter. This also checks
|
|
|
- * if adapter_context_lock is taken.
|
|
|
- */
|
|
|
- rc = cxl_adapter_context_get(ctx->afu->adapter);
|
|
|
- if (rc) {
|
|
|
- afu_release_irqs(ctx, ctx);
|
|
|
- goto out;
|
|
|
- }
|
|
|
|
|
|
trace_cxl_attach(ctx, work.work_element_descriptor, work.num_interrupts, amr);
|
|
|
|
|
@@ -221,6 +222,9 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
|
|
|
amr))) {
|
|
|
afu_release_irqs(ctx, ctx);
|
|
|
cxl_adapter_context_put(ctx->afu->adapter);
|
|
|
+ put_pid(ctx->glpid);
|
|
|
+ put_pid(ctx->pid);
|
|
|
+ ctx->glpid = ctx->pid = NULL;
|
|
|
goto out;
|
|
|
}
|
|
|
|