Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc

Pull more powerpc updates from Ben Herrenschmidt:
"Here are some more powerpc bits for 3.17, essentially fixes.

The biggest series, also aimed at -stable, is from Aneesh and is the
result of weeks and weeks of debugging to find out why the heck or THP
implementation was occasionally triggering multi-hit errors in our
level 1 TLB. It ended up being a combination of issues including
subtleties as to how we should invalidate those special 'MPSS' pages
we use to allow the use of 16M pages inside 4K/64K "base page size"
segments (you really have to love our MMU !)

Another interesting one in the "OMG" category is the series from
Michael adding memory barriers to spin_is_locked(). That's also the
result of many days of debugging to figure out why the semaphore code
would occasionally crash in ways that made no sense. It ended up
being some creative lock stacking that was defeated by the fact that
our locks allow a load inside the locked section to be re-ordered with
the load of the lock value itself (I'm still of two mind about whether
to kill that once and for all by putting a heavier barrier back into
our lock implementation...). The fixes come with a long explanation
in the cset comments, feel free to read it if you feel like having a
headache today"

* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (25 commits)
powerpc/thp: Add tracepoints to track hugepage invalidate
powerpc/mm: Use read barrier when creating real_pte
powerpc/thp: Use ACCESS_ONCE when loading pmdp
powerpc/thp: Invalidate with vpn in loop
powerpc/thp: Handle combo pages in invalidate
powerpc/thp: Invalidate old 64K based hash page mapping before insert of 4k pte
powerpc/thp: Don't recompute vsid and ssize in loop on invalidate
powerpc/thp: Add write barrier after updating the valid bit
powerpc: reorder per-cpu NUMA information's initialization
powerpc/perf/hv-24x7: Use kmem_cache_free
powerpc/pseries/hvcserver: Fix endian issue in hvcs_get_partner_info
powerpc: Hard disable interrupts in xmon
powerpc: remove duplicate definition of TEXASR_FS
powerpc/pseries: Avoid deadlock on removing ddw
powerpc/pseries: Failure on removing device node
powerpc/boot: Use correct zlib types for comparison
powerpc/powernv: Interface to register/unregister opal dump region
printk: Add function to return log buffer address and size
powerpc: Add POWER8 features to CPU_FTRS_POSSIBLE/ALWAYS
powerpc/ppc476: Disable BTAC
...

