Browse Source

s390/pfault: add sanity check

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>
Heiko Carstens 13 years ago
parent
commit
d49f47f83d
1 changed files with 3 additions and 0 deletions
  1. 3 0
      arch/s390/mm/fault.c

+ 3 - 0
arch/s390/mm/fault.c

@@ -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);
 }