|
@@ -171,20 +171,25 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
|
|
|
unsigned long address)
|
|
|
{
|
|
|
struct vm_area_struct *vma, *prev_vma;
|
|
|
- struct task_struct *tsk = current;
|
|
|
- struct mm_struct *mm = tsk->mm;
|
|
|
+ struct task_struct *tsk;
|
|
|
+ struct mm_struct *mm;
|
|
|
unsigned long acc_type;
|
|
|
int fault;
|
|
|
- unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
|
|
|
+ unsigned int flags;
|
|
|
|
|
|
- if (in_atomic() || !mm)
|
|
|
+ if (in_atomic())
|
|
|
goto no_context;
|
|
|
|
|
|
+ tsk = current;
|
|
|
+ mm = tsk->mm;
|
|
|
+ if (!mm)
|
|
|
+ goto no_context;
|
|
|
+
|
|
|
+ flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
|
|
|
if (user_mode(regs))
|
|
|
flags |= FAULT_FLAG_USER;
|
|
|
|
|
|
acc_type = parisc_acctyp(code, regs->iir);
|
|
|
-
|
|
|
if (acc_type & VM_WRITE)
|
|
|
flags |= FAULT_FLAG_WRITE;
|
|
|
retry:
|