These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / misc / cxl / fault.c
index 5286b8b..25a5418 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)