diff options
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/mm/fault.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 75fde949d125..856a971759b1 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
@@ -563,12 +563,14 @@ pfault_interrupt(struct pt_regs *regs, __u16 error_code) | |||
563 | * interrupt. pfault_wait is valid. Set pfault_wait | 563 | * interrupt. pfault_wait is valid. Set pfault_wait |
564 | * back to zero and wake up the process. This can | 564 | * back to zero and wake up the process. This can |
565 | * safely be done because the task is still sleeping | 565 | * safely be done because the task is still sleeping |
566 | * and can't procude new pfaults. */ | 566 | * and can't produce new pfaults. */ |
567 | tsk->thread.pfault_wait = 0; | 567 | tsk->thread.pfault_wait = 0; |
568 | wake_up_process(tsk); | 568 | wake_up_process(tsk); |
569 | put_task_struct(tsk); | ||
569 | } | 570 | } |
570 | } else { | 571 | } else { |
571 | /* signal bit not set -> a real page is missing. */ | 572 | /* signal bit not set -> a real page is missing. */ |
573 | get_task_struct(tsk); | ||
572 | set_task_state(tsk, TASK_UNINTERRUPTIBLE); | 574 | set_task_state(tsk, TASK_UNINTERRUPTIBLE); |
573 | if (xchg(&tsk->thread.pfault_wait, 1) != 0) { | 575 | if (xchg(&tsk->thread.pfault_wait, 1) != 0) { |
574 | /* Completion interrupt was faster than the initial | 576 | /* Completion interrupt was faster than the initial |
@@ -578,6 +580,7 @@ pfault_interrupt(struct pt_regs *regs, __u16 error_code) | |||
578 | * mode and can't produce new pfaults. */ | 580 | * mode and can't produce new pfaults. */ |
579 | tsk->thread.pfault_wait = 0; | 581 | tsk->thread.pfault_wait = 0; |
580 | set_task_state(tsk, TASK_RUNNING); | 582 | set_task_state(tsk, TASK_RUNNING); |
583 | put_task_struct(tsk); | ||
581 | } else | 584 | } else |
582 | set_tsk_need_resched(tsk); | 585 | set_tsk_need_resched(tsk); |
583 | } | 586 | } |