hc
2024-05-10 748e4f3d702def1a4bff191e0cf93b6a05340f01
kernel/arch/sparc/mm/fault_64.c
....@@ -27,7 +27,6 @@
2727 #include <linux/uaccess.h>
2828
2929 #include <asm/page.h>
30
-#include <asm/pgtable.h>
3130 #include <asm/openprom.h>
3231 #include <asm/oplib.h>
3332 #include <asm/asi.h>
....@@ -37,20 +36,6 @@
3736 #include <asm/setup.h>
3837
3938 int show_unhandled_signals = 1;
40
-
41
-static inline __kprobes int notify_page_fault(struct pt_regs *regs)
42
-{
43
- int ret = 0;
44
-
45
- /* kprobe_running() needs smp_processor_id() */
46
- if (kprobes_built_in() && !user_mode(regs)) {
47
- preempt_disable();
48
- if (kprobe_running() && kprobe_fault_handler(regs, 0))
49
- ret = 1;
50
- preempt_enable();
51
- }
52
- return ret;
53
-}
5439
5540 static void __kprobes unhandled_fault(unsigned long address,
5641 struct task_struct *tsk,
....@@ -85,7 +70,7 @@
8570 }
8671
8772 /*
88
- * We now make sure that mmap_sem is held in all paths that call
73
+ * We now make sure that mmap_lock is held in all paths that call
8974 * this. Additionally, to prevent kswapd from ripping ptes from
9075 * under us, raise interrupts around the time that we look at the
9176 * pte, kswapd will have to wait to get his smp ipi response from
....@@ -94,6 +79,7 @@
9479 static unsigned int get_user_insn(unsigned long tpc)
9580 {
9681 pgd_t *pgdp = pgd_offset(current->mm, tpc);
82
+ p4d_t *p4dp;
9783 pud_t *pudp;
9884 pmd_t *pmdp;
9985 pte_t *ptep, pte;
....@@ -102,7 +88,10 @@
10288
10389 if (pgd_none(*pgdp) || unlikely(pgd_bad(*pgdp)))
10490 goto out;
105
- pudp = pud_offset(pgdp, tpc);
91
+ p4dp = p4d_offset(pgdp, tpc);
92
+ if (p4d_none(*p4dp) || unlikely(p4d_bad(*p4dp)))
93
+ goto out;
94
+ pudp = pud_offset(p4dp, tpc);
10695 if (pud_none(*pudp) || unlikely(pud_bad(*pudp)))
10796 goto out;
10897
....@@ -187,7 +176,7 @@
187176 if (unlikely(show_unhandled_signals))
188177 show_signal_msg(regs, sig, code, addr, current);
189178
190
- force_sig_fault(sig, code, (void __user *) addr, 0, current);
179
+ force_sig_fault(sig, code, (void __user *) addr, 0);
191180 }
192181
193182 static unsigned int get_fault_insn(struct pt_regs *regs, unsigned int insn)
....@@ -281,11 +270,11 @@
281270 int si_code, fault_code;
282271 vm_fault_t fault;
283272 unsigned long address, mm_rss;
284
- unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
273
+ unsigned int flags = FAULT_FLAG_DEFAULT;
285274
286275 fault_code = get_thread_fault_code();
287276
288
- if (notify_page_fault(regs))
277
+ if (kprobe_page_fault(regs, 0))
289278 goto exit_exception;
290279
291280 si_code = SEGV_MAPERR;
....@@ -329,7 +318,7 @@
329318
330319 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
331320
332
- if (!down_read_trylock(&mm->mmap_sem)) {
321
+ if (!mmap_read_trylock(mm)) {
333322 if ((regs->tstate & TSTATE_PRIV) &&
334323 !search_exception_tables(regs->tpc)) {
335324 insn = get_fault_insn(regs, insn);
....@@ -337,7 +326,7 @@
337326 }
338327
339328 retry:
340
- down_read(&mm->mmap_sem);
329
+ mmap_read_lock(mm);
341330 }
342331
343332 if (fault_code & FAULT_CODE_BAD_RA)
....@@ -433,9 +422,9 @@
433422 goto bad_area;
434423 }
435424
436
- fault = handle_mm_fault(vma, address, flags);
425
+ fault = handle_mm_fault(vma, address, flags, regs);
437426
438
- if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
427
+ if (fault_signal_pending(fault, regs))
439428 goto exit_exception;
440429
441430 if (unlikely(fault & VM_FAULT_ERROR)) {
....@@ -449,20 +438,10 @@
449438 }
450439
451440 if (flags & FAULT_FLAG_ALLOW_RETRY) {
452
- if (fault & VM_FAULT_MAJOR) {
453
- current->maj_flt++;
454
- perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ,
455
- 1, regs, address);
456
- } else {
457
- current->min_flt++;
458
- perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN,
459
- 1, regs, address);
460
- }
461441 if (fault & VM_FAULT_RETRY) {
462
- flags &= ~FAULT_FLAG_ALLOW_RETRY;
463442 flags |= FAULT_FLAG_TRIED;
464443
465
- /* No need to up_read(&mm->mmap_sem) as we would
444
+ /* No need to mmap_read_unlock(mm) as we would
466445 * have already released it in __lock_page_or_retry
467446 * in mm/filemap.c.
468447 */
....@@ -470,7 +449,7 @@
470449 goto retry;
471450 }
472451 }
473
- up_read(&mm->mmap_sem);
452
+ mmap_read_unlock(mm);
474453
475454 mm_rss = get_mm_rss(mm);
476455 #if defined(CONFIG_TRANSPARENT_HUGEPAGE)
....@@ -501,7 +480,7 @@
501480 */
502481 bad_area:
503482 insn = get_fault_insn(regs, insn);
504
- up_read(&mm->mmap_sem);
483
+ mmap_read_unlock(mm);
505484
506485 handle_kernel_fault:
507486 do_kernel_fault(regs, si_code, fault_code, insn, address);
....@@ -513,7 +492,7 @@
513492 */
514493 out_of_memory:
515494 insn = get_fault_insn(regs, insn);
516
- up_read(&mm->mmap_sem);
495
+ mmap_read_unlock(mm);
517496 if (!(regs->tstate & TSTATE_PRIV)) {
518497 pagefault_out_of_memory();
519498 goto exit_exception;
....@@ -526,7 +505,7 @@
526505
527506 do_sigbus:
528507 insn = get_fault_insn(regs, insn);
529
- up_read(&mm->mmap_sem);
508
+ mmap_read_unlock(mm);
530509
531510 /*
532511 * Send a sigbus, regardless of whether we were in kernel