+490 -223
+2 -2
arch/powerpc/boot/gunzip_util.c
··· 112 112 r = zlib_inflate(&state->s, Z_FULL_FLUSH); 113 113 if (r != Z_OK && r != Z_STREAM_END) 114 114 fatal("inflate returned %d msg: %s\n\r", r, state->s.msg); 115 - len = state->s.next_out - (unsigned char *)dst; 115 + len = state->s.next_out - (Byte *)dst; 116 116 } else { 117 117 /* uncompressed image */ 118 - len = min(state->s.avail_in, (unsigned)dstlen); 118 + len = min(state->s.avail_in, (uLong)dstlen); 119 119 memcpy(dst, state->s.next_in, len); 120 120 state->s.next_in += len; 121 121 state->s.avail_in -= len;
+4 -2
arch/powerpc/include/asm/cputable.h
··· 459 459 #define CPU_FTRS_POSSIBLE \ 460 460 (CPU_FTRS_POWER4 | CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | \ 461 461 CPU_FTRS_POWER6 | CPU_FTRS_POWER7 | CPU_FTRS_POWER8E | \ 462 - CPU_FTRS_POWER8 | CPU_FTRS_CELL | CPU_FTRS_PA6T | CPU_FTR_VSX) 462 + CPU_FTRS_POWER8 | CPU_FTRS_POWER8_DD1 | CPU_FTRS_CELL | \ 463 + CPU_FTRS_PA6T | CPU_FTR_VSX) 463 464 #endif 464 465 #else 465 466 enum { ··· 510 509 #define CPU_FTRS_ALWAYS \ 511 510 (CPU_FTRS_POWER4 & CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & \ 512 511 CPU_FTRS_POWER6 & CPU_FTRS_POWER7 & CPU_FTRS_CELL & \ 513 - CPU_FTRS_PA6T & CPU_FTRS_POSSIBLE) 512 + CPU_FTRS_PA6T & CPU_FTRS_POWER8 & CPU_FTRS_POWER8E & \ 513 + CPU_FTRS_POWER8_DD1 & CPU_FTRS_POSSIBLE) 514 514 #endif 515 515 #else 516 516 enum {
+3 -3
arch/powerpc/include/asm/machdep.h
··· 57 57 void (*hpte_removebolted)(unsigned long ea, 58 58 int psize, int ssize); 59 59 void (*flush_hash_range)(unsigned long number, int local); 60 - void (*hugepage_invalidate)(struct mm_struct *mm, 60 + void (*hugepage_invalidate)(unsigned long vsid, 61 + unsigned long addr, 61 62 unsigned char *hpte_slot_array, 62 - unsigned long addr, int psize); 63 - 63 + int psize, int ssize); 64 64 /* special for kexec, to be called in real mode, linear mapping is 65 65 * destroyed as well */ 66 66 void (*hpte_clear_all)(void);
+11
arch/powerpc/include/asm/opal.h
··· 149 149 #define OPAL_DUMP_INFO2 94 150 150 #define OPAL_PCI_EEH_FREEZE_SET 97 151 151 #define OPAL_HANDLE_HMI 98 152 + #define OPAL_REGISTER_DUMP_REGION 101 153 + #define OPAL_UNREGISTER_DUMP_REGION 102 152 154 153 155 #ifndef __ASSEMBLY__ 154 156 ··· 922 920 uint64_t length); 923 921 int64_t opal_sensor_read(uint32_t sensor_hndl, int token, __be32 *sensor_data); 924 922 int64_t opal_handle_hmi(void); 923 + int64_t opal_register_dump_region(uint32_t id, uint64_t start, uint64_t end); 924 + int64_t opal_unregister_dump_region(uint32_t id); 925 925 926 926 /* Internal functions */ 927 927 extern int early_init_dt_scan_opal(unsigned long node, const char *uname, ··· 977 973 struct opal_sg_list *opal_vmalloc_to_sg_list(void *vmalloc_addr, 978 974 unsigned long vmalloc_size); 979 975 void opal_free_sg_list(struct opal_sg_list *sg); 976 + 977 + /* 978 + * Dump region ID range usable by the OS 979 + */ 980 + #define OPAL_DUMP_REGION_HOST_START 0x80 981 + #define OPAL_DUMP_REGION_LOG_BUF 0x80 982 + #define OPAL_DUMP_REGION_HOST_END 0xFF 980 983 981 984 #endif /* __ASSEMBLY__ */ 982 985
+1 -1
arch/powerpc/include/asm/pgtable-ppc64.h
··· 413 413 } 414 414 415 415 extern void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, 416 - pmd_t *pmdp); 416 + pmd_t *pmdp, unsigned long old_pmd); 417 417 #ifdef CONFIG_TRANSPARENT_HUGEPAGE 418 418 extern pmd_t pfn_pmd(unsigned long pfn, pgprot_t pgprot); 419 419 extern pmd_t mk_pmd(struct page *page, pgprot_t pgprot);
+25 -5
arch/powerpc/include/asm/pte-hash64-64k.h
··· 46 46 * in order to deal with 64K made of 4K HW pages. Thus we override the 47 47 * generic accessors and iterators here 48 48 */ 49 - #define __real_pte(e,p) ((real_pte_t) { \ 50 - (e), (pte_val(e) & _PAGE_COMBO) ? \ 51 - (pte_val(*((p) + PTRS_PER_PTE))) : 0 }) 52 - #define __rpte_to_hidx(r,index) ((pte_val((r).pte) & _PAGE_COMBO) ? \ 53 - (((r).hidx >> ((index)<<2)) & 0xf) : ((pte_val((r).pte) >> 12) & 0xf)) 49 + #define __real_pte __real_pte 50 + static inline real_pte_t __real_pte(pte_t pte, pte_t *ptep) 51 + { 52 + real_pte_t rpte; 53 + 54 + rpte.pte = pte; 55 + rpte.hidx = 0; 56 + if (pte_val(pte) & _PAGE_COMBO) { 57 + /* 58 + * Make sure we order the hidx load against the _PAGE_COMBO 59 + * check. The store side ordering is done in __hash_page_4K 60 + */ 61 + smp_rmb(); 62 + rpte.hidx = pte_val(*((ptep) + PTRS_PER_PTE)); 63 + } 64 + return rpte; 65 + } 66 + 67 + static inline unsigned long __rpte_to_hidx(real_pte_t rpte, unsigned long index) 68 + { 69 + if ((pte_val(rpte.pte) & _PAGE_COMBO)) 70 + return (rpte.hidx >> (index<<2)) & 0xf; 71 + return (pte_val(rpte.pte) >> 12) & 0xf; 72 + } 73 + 54 74 #define __rpte_to_pte(r) ((r).pte) 55 75 #define __rpte_sub_valid(rpte, index) \ 56 76 (pte_val(rpte.pte) & (_PAGE_HPTE_SUB0 >> (index)))
+1 -2
arch/powerpc/include/asm/reg.h
··· 213 213 #define SPRN_ACOP 0x1F /* Available Coprocessor Register */ 214 214 #define SPRN_TFIAR 0x81 /* Transaction Failure Inst Addr */ 215 215 #define SPRN_TEXASR 0x82 /* Transaction EXception & Summary */ 216 - #define TEXASR_FS __MASK(63-36) /* Transaction Failure Summary */ 217 216 #define SPRN_TEXASRU 0x83 /* '' '' '' Upper 32 */ 218 - #define TEXASR_FS __MASK(63-36) /* TEXASR Failure Summary */ 217 + #define TEXASR_FS __MASK(63-36) /* TEXASR Failure Summary */ 219 218 #define SPRN_TFHAR 0x80 /* Transaction Failure Handler Addr */ 220 219 #define SPRN_CTRLF 0x088 221 220 #define SPRN_CTRLT 0x098
+1
arch/powerpc/include/asm/spinlock.h
··· 61 61 62 62 static inline int arch_spin_is_locked(arch_spinlock_t *lock) 63 63 { 64 + smp_mb(); 64 65 return !arch_spin_value_unlocked(*lock); 65 66 } 66 67
+55 -55
arch/powerpc/kernel/exceptions-64s.S
··· 592 592 MASKABLE_EXCEPTION_HV_OOL(0xe62, hmi_exception) 593 593 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62) 594 594 595 - .globl hmi_exception_early 596 - hmi_exception_early: 597 - EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0xe60) 598 - mr r10,r1 /* Save r1 */ 599 - ld r1,PACAEMERGSP(r13) /* Use emergency stack */ 600 - subi r1,r1,INT_FRAME_SIZE /* alloc stack frame */ 601 - std r9,_CCR(r1) /* save CR in stackframe */ 602 - mfspr r11,SPRN_HSRR0 /* Save HSRR0 */ 603 - std r11,_NIP(r1) /* save HSRR0 in stackframe */ 604 - mfspr r12,SPRN_HSRR1 /* Save SRR1 */ 605 - std r12,_MSR(r1) /* save SRR1 in stackframe */ 606 - std r10,0(r1) /* make stack chain pointer */ 607 - std r0,GPR0(r1) /* save r0 in stackframe */ 608 - std r10,GPR1(r1) /* save r1 in stackframe */ 609 - EXCEPTION_PROLOG_COMMON_2(PACA_EXGEN) 610 - EXCEPTION_PROLOG_COMMON_3(0xe60) 611 - addi r3,r1,STACK_FRAME_OVERHEAD 612 - bl hmi_exception_realmode 613 - /* Windup the stack. */ 614 - /* Clear MSR_RI before setting SRR0 and SRR1. */ 615 - li r0,MSR_RI 616 - mfmsr r9 /* get MSR value */ 617 - andc r9,r9,r0 618 - mtmsrd r9,1 /* Clear MSR_RI */ 619 - /* Move original HSRR0 and HSRR1 into the respective regs */ 620 - ld r9,_MSR(r1) 621 - mtspr SPRN_HSRR1,r9 622 - ld r3,_NIP(r1) 623 - mtspr SPRN_HSRR0,r3 624 - ld r9,_CTR(r1) 625 - mtctr r9 626 - ld r9,_XER(r1) 627 - mtxer r9 628 - ld r9,_LINK(r1) 629 - mtlr r9 630 - REST_GPR(0, r1) 631 - REST_8GPRS(2, r1) 632 - REST_GPR(10, r1) 633 - ld r11,_CCR(r1) 634 - mtcr r11 635 - REST_GPR(11, r1) 636 - REST_2GPRS(12, r1) 637 - /* restore original r1. */ 638 - ld r1,GPR1(r1) 639 - 640 - /* 641 - * Go to virtual mode and pull the HMI event information from 642 - * firmware. 643 - */ 644 - .globl hmi_exception_after_realmode 645 - hmi_exception_after_realmode: 646 - SET_SCRATCH0(r13) 647 - EXCEPTION_PROLOG_0(PACA_EXGEN) 648 - b hmi_exception_hv 649 - 650 595 MASKABLE_EXCEPTION_HV_OOL(0xe82, h_doorbell) 651 596 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe82) 652 597 ··· 1250 1305 */ 1251 1306 . = 0x8000 1252 1307 #endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */ 1308 + 1309 + .globl hmi_exception_early 1310 + hmi_exception_early: 1311 + EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0xe60) 1312 + mr r10,r1 /* Save r1 */ 1313 + ld r1,PACAEMERGSP(r13) /* Use emergency stack */ 1314 + subi r1,r1,INT_FRAME_SIZE /* alloc stack frame */ 1315 + std r9,_CCR(r1) /* save CR in stackframe */ 1316 + mfspr r11,SPRN_HSRR0 /* Save HSRR0 */ 1317 + std r11,_NIP(r1) /* save HSRR0 in stackframe */ 1318 + mfspr r12,SPRN_HSRR1 /* Save SRR1 */ 1319 + std r12,_MSR(r1) /* save SRR1 in stackframe */ 1320 + std r10,0(r1) /* make stack chain pointer */ 1321 + std r0,GPR0(r1) /* save r0 in stackframe */ 1322 + std r10,GPR1(r1) /* save r1 in stackframe */ 1323 + EXCEPTION_PROLOG_COMMON_2(PACA_EXGEN) 1324 + EXCEPTION_PROLOG_COMMON_3(0xe60) 1325 + addi r3,r1,STACK_FRAME_OVERHEAD 1326 + bl hmi_exception_realmode 1327 + /* Windup the stack. */ 1328 + /* Clear MSR_RI before setting SRR0 and SRR1. */ 1329 + li r0,MSR_RI 1330 + mfmsr r9 /* get MSR value */ 1331 + andc r9,r9,r0 1332 + mtmsrd r9,1 /* Clear MSR_RI */ 1333 + /* Move original HSRR0 and HSRR1 into the respective regs */ 1334 + ld r9,_MSR(r1) 1335 + mtspr SPRN_HSRR1,r9 1336 + ld r3,_NIP(r1) 1337 + mtspr SPRN_HSRR0,r3 1338 + ld r9,_CTR(r1) 1339 + mtctr r9 1340 + ld r9,_XER(r1) 1341 + mtxer r9 1342 + ld r9,_LINK(r1) 1343 + mtlr r9 1344 + REST_GPR(0, r1) 1345 + REST_8GPRS(2, r1) 1346 + REST_GPR(10, r1) 1347 + ld r11,_CCR(r1) 1348 + mtcr r11 1349 + REST_GPR(11, r1) 1350 + REST_2GPRS(12, r1) 1351 + /* restore original r1. */ 1352 + ld r1,GPR1(r1) 1353 + 1354 + /* 1355 + * Go to virtual mode and pull the HMI event information from 1356 + * firmware. 1357 + */ 1358 + .globl hmi_exception_after_realmode 1359 + hmi_exception_after_realmode: 1360 + SET_SCRATCH0(r13) 1361 + EXCEPTION_PROLOG_0(PACA_EXGEN) 1362 + b hmi_exception_hv 1253 1363 1254 1364 #ifdef CONFIG_PPC_POWERNV 1255 1365 _GLOBAL(opal_mc_secondary_handler)
+3 -1
arch/powerpc/kernel/head_44x.S
··· 1210 1210 1211 1211 /* We configure icbi to invalidate 128 bytes at a time since the 1212 1212 * current 32-bit kernel code isn't too happy with icache != dcache 1213 - * block size 1213 + * block size. We also disable the BTAC as this can cause errors 1214 + * in some circumstances (see IBM Erratum 47). 1214 1215 */ 1215 1216 mfspr r3,SPRN_CCR0 1216 1217 oris r3,r3,0x0020 1218 + ori r3,r3,0x0040 1217 1219 mtspr SPRN_CCR0,r3 1218 1220 isync 1219 1221
+21 -17
arch/powerpc/kernel/iommu.c
··· 1120 1120 int iommu_add_device(struct device *dev) 1121 1121 { 1122 1122 struct iommu_table *tbl; 1123 - int ret = 0; 1124 1123 1125 - if (WARN_ON(dev->iommu_group)) { 1126 - pr_warn("iommu_tce: device %s is already in iommu group %d, skipping\n", 1127 - dev_name(dev), 1128 - iommu_group_id(dev->iommu_group)); 1124 + /* 1125 + * The sysfs entries should be populated before 1126 + * binding IOMMU group. If sysfs entries isn't 1127 + * ready, we simply bail. 1128 + */ 1129 + if (!device_is_registered(dev)) 1130 + return -ENOENT; 1131 + 1132 + if (dev->iommu_group) { 1133 + pr_debug("%s: Skipping device %s with iommu group %d\n", 1134 + __func__, dev_name(dev), 1135 + iommu_group_id(dev->iommu_group)); 1129 1136 return -EBUSY; 1130 1137 } 1131 1138 1132 1139 tbl = get_iommu_table_base(dev); 1133 1140 if (!tbl || !tbl->it_group) { 1134 - pr_debug("iommu_tce: skipping device %s with no tbl\n", 1135 - dev_name(dev)); 1141 + pr_debug("%s: Skipping device %s with no tbl\n", 1142 + __func__, dev_name(dev)); 1136 1143 return 0; 1137 1144 } 1138 1145 1139 - pr_debug("iommu_tce: adding %s to iommu group %d\n", 1140 - dev_name(dev), iommu_group_id(tbl->it_group)); 1146 + pr_debug("%s: Adding %s to iommu group %d\n", 1147 + __func__, dev_name(dev), 1148 + iommu_group_id(tbl->it_group)); 1141 1149 1142 1150 if (PAGE_SIZE < IOMMU_PAGE_SIZE(tbl)) { 1143 - pr_err("iommu_tce: unsupported iommu page size."); 1144 - pr_err("%s has not been added\n", dev_name(dev)); 1151 + pr_err("%s: Invalid IOMMU page size %lx (%lx) on %s\n", 1152 + __func__, IOMMU_PAGE_SIZE(tbl), 1153 + PAGE_SIZE, dev_name(dev)); 1145 1154 return -EINVAL; 1146 1155 } 1147 1156 1148 - ret = iommu_group_add_device(tbl->it_group, dev); 1149 - if (ret < 0) 1150 - pr_err("iommu_tce: %s has not been added, ret=%d\n", 1151 - dev_name(dev), ret); 1152 - 1153 - return ret; 1157 + return iommu_group_add_device(tbl->it_group, dev); 1154 1158 } 1155 1159 EXPORT_SYMBOL_GPL(iommu_add_device); 1156 1160
+5 -6
arch/powerpc/kernel/smp.c
··· 376 376 GFP_KERNEL, cpu_to_node(cpu)); 377 377 zalloc_cpumask_var_node(&per_cpu(cpu_core_map, cpu), 378 378 GFP_KERNEL, cpu_to_node(cpu)); 379 + /* 380 + * numa_node_id() works after this. 381 + */ 382 + set_cpu_numa_node(cpu, numa_cpu_lookup_table[cpu]); 383 + set_cpu_numa_mem(cpu, local_memory_node(numa_cpu_lookup_table[cpu])); 379 384 } 380 385 381 386 cpumask_set_cpu(boot_cpuid, cpu_sibling_mask(boot_cpuid)); ··· 727 722 cpumask_set_cpu(base + i, cpu_core_mask(cpu)); 728 723 } 729 724 traverse_core_siblings(cpu, true); 730 - 731 - /* 732 - * numa_node_id() works after this. 733 - */ 734 - set_numa_node(numa_cpu_lookup_table[cpu]); 735 - set_numa_mem(local_memory_node(numa_cpu_lookup_table[cpu])); 736 725 737 726 smp_wmb(); 738 727 notify_cpu_starting(cpu);
+4
arch/powerpc/lib/locks.c
··· 70 70 71 71 void arch_spin_unlock_wait(arch_spinlock_t *lock) 72 72 { 73 + smp_mb(); 74 + 73 75 while (lock->slock) { 74 76 HMT_low(); 75 77 if (SHARED_PROCESSOR) 76 78 __spin_yield(lock); 77 79 } 78 80 HMT_medium(); 81 + 82 + smp_mb(); 79 83 } 80 84 81 85 EXPORT_SYMBOL(arch_spin_unlock_wait);
+11 -29
arch/powerpc/mm/hash_native_64.c
··· 412 412 local_irq_restore(flags); 413 413 } 414 414 415 - static void native_hugepage_invalidate(struct mm_struct *mm, 415 + static void native_hugepage_invalidate(unsigned long vsid, 416 + unsigned long addr, 416 417 unsigned char *hpte_slot_array, 417 - unsigned long addr, int psize) 418 + int psize, int ssize) 418 419 { 419 - int ssize = 0, i; 420 - int lock_tlbie; 420 + int i; 421 421 struct hash_pte *hptep; 422 422 int actual_psize = MMU_PAGE_16M; 423 423 unsigned int max_hpte_count, valid; 424 424 unsigned long flags, s_addr = addr; 425 425 unsigned long hpte_v, want_v, shift; 426 - unsigned long hidx, vpn = 0, vsid, hash, slot; 426 + unsigned long hidx, vpn = 0, hash, slot; 427 427 428 428 shift = mmu_psize_defs[psize].shift; 429 429 max_hpte_count = 1U << (PMD_SHIFT - shift); ··· 437 437 438 438 /* get the vpn */ 439 439 addr = s_addr + (i * (1ul << shift)); 440 - if (!is_kernel_addr(addr)) { 441 - ssize = user_segment_size(addr); 442 - vsid = get_vsid(mm->context.id, addr, ssize); 443 - WARN_ON(vsid == 0); 444 - } else { 445 - vsid = get_kernel_vsid(addr, mmu_kernel_ssize); 446 - ssize = mmu_kernel_ssize; 447 - } 448 - 449 440 vpn = hpt_vpn(addr, vsid, ssize); 450 441 hash = hpt_hash(vpn, shift, ssize); 451 442 if (hidx & _PTEIDX_SECONDARY) ··· 456 465 else 457 466 /* Invalidate the hpte. NOTE: this also unlocks it */ 458 467 hptep->v = 0; 468 + /* 469 + * We need to do tlb invalidate for all the address, tlbie 470 + * instruction compares entry_VA in tlb with the VA specified 471 + * here 472 + */ 473 + tlbie(vpn, psize, actual_psize, ssize, 0); 459 474 } 460 - /* 461 - * Since this is a hugepage, we just need a single tlbie. 462 - * use the last vpn. 463 - */ 464 - lock_tlbie = !mmu_has_feature(MMU_FTR_LOCKLESS_TLBIE); 465 - if (lock_tlbie) 466 - raw_spin_lock(&native_tlbie_lock); 467 - 468 - asm volatile("ptesync":::"memory"); 469 - __tlbie(vpn, psize, actual_psize, ssize); 470 - asm volatile("eieio; tlbsync; ptesync":::"memory"); 471 - 472 - if (lock_tlbie) 473 - raw_spin_unlock(&native_tlbie_lock); 474 - 475 475 local_irq_restore(flags); 476 476 } 477 477
+77 -11
arch/powerpc/mm/hugepage-hash64.c
··· 18 18 #include <linux/mm.h> 19 19 #include <asm/machdep.h> 20 20 21 + static void invalidate_old_hpte(unsigned long vsid, unsigned long addr, 22 + pmd_t *pmdp, unsigned int psize, int ssize) 23 + { 24 + int i, max_hpte_count, valid; 25 + unsigned long s_addr; 26 + unsigned char *hpte_slot_array; 27 + unsigned long hidx, shift, vpn, hash, slot; 28 + 29 + s_addr = addr & HPAGE_PMD_MASK; 30 + hpte_slot_array = get_hpte_slot_array(pmdp); 31 + /* 32 + * IF we try to do a HUGE PTE update after a withdraw is done. 33 + * we will find the below NULL. This happens when we do 34 + * split_huge_page_pmd 35 + */ 36 + if (!hpte_slot_array) 37 + return; 38 + 39 + if (ppc_md.hugepage_invalidate) 40 + return ppc_md.hugepage_invalidate(vsid, s_addr, hpte_slot_array, 41 + psize, ssize); 42 + /* 43 + * No bluk hpte removal support, invalidate each entry 44 + */ 45 + shift = mmu_psize_defs[psize].shift; 46 + max_hpte_count = HPAGE_PMD_SIZE >> shift; 47 + for (i = 0; i < max_hpte_count; i++) { 48 + /* 49 + * 8 bits per each hpte entries 50 + * 000| [ secondary group (one bit) | hidx (3 bits) | valid bit] 51 + */ 52 + valid = hpte_valid(hpte_slot_array, i); 53 + if (!valid) 54 + continue; 55 + hidx = hpte_hash_index(hpte_slot_array, i); 56 + 57 + /* get the vpn */ 58 + addr = s_addr + (i * (1ul << shift)); 59 + vpn = hpt_vpn(addr, vsid, ssize); 60 + hash = hpt_hash(vpn, shift, ssize); 61 + if (hidx & _PTEIDX_SECONDARY) 62 + hash = ~hash; 63 + 64 + slot = (hash & htab_hash_mask) * HPTES_PER_GROUP; 65 + slot += hidx & _PTEIDX_GROUP_IX; 66 + ppc_md.hpte_invalidate(slot, vpn, psize, 67 + MMU_PAGE_16M, ssize, 0); 68 + } 69 + } 70 + 71 + 21 72 int __hash_page_thp(unsigned long ea, unsigned long access, unsigned long vsid, 22 73 pmd_t *pmdp, unsigned long trap, int local, int ssize, 23 74 unsigned int psize) ··· 84 33 * atomically mark the linux large page PMD busy and dirty 85 34 */ 86 35 do { 87 - old_pmd = pmd_val(*pmdp); 36 + pmd_t pmd = ACCESS_ONCE(*pmdp); 37 + 38 + old_pmd = pmd_val(pmd); 88 39 /* If PMD busy, retry the access */ 89 40 if (unlikely(old_pmd & _PAGE_BUSY)) 90 41 return 0; ··· 138 85 vpn = hpt_vpn(ea, vsid, ssize); 139 86 hash = hpt_hash(vpn, shift, ssize); 140 87 hpte_slot_array = get_hpte_slot_array(pmdp); 88 + if (psize == MMU_PAGE_4K) { 89 + /* 90 + * invalidate the old hpte entry if we have that mapped via 64K 91 + * base page size. This is because demote_segment won't flush 92 + * hash page table entries. 93 + */ 94 + if ((old_pmd & _PAGE_HASHPTE) && !(old_pmd & _PAGE_COMBO)) 95 + invalidate_old_hpte(vsid, ea, pmdp, MMU_PAGE_64K, ssize); 96 + } 141 97 142 98 valid = hpte_valid(hpte_slot_array, index); 143 99 if (valid) { ··· 169 107 * safely update this here. 170 108 */ 171 109 valid = 0; 172 - new_pmd &= ~_PAGE_HPTEFLAGS; 173 110 hpte_slot_array[index] = 0; 174 - } else 175 - /* clear the busy bits and set the hash pte bits */ 176 - new_pmd = (new_pmd & ~_PAGE_HPTEFLAGS) | _PAGE_HASHPTE; 111 + } 177 112 } 178 113 179 114 if (!valid) { ··· 178 119 179 120 /* insert new entry */ 180 121 pa = pmd_pfn(__pmd(old_pmd)) << PAGE_SHIFT; 181 - repeat: 182 - hpte_group = ((hash & htab_hash_mask) * HPTES_PER_GROUP) & ~0x7UL; 183 - 184 - /* clear the busy bits and set the hash pte bits */ 185 - new_pmd = (new_pmd & ~_PAGE_HPTEFLAGS) | _PAGE_HASHPTE; 122 + new_pmd |= _PAGE_HASHPTE; 186 123 187 124 /* Add in WIMG bits */ 188 125 rflags |= (new_pmd & (_PAGE_WRITETHRU | _PAGE_NO_CACHE | ··· 187 132 * enable the memory coherence always 188 133 */ 189 134 rflags |= HPTE_R_M; 135 + repeat: 136 + hpte_group = ((hash & htab_hash_mask) * HPTES_PER_GROUP) & ~0x7UL; 190 137 191 138 /* Insert into the hash table, primary slot */ 192 139 slot = ppc_md.hpte_insert(hpte_group, vpn, pa, rflags, 0, ··· 229 172 mark_hpte_slot_valid(hpte_slot_array, index, slot); 230 173 } 231 174 /* 232 - * No need to use ldarx/stdcx here 175 + * Mark the pte with _PAGE_COMBO, if we are trying to hash it with 176 + * base page size 4k. 233 177 */ 178 + if (psize == MMU_PAGE_4K) 179 + new_pmd |= _PAGE_COMBO; 180 + /* 181 + * The hpte valid is stored in the pgtable whose address is in the 182 + * second half of the PMD. Order this against clearing of the busy bit in 183 + * huge pmd. 184 + */ 185 + smp_wmb(); 234 186 *pmdp = __pmd(new_pmd & ~_PAGE_BUSY); 235 187 return 0; 236 188 }
+10 -3
arch/powerpc/mm/numa.c
··· 1049 1049 1050 1050 void __init do_init_bootmem(void) 1051 1051 { 1052 - int nid; 1052 + int nid, cpu; 1053 1053 1054 1054 min_low_pfn = 0; 1055 1055 max_low_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT; ··· 1122 1122 1123 1123 reset_numa_cpu_lookup_table(); 1124 1124 register_cpu_notifier(&ppc64_numa_nb); 1125 - cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE, 1126 - (void *)(unsigned long)boot_cpuid); 1125 + /* 1126 + * We need the numa_cpu_lookup_table to be accurate for all CPUs, 1127 + * even before we online them, so that we can use cpu_to_{node,mem} 1128 + * early in boot, cf. smp_prepare_cpus(). 1129 + */ 1130 + for_each_possible_cpu(cpu) { 1131 + cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE, 1132 + (void *)(unsigned long)cpu); 1133 + } 1127 1134 } 1128 1135 1129 1136 void __init paging_init(void)
+29 -15
arch/powerpc/mm/pgtable_64.c
··· 54 54 55 55 #include "mmu_decl.h" 56 56 57 + #define CREATE_TRACE_POINTS 58 + #include <trace/events/thp.h> 59 + 57 60 /* Some sanity checking */ 58 61 #if TASK_SIZE_USER64 > PGTABLE_RANGE 59 62 #error TASK_SIZE_USER64 exceeds pagetable range ··· 540 537 old = pmd_val(*pmdp); 541 538 *pmdp = __pmd((old & ~clr) | set); 542 539 #endif 540 + trace_hugepage_update(addr, old, clr, set); 543 541 if (old & _PAGE_HASHPTE) 544 - hpte_do_hugepage_flush(mm, addr, pmdp); 542 + hpte_do_hugepage_flush(mm, addr, pmdp, old); 545 543 return old; 546 544 } 547 545 ··· 646 642 * If we didn't had the splitting flag set, go and flush the 647 643 * HPTE entries. 648 644 */ 645 + trace_hugepage_splitting(address, old); 649 646 if (!(old & _PAGE_SPLITTING)) { 650 647 /* We need to flush the hpte */ 651 648 if (old & _PAGE_HASHPTE) 652 - hpte_do_hugepage_flush(vma->vm_mm, address, pmdp); 649 + hpte_do_hugepage_flush(vma->vm_mm, address, pmdp, old); 653 650 } 654 651 /* 655 652 * This ensures that generic code that rely on IRQ disabling ··· 714 709 assert_spin_locked(&mm->page_table_lock); 715 710 WARN_ON(!pmd_trans_huge(pmd)); 716 711 #endif 712 + trace_hugepage_set_pmd(addr, pmd); 717 713 return set_pte_at(mm, addr, pmdp_ptep(pmdp), pmd_pte(pmd)); 718 714 } 719 715 ··· 729 723 * neesd to be flushed. 730 724 */ 731 725 void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, 732 - pmd_t *pmdp) 726 + pmd_t *pmdp, unsigned long old_pmd) 733 727 { 734 728 int ssize, i; 735 729 unsigned long s_addr; ··· 751 745 if (!hpte_slot_array) 752 746 return; 753 747 754 - /* get the base page size */ 748 + /* get the base page size,vsid and segment size */ 749 + #ifdef CONFIG_DEBUG_VM 755 750 psize = get_slice_psize(mm, s_addr); 751 + BUG_ON(psize == MMU_PAGE_16M); 752 + #endif 753 + if (old_pmd & _PAGE_COMBO) 754 + psize = MMU_PAGE_4K; 755 + else 756 + psize = MMU_PAGE_64K; 757 + 758 + if (!is_kernel_addr(s_addr)) { 759 + ssize = user_segment_size(s_addr); 760 + vsid = get_vsid(mm->context.id, s_addr, ssize); 761 + WARN_ON(vsid == 0); 762 + } else { 763 + vsid = get_kernel_vsid(s_addr, mmu_kernel_ssize); 764 + ssize = mmu_kernel_ssize; 765 + } 756 766 757 767 if (ppc_md.hugepage_invalidate) 758 - return ppc_md.hugepage_invalidate(mm, hpte_slot_array, 759 - s_addr, psize); 768 + return ppc_md.hugepage_invalidate(vsid, s_addr, 769 + hpte_slot_array, 770 + psize, ssize); 760 771 /* 761 772 * No bluk hpte removal support, invalidate each entry 762 773 */ ··· 791 768 792 769 /* get the vpn */ 793 770 addr = s_addr + (i * (1ul << shift)); 794 - if (!is_kernel_addr(addr)) { 795 - ssize = user_segment_size(addr); 796 - vsid = get_vsid(mm->context.id, addr, ssize); 797 - WARN_ON(vsid == 0); 798 - } else { 799 - vsid = get_kernel_vsid(addr, mmu_kernel_ssize); 800 - ssize = mmu_kernel_ssize; 801 - } 802 - 803 771 vpn = hpt_vpn(addr, vsid, ssize); 804 772 hash = hpt_hash(vpn, shift, ssize); 805 773 if (hidx & _PTEIDX_SECONDARY)
+5 -1
arch/powerpc/mm/tlb_hash64.c
··· 30 30 #include <asm/tlb.h> 31 31 #include <asm/bug.h> 32 32 33 + #include <trace/events/thp.h> 34 + 33 35 DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch); 34 36 35 37 /* ··· 215 213 if (ptep == NULL) 216 214 continue; 217 215 pte = pte_val(*ptep); 216 + if (hugepage_shift) 217 + trace_hugepage_invalidate(start, pte_val(pte)); 218 218 if (!(pte & _PAGE_HASHPTE)) 219 219 continue; 220 220 if (unlikely(hugepage_shift && pmd_trans_huge(*(pmd_t *)pte))) 221 - hpte_do_hugepage_flush(mm, start, (pmd_t *)pte); 221 + hpte_do_hugepage_flush(mm, start, (pmd_t *)ptep, pte); 222 222 else 223 223 hpte_need_flush(mm, start, ptep, pte, 0); 224 224 }
+66 -45
arch/powerpc/mm/tlb_nohash.c
··· 581 581 /* 582 582 * Early initialization of the MMU TLB code 583 583 */ 584 - static void __early_init_mmu(int boot_cpu) 584 + static void early_init_this_mmu(void) 585 585 { 586 586 unsigned int mas4; 587 - 588 - /* XXX This will have to be decided at runtime, but right 589 - * now our boot and TLB miss code hard wires it. Ideally 590 - * we should find out a suitable page size and patch the 591 - * TLB miss code (either that or use the PACA to store 592 - * the value we want) 593 - */ 594 - mmu_linear_psize = MMU_PAGE_1G; 595 - 596 - /* XXX This should be decided at runtime based on supported 597 - * page sizes in the TLB, but for now let's assume 16M is 598 - * always there and a good fit (which it probably is) 599 - * 600 - * Freescale booke only supports 4K pages in TLB0, so use that. 601 - */ 602 - if (mmu_has_feature(MMU_FTR_TYPE_FSL_E)) 603 - mmu_vmemmap_psize = MMU_PAGE_4K; 604 - else 605 - mmu_vmemmap_psize = MMU_PAGE_16M; 606 - 607 - /* XXX This code only checks for TLB 0 capabilities and doesn't 608 - * check what page size combos are supported by the HW. It 609 - * also doesn't handle the case where a separate array holds 610 - * the IND entries from the array loaded by the PT. 611 - */ 612 - if (boot_cpu) { 613 - /* Look for supported page sizes */ 614 - setup_page_sizes(); 615 - 616 - /* Look for HW tablewalk support */ 617 - setup_mmu_htw(); 618 - } 619 587 620 588 /* Set MAS4 based on page table setting */ 621 589 ··· 618 650 } 619 651 mtspr(SPRN_MAS4, mas4); 620 652 621 - /* Set the global containing the top of the linear mapping 622 - * for use by the TLB miss code 623 - */ 624 - linear_map_top = memblock_end_of_DRAM(); 625 - 626 653 #ifdef CONFIG_PPC_FSL_BOOK3E 627 654 if (mmu_has_feature(MMU_FTR_TYPE_FSL_E)) { 628 655 unsigned int num_cams; ··· 625 662 /* use a quarter of the TLBCAM for bolted linear map */ 626 663 num_cams = (mfspr(SPRN_TLB1CFG) & TLBnCFG_N_ENTRY) / 4; 627 664 linear_map_top = map_mem_in_cams(linear_map_top, num_cams); 665 + } 666 + #endif 628 667 629 - /* limit memory so we dont have linear faults */ 630 - memblock_enforce_memory_limit(linear_map_top); 668 + /* A sync won't hurt us after mucking around with 669 + * the MMU configuration 670 + */ 671 + mb(); 672 + } 631 673 674 + static void __init early_init_mmu_global(void) 675 + { 676 + /* XXX This will have to be decided at runtime, but right 677 + * now our boot and TLB miss code hard wires it. Ideally 678 + * we should find out a suitable page size and patch the 679 + * TLB miss code (either that or use the PACA to store 680 + * the value we want) 681 + */ 682 + mmu_linear_psize = MMU_PAGE_1G; 683 + 684 + /* XXX This should be decided at runtime based on supported 685 + * page sizes in the TLB, but for now let's assume 16M is 686 + * always there and a good fit (which it probably is) 687 + * 688 + * Freescale booke only supports 4K pages in TLB0, so use that. 689 + */ 690 + if (mmu_has_feature(MMU_FTR_TYPE_FSL_E)) 691 + mmu_vmemmap_psize = MMU_PAGE_4K; 692 + else 693 + mmu_vmemmap_psize = MMU_PAGE_16M; 694 + 695 + /* XXX This code only checks for TLB 0 capabilities and doesn't 696 + * check what page size combos are supported by the HW. It 697 + * also doesn't handle the case where a separate array holds 698 + * the IND entries from the array loaded by the PT. 699 + */ 700 + /* Look for supported page sizes */ 701 + setup_page_sizes(); 702 + 703 + /* Look for HW tablewalk support */ 704 + setup_mmu_htw(); 705 + 706 + #ifdef CONFIG_PPC_FSL_BOOK3E 707 + if (mmu_has_feature(MMU_FTR_TYPE_FSL_E)) { 632 708 if (book3e_htw_mode == PPC_HTW_NONE) { 633 709 extlb_level_exc = EX_TLB_SIZE; 634 710 patch_exception(0x1c0, exc_data_tlb_miss_bolted_book3e); ··· 677 675 } 678 676 #endif 679 677 680 - /* A sync won't hurt us after mucking around with 681 - * the MMU configuration 678 + /* Set the global containing the top of the linear mapping 679 + * for use by the TLB miss code 682 680 */ 683 - mb(); 681 + linear_map_top = memblock_end_of_DRAM(); 682 + } 683 + 684 + static void __init early_mmu_set_memory_limit(void) 685 + { 686 + #ifdef CONFIG_PPC_FSL_BOOK3E 687 + if (mmu_has_feature(MMU_FTR_TYPE_FSL_E)) { 688 + /* 689 + * Limit memory so we dont have linear faults. 690 + * Unlike memblock_set_current_limit, which limits 691 + * memory available during early boot, this permanently 692 + * reduces the memory available to Linux. We need to 693 + * do this because highmem is not supported on 64-bit. 694 + */ 695 + memblock_enforce_memory_limit(linear_map_top); 696 + } 697 + #endif 684 698 685 699 memblock_set_current_limit(linear_map_top); 686 700 } 687 701 702 + /* boot cpu only */ 688 703 void __init early_init_mmu(void) 689 704 { 690 - __early_init_mmu(1); 705 + early_init_mmu_global(); 706 + early_init_this_mmu(); 707 + early_mmu_set_memory_limit(); 691 708 } 692 709 693 710 void early_init_mmu_secondary(void) 694 711 { 695 - __early_init_mmu(0); 712 + early_init_this_mmu(); 696 713 } 697 714 698 715 void setup_initial_memory_limit(phys_addr_t first_memblock_base,
+1 -1
arch/powerpc/perf/hv-24x7.c
··· 223 223 pr_err("h_get_24x7_catalog_page(ver=%lld, page=%lld) failed:" 224 224 " rc=%ld\n", 225 225 catalog_version_num, page_offset, hret); 226 - kfree(page); 226 + kmem_cache_free(hv_page_cache, page); 227 227 228 228 pr_devel("catalog_read: offset=%lld(%lld) count=%zu(%zu) catalog_len=%zu(%zu) => %zd\n", 229 229 offset, page_offset, count, page_count, catalog_len,
+2
arch/powerpc/platforms/powernv/opal-wrappers.S
··· 245 245 OPAL_CALL(opal_get_param, OPAL_GET_PARAM); 246 246 OPAL_CALL(opal_set_param, OPAL_SET_PARAM); 247 247 OPAL_CALL(opal_handle_hmi, OPAL_HANDLE_HMI); 248 + OPAL_CALL(opal_register_dump_region, OPAL_REGISTER_DUMP_REGION); 249 + OPAL_CALL(opal_unregister_dump_region, OPAL_UNREGISTER_DUMP_REGION);
+23
arch/powerpc/platforms/powernv/opal.c
··· 605 605 return 0; 606 606 } 607 607 608 + static void __init opal_dump_region_init(void) 609 + { 610 + void *addr; 611 + uint64_t size; 612 + int rc; 613 + 614 + /* Register kernel log buffer */ 615 + addr = log_buf_addr_get(); 616 + size = log_buf_len_get(); 617 + rc = opal_register_dump_region(OPAL_DUMP_REGION_LOG_BUF, 618 + __pa(addr), size); 619 + /* Don't warn if this is just an older OPAL that doesn't 620 + * know about that call 621 + */ 622 + if (rc && rc != OPAL_UNSUPPORTED) 623 + pr_warn("DUMP: Failed to register kernel log buffer. " 624 + "rc = %d\n", rc); 625 + } 608 626 static int __init opal_init(void) 609 627 { 610 628 struct device_node *np, *consoles; ··· 672 654 /* Create "opal" kobject under /sys/firmware */ 673 655 rc = opal_sysfs_init(); 674 656 if (rc == 0) { 657 + /* Setup dump region interface */ 658 + opal_dump_region_init(); 675 659 /* Setup error log interface */ 676 660 rc = opal_elog_init(); 677 661 /* Setup code update interface */ ··· 714 694 else 715 695 mdelay(10); 716 696 } 697 + 698 + /* Unregister memory dump region */ 699 + opal_unregister_dump_region(OPAL_DUMP_REGION_LOG_BUF); 717 700 } 718 701 719 702 /* Export this so that test modules can use it */
+1 -1
arch/powerpc/platforms/powernv/pci-ioda.c
··· 857 857 858 858 pe = &phb->ioda.pe_array[pdn->pe_number]; 859 859 WARN_ON(get_dma_ops(&pdev->dev) != &dma_iommu_ops); 860 - set_iommu_table_base(&pdev->dev, &pe->tce32_table); 860 + set_iommu_table_base_and_group(&pdev->dev, &pe->tce32_table); 861 861 } 862 862 863 863 static int pnv_pci_ioda_dma_set_mask(struct pnv_phb *phb,
+1 -1
arch/powerpc/platforms/pseries/hotplug-memory.c
··· 146 146 } 147 147 static inline int pseries_remove_mem_node(struct device_node *np) 148 148 { 149 - return -EOPNOTSUPP; 149 + return 0; 150 150 } 151 151 #endif /* CONFIG_MEMORY_HOTREMOVE */ 152 152
+2 -2
arch/powerpc/platforms/pseries/hvcserver.c
··· 163 163 return retval; 164 164 } 165 165 166 - last_p_partition_ID = pi_buff[0]; 167 - last_p_unit_address = pi_buff[1]; 166 + last_p_partition_ID = be64_to_cpu(pi_buff[0]); 167 + last_p_unit_address = be64_to_cpu(pi_buff[1]); 168 168 169 169 /* This indicates that there are no further partners */ 170 170 if (last_p_partition_ID == ~0UL
+14 -6
arch/powerpc/platforms/pseries/iommu.c
··· 721 721 722 722 early_param("disable_ddw", disable_ddw_setup); 723 723 724 - static void remove_ddw(struct device_node *np) 724 + static void remove_ddw(struct device_node *np, bool remove_prop) 725 725 { 726 726 struct dynamic_dma_window_prop *dwp; 727 727 struct property *win64; 728 728 const u32 *ddw_avail; 729 729 u64 liobn; 730 - int len, ret; 730 + int len, ret = 0; 731 731 732 732 ddw_avail = of_get_property(np, "ibm,ddw-applicable", &len); 733 733 win64 = of_find_property(np, DIRECT64_PROPNAME, NULL); ··· 761 761 np->full_name, ret, ddw_avail[2], liobn); 762 762 763 763 delprop: 764 - ret = of_remove_property(np, win64); 764 + if (remove_prop) 765 + ret = of_remove_property(np, win64); 765 766 if (ret) 766 767 pr_warning("%s: failed to remove direct window property: %d\n", 767 768 np->full_name, ret); ··· 806 805 window = kzalloc(sizeof(*window), GFP_KERNEL); 807 806 if (!window || len < sizeof(struct dynamic_dma_window_prop)) { 808 807 kfree(window); 809 - remove_ddw(pdn); 808 + remove_ddw(pdn, true); 810 809 continue; 811 810 } 812 811 ··· 1046 1045 kfree(window); 1047 1046 1048 1047 out_clear_window: 1049 - remove_ddw(pdn); 1048 + remove_ddw(pdn, true); 1050 1049 1051 1050 out_free_prop: 1052 1051 kfree(win64->name); ··· 1256 1255 1257 1256 switch (action) { 1258 1257 case OF_RECONFIG_DETACH_NODE: 1259 - remove_ddw(np); 1258 + /* 1259 + * Removing the property will invoke the reconfig 1260 + * notifier again, which causes dead-lock on the 1261 + * read-write semaphore of the notifier chain. So 1262 + * we have to remove the property when releasing 1263 + * the device node. 1264 + */ 1265 + remove_ddw(np, false); 1260 1266 if (pci && pci->iommu_table) 1261 1267 iommu_free_table(pci->iommu_table, np->full_name); 1262 1268
+6 -14
arch/powerpc/platforms/pseries/lpar.c
··· 431 431 spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags); 432 432 } 433 433 434 - static void pSeries_lpar_hugepage_invalidate(struct mm_struct *mm, 435 - unsigned char *hpte_slot_array, 436 - unsigned long addr, int psize) 434 + static void pSeries_lpar_hugepage_invalidate(unsigned long vsid, 435 + unsigned long addr, 436 + unsigned char *hpte_slot_array, 437 + int psize, int ssize) 437 438 { 438 - int ssize = 0, i, index = 0; 439 + int i, index = 0; 439 440 unsigned long s_addr = addr; 440 441 unsigned int max_hpte_count, valid; 441 442 unsigned long vpn_array[PPC64_HUGE_HPTE_BATCH]; 442 443 unsigned long slot_array[PPC64_HUGE_HPTE_BATCH]; 443 - unsigned long shift, hidx, vpn = 0, vsid, hash, slot; 444 + unsigned long shift, hidx, vpn = 0, hash, slot; 444 445 445 446 shift = mmu_psize_defs[psize].shift; 446 447 max_hpte_count = 1U << (PMD_SHIFT - shift); ··· 454 453 455 454 /* get the vpn */ 456 455 addr = s_addr + (i * (1ul << shift)); 457 - if (!is_kernel_addr(addr)) { 458 - ssize = user_segment_size(addr); 459 - vsid = get_vsid(mm->context.id, addr, ssize); 460 - WARN_ON(vsid == 0); 461 - } else { 462 - vsid = get_kernel_vsid(addr, mmu_kernel_ssize); 463 - ssize = mmu_kernel_ssize; 464 - } 465 - 466 456 vpn = hpt_vpn(addr, vsid, ssize); 467 457 hash = hpt_hash(vpn, shift, ssize); 468 458 if (hidx & _PTEIDX_SECONDARY)
+3
arch/powerpc/xmon/xmon.c
··· 24 24 #include <linux/interrupt.h> 25 25 #include <linux/irq.h> 26 26 #include <linux/bug.h> 27 + #include <linux/nmi.h> 27 28 28 29 #include <asm/ptrace.h> 29 30 #include <asm/string.h> ··· 375 374 #endif 376 375 377 376 local_irq_save(flags); 377 + hard_irq_disable(); 378 378 379 379 bp = in_breakpoint_table(regs->nip, &offset); 380 380 if (bp != NULL) { ··· 560 558 #endif 561 559 insert_cpu_bpts(); 562 560 561 + touch_nmi_watchdog(); 563 562 local_irq_restore(flags); 564 563 565 564 return cmd != 'X' && cmd != EOF;
+3
include/linux/printk.h
··· 10 10 extern const char linux_banner[]; 11 11 extern const char linux_proc_banner[]; 12 12 13 + extern char *log_buf_addr_get(void); 14 + extern u32 log_buf_len_get(void); 15 + 13 16 static inline int printk_get_level(const char *buffer) 14 17 { 15 18 if (buffer[0] == KERN_SOH_ASCII && buffer[1]) {
+88
include/trace/events/thp.h
··· 1 + #undef TRACE_SYSTEM 2 + #define TRACE_SYSTEM thp 3 + 4 + #if !defined(_TRACE_THP_H) || defined(TRACE_HEADER_MULTI_READ) 5 + #define _TRACE_THP_H 6 + 7 + #include <linux/types.h> 8 + #include <linux/tracepoint.h> 9 + 10 + TRACE_EVENT(hugepage_invalidate, 11 + 12 + TP_PROTO(unsigned long addr, unsigned long pte), 13 + TP_ARGS(addr, pte), 14 + TP_STRUCT__entry( 15 + __field(unsigned long, addr) 16 + __field(unsigned long, pte) 17 + ), 18 + 19 + TP_fast_assign( 20 + __entry->addr = addr; 21 + __entry->pte = pte; 22 + ), 23 + 24 + TP_printk("hugepage invalidate at addr 0x%lx and pte = 0x%lx", 25 + __entry->addr, __entry->pte) 26 + ); 27 + 28 + TRACE_EVENT(hugepage_set_pmd, 29 + 30 + TP_PROTO(unsigned long addr, unsigned long pmd), 31 + TP_ARGS(addr, pmd), 32 + TP_STRUCT__entry( 33 + __field(unsigned long, addr) 34 + __field(unsigned long, pmd) 35 + ), 36 + 37 + TP_fast_assign( 38 + __entry->addr = addr; 39 + __entry->pmd = pmd; 40 + ), 41 + 42 + TP_printk("Set pmd with 0x%lx with 0x%lx", __entry->addr, __entry->pmd) 43 + ); 44 + 45 + 46 + TRACE_EVENT(hugepage_update, 47 + 48 + TP_PROTO(unsigned long addr, unsigned long pte, unsigned long clr, unsigned long set), 49 + TP_ARGS(addr, pte, clr, set), 50 + TP_STRUCT__entry( 51 + __field(unsigned long, addr) 52 + __field(unsigned long, pte) 53 + __field(unsigned long, clr) 54 + __field(unsigned long, set) 55 + ), 56 + 57 + TP_fast_assign( 58 + __entry->addr = addr; 59 + __entry->pte = pte; 60 + __entry->clr = clr; 61 + __entry->set = set; 62 + 63 + ), 64 + 65 + TP_printk("hugepage update at addr 0x%lx and pte = 0x%lx clr = 0x%lx, set = 0x%lx", __entry->addr, __entry->pte, __entry->clr, __entry->set) 66 + ); 67 + TRACE_EVENT(hugepage_splitting, 68 + 69 + TP_PROTO(unsigned long addr, unsigned long pte), 70 + TP_ARGS(addr, pte), 71 + TP_STRUCT__entry( 72 + __field(unsigned long, addr) 73 + __field(unsigned long, pte) 74 + ), 75 + 76 + TP_fast_assign( 77 + __entry->addr = addr; 78 + __entry->pte = pte; 79 + ), 80 + 81 + TP_printk("hugepage splitting at addr 0x%lx and pte = 0x%lx", 82 + __entry->addr, __entry->pte) 83 + ); 84 + 85 + #endif /* _TRACE_THP_H */ 86 + 87 + /* This part must be outside protection */ 88 + #include <trace/define_trace.h>
+12
kernel/printk/printk.c
··· 272 272 static char *log_buf = __log_buf; 273 273 static u32 log_buf_len = __LOG_BUF_LEN; 274 274 275 + /* Return log buffer address */ 276 + char *log_buf_addr_get(void) 277 + { 278 + return log_buf; 279 + } 280 + 281 + /* Return log buffer size */ 282 + u32 log_buf_len_get(void) 283 + { 284 + return log_buf_len; 285 + } 286 + 275 287 /* human readable text of the record */ 276 288 static char *log_text(const struct printk_log *msg) 277 289 {