diff options
Diffstat (limited to 'drivers/misc/cxl/file.c')
-rw-r--r-- | drivers/misc/cxl/file.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/misc/cxl/file.c b/drivers/misc/cxl/file.c index 5fb9894b157f..77080cc5fa0a 100644 --- a/drivers/misc/cxl/file.c +++ b/drivers/misc/cxl/file.c | |||
@@ -194,6 +194,16 @@ static long afu_ioctl_start_work(struct cxl_context *ctx, | |||
194 | ctx->mmio_err_ff = !!(work.flags & CXL_START_WORK_ERR_FF); | 194 | ctx->mmio_err_ff = !!(work.flags & CXL_START_WORK_ERR_FF); |
195 | 195 | ||
196 | /* | 196 | /* |
197 | * Increment the mapped context count for adapter. This also checks | ||
198 | * if adapter_context_lock is taken. | ||
199 | */ | ||
200 | rc = cxl_adapter_context_get(ctx->afu->adapter); | ||
201 | if (rc) { | ||
202 | afu_release_irqs(ctx, ctx); | ||
203 | goto out; | ||
204 | } | ||
205 | |||
206 | /* | ||
197 | * We grab the PID here and not in the file open to allow for the case | 207 | * We grab the PID here and not in the file open to allow for the case |
198 | * where a process (master, some daemon, etc) has opened the chardev on | 208 | * where a process (master, some daemon, etc) has opened the chardev on |
199 | * behalf of another process, so the AFU's mm gets bound to the process | 209 | * behalf of another process, so the AFU's mm gets bound to the process |
@@ -205,11 +215,16 @@ static long afu_ioctl_start_work(struct cxl_context *ctx, | |||
205 | ctx->pid = get_task_pid(current, PIDTYPE_PID); | 215 | ctx->pid = get_task_pid(current, PIDTYPE_PID); |
206 | ctx->glpid = get_task_pid(current->group_leader, PIDTYPE_PID); | 216 | ctx->glpid = get_task_pid(current->group_leader, PIDTYPE_PID); |
207 | 217 | ||
218 | |||
208 | trace_cxl_attach(ctx, work.work_element_descriptor, work.num_interrupts, amr); | 219 | trace_cxl_attach(ctx, work.work_element_descriptor, work.num_interrupts, amr); |
209 | 220 | ||
210 | if ((rc = cxl_ops->attach_process(ctx, false, work.work_element_descriptor, | 221 | if ((rc = cxl_ops->attach_process(ctx, false, work.work_element_descriptor, |
211 | amr))) { | 222 | amr))) { |
212 | afu_release_irqs(ctx, ctx); | 223 | afu_release_irqs(ctx, ctx); |
224 | cxl_adapter_context_put(ctx->afu->adapter); | ||
225 | put_pid(ctx->glpid); | ||
226 | put_pid(ctx->pid); | ||
227 | ctx->glpid = ctx->pid = NULL; | ||
213 | goto out; | 228 | goto out; |
214 | } | 229 | } |
215 | 230 | ||