s390/pfault: add sanity check
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Thu, 10 May 2012 08:47:21 +0000 (10:47 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 16 May 2012 12:42:43 +0000 (14:42 +0200)
If the task that was found on an initial interrupt doesn't match the
current task execute a WARN_ON_ONCE() and don't put the task to sleep.

When this happened something went wrong between the interface of the
hypervisor and the kernel. In such a case keep the tasks alive to
avoid a hanging system.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/mm/fault.c

index a9c11aa57450b4e5b8262446d7171e032689432b..72cec9ecd96c7304486fc49b732764edcf4cb0f3 100644 (file)
@@ -584,6 +584,8 @@ static void pfault_interrupt(struct ext_code ext_code,
                }
        } else {
                /* signal bit not set -> a real page is missing. */
+               if (WARN_ON_ONCE(tsk != current))
+                       goto out;
                if (tsk->thread.pfault_wait == 1) {
                        /* Already on the list with a reference: put to sleep */
                        __set_task_state(tsk, TASK_UNINTERRUPTIBLE);
@@ -606,6 +608,7 @@ static void pfault_interrupt(struct ext_code ext_code,
                        set_tsk_need_resched(tsk);
                }
        }
+out:
        spin_unlock(&pfault_lock);
        put_task_struct(tsk);
 }