cxl: Only check pid for userspace contexts
authorMichael Neuling <mikey@neuling.org>
Wed, 27 May 2015 06:07:11 +0000 (16:07 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 3 Jun 2015 03:27:18 +0000 (13:27 +1000)
We only need to check the pid attached to this context for userspace contexts.
Kernel contexts can skip this check.

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/fault.c

index 5286b8b704f559eb21c1c7c5b2b4af3b9180444a..25a5418c55cb897e245a8faf8f728f059f5756fa 100644 (file)
@@ -172,8 +172,8 @@ void cxl_handle_fault(struct work_struct *fault_work)
                container_of(fault_work, struct cxl_context, fault_work);
        u64 dsisr = ctx->dsisr;
        u64 dar = ctx->dar;
-       struct task_struct *task;
-       struct mm_struct *mm;
+       struct task_struct *task = NULL;
+       struct mm_struct *mm = NULL;
 
        if (cxl_p2n_read(ctx->afu, CXL_PSL_DSISR_An) != dsisr ||
            cxl_p2n_read(ctx->afu, CXL_PSL_DAR_An) != dar ||
@@ -194,17 +194,19 @@ void cxl_handle_fault(struct work_struct *fault_work)
        pr_devel("CXL BOTTOM HALF handling fault for afu pe: %i. "
                "DSISR: %#llx DAR: %#llx\n", ctx->pe, dsisr, dar);
 
-       if (!(task = get_pid_task(ctx->pid, PIDTYPE_PID))) {
-               pr_devel("cxl_handle_fault unable to get task %i\n",
-                        pid_nr(ctx->pid));
-               cxl_ack_ae(ctx);
-               return;
-       }
-       if (!(mm = get_task_mm(task))) {
-               pr_devel("cxl_handle_fault unable to get mm %i\n",
-                        pid_nr(ctx->pid));
-               cxl_ack_ae(ctx);
-               goto out;
+       if (!ctx->kernel) {
+               if (!(task = get_pid_task(ctx->pid, PIDTYPE_PID))) {
+                       pr_devel("cxl_handle_fault unable to get task %i\n",
+                                pid_nr(ctx->pid));
+                       cxl_ack_ae(ctx);
+                       return;
+               }
+               if (!(mm = get_task_mm(task))) {
+                       pr_devel("cxl_handle_fault unable to get mm %i\n",
+                                pid_nr(ctx->pid));
+                       cxl_ack_ae(ctx);
+                       goto out;
+               }
        }
 
        if (dsisr & CXL_PSL_DSISR_An_DS)
@@ -214,9 +216,11 @@ void cxl_handle_fault(struct work_struct *fault_work)
        else
                WARN(1, "cxl_handle_fault has nothing to handle\n");
 
-       mmput(mm);
+       if (mm)
+               mmput(mm);
 out:
-       put_task_struct(task);
+       if (task)
+               put_task_struct(task);
 }
 
 static void cxl_prefault_one(struct cxl_context *ctx, u64 ea)