aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-02-20 12:22:11 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-02-20 12:22:11 -0500
commite6a1c1e9ddcc873c33833d5c1fc69f22b1838962 (patch)
tree9ae8bf8ed460fa4d3b95219b8bc1f56080e6cc98
parentda6b7366dbfc93f59873e252b8d53f17fb47a802 (diff)
parent6ecad912a0073c768db1491c27ca55ad2d0ee68f (diff)
Merge tag 'powerpc-4.5-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc fixes from Michael Ellerman: - Fix build error on 32-bit with checkpoint restart from Aneesh Kumar - Fix dedotify for binutils >= 2.26 from Andreas Schwab - Don't trace hcalls on offline CPUs from Denis Kirjanov - eeh: Fix stale cached primary bus from Gavin Shan - eeh: Fix stale PE primary bus from Gavin Shan - mm: Fix Multi hit ERAT cause by recent THP update from Aneesh Kumar K.V - ioda: Set "read" permission when "write" is set from Alexey Kardashevskiy * tag 'powerpc-4.5-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/ioda: Set "read" permission when "write" is set powerpc/mm: Fix Multi hit ERAT cause by recent THP update powerpc/powernv: Fix stale PE primary bus powerpc/eeh: Fix stale cached primary bus powerpc/pseries: Don't trace hcalls on offline CPUs powerpc: Fix dedotify for binutils >= 2.26 powerpc/book3s_32: Fix build error with checkpoint restart
-rw-r--r--arch/powerpc/Kconfig4
-rw-r--r--arch/powerpc/include/asm/book3s/64/pgtable.h4
-rw-r--r--arch/powerpc/include/asm/eeh.h1
-rw-r--r--arch/powerpc/include/asm/trace.h8
-rw-r--r--arch/powerpc/kernel/eeh_driver.c3
-rw-r--r--arch/powerpc/kernel/eeh_pe.c2
-rw-r--r--arch/powerpc/kernel/module_64.c2
-rw-r--r--arch/powerpc/mm/pgtable_64.c32
-rw-r--r--arch/powerpc/platforms/powernv/eeh-powernv.c5
-rw-r--r--arch/powerpc/platforms/powernv/pci-ioda.c1
-rw-r--r--arch/powerpc/platforms/powernv/pci.c26
-rw-r--r--arch/powerpc/platforms/powernv/pci.h1
-rw-r--r--include/asm-generic/pgtable.h8
-rw-r--r--mm/huge_memory.c1
14 files changed, 91 insertions, 7 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index e4824fd04bb7..9faa18c4f3f7 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -557,7 +557,7 @@ choice
557 557
558config PPC_4K_PAGES 558config PPC_4K_PAGES
559 bool "4k page size" 559 bool "4k page size"
560 select HAVE_ARCH_SOFT_DIRTY if CHECKPOINT_RESTORE && PPC_BOOK3S 560 select HAVE_ARCH_SOFT_DIRTY if PPC_BOOK3S_64
561 561
562config PPC_16K_PAGES 562config PPC_16K_PAGES
563 bool "16k page size" 563 bool "16k page size"
@@ -566,7 +566,7 @@ config PPC_16K_PAGES
566config PPC_64K_PAGES 566config PPC_64K_PAGES
567 bool "64k page size" 567 bool "64k page size"
568 depends on !PPC_FSL_BOOK3E && (44x || PPC_STD_MMU_64 || PPC_BOOK3E_64) 568 depends on !PPC_FSL_BOOK3E && (44x || PPC_STD_MMU_64 || PPC_BOOK3E_64)
569 select HAVE_ARCH_SOFT_DIRTY if CHECKPOINT_RESTORE && PPC_BOOK3S 569 select HAVE_ARCH_SOFT_DIRTY if PPC_BOOK3S_64
570 570
571config PPC_256K_PAGES 571config PPC_256K_PAGES
572 bool "256k page size" 572 bool "256k page size"
diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h
index 8d1c41d28318..ac07a30a7934 100644
--- a/arch/powerpc/include/asm/book3s/64/pgtable.h
+++ b/arch/powerpc/include/asm/book3s/64/pgtable.h
@@ -281,6 +281,10 @@ extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);
281extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, 281extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
282 pmd_t *pmdp); 282 pmd_t *pmdp);
283 283
284#define __HAVE_ARCH_PMDP_HUGE_SPLIT_PREPARE
285extern void pmdp_huge_split_prepare(struct vm_area_struct *vma,
286 unsigned long address, pmd_t *pmdp);
287
284#define pmd_move_must_withdraw pmd_move_must_withdraw 288#define pmd_move_must_withdraw pmd_move_must_withdraw
285struct spinlock; 289struct spinlock;
286static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl, 290static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h
index c5eb86f3d452..867c39b45df6 100644
--- a/arch/powerpc/include/asm/eeh.h
+++ b/arch/powerpc/include/asm/eeh.h
@@ -81,6 +81,7 @@ struct pci_dn;
81#define EEH_PE_KEEP (1 << 8) /* Keep PE on hotplug */ 81#define EEH_PE_KEEP (1 << 8) /* Keep PE on hotplug */
82#define EEH_PE_CFG_RESTRICTED (1 << 9) /* Block config on error */ 82#define EEH_PE_CFG_RESTRICTED (1 << 9) /* Block config on error */
83#define EEH_PE_REMOVED (1 << 10) /* Removed permanently */ 83#define EEH_PE_REMOVED (1 << 10) /* Removed permanently */
84#define EEH_PE_PRI_BUS (1 << 11) /* Cached primary bus */
84 85
85struct eeh_pe { 86struct eeh_pe {
86 int type; /* PE type: PHB/Bus/Device */ 87 int type; /* PE type: PHB/Bus/Device */
diff --git a/arch/powerpc/include/asm/trace.h b/arch/powerpc/include/asm/trace.h
index 8e86b48d0369..32e36b16773f 100644
--- a/arch/powerpc/include/asm/trace.h
+++ b/arch/powerpc/include/asm/trace.h
@@ -57,12 +57,14 @@ DEFINE_EVENT(ppc64_interrupt_class, timer_interrupt_exit,
57extern void hcall_tracepoint_regfunc(void); 57extern void hcall_tracepoint_regfunc(void);
58extern void hcall_tracepoint_unregfunc(void); 58extern void hcall_tracepoint_unregfunc(void);
59 59
60TRACE_EVENT_FN(hcall_entry, 60TRACE_EVENT_FN_COND(hcall_entry,
61 61
62 TP_PROTO(unsigned long opcode, unsigned long *args), 62 TP_PROTO(unsigned long opcode, unsigned long *args),
63 63
64 TP_ARGS(opcode, args), 64 TP_ARGS(opcode, args),
65 65
66 TP_CONDITION(cpu_online(raw_smp_processor_id())),
67
66 TP_STRUCT__entry( 68 TP_STRUCT__entry(
67 __field(unsigned long, opcode) 69 __field(unsigned long, opcode)
68 ), 70 ),
@@ -76,13 +78,15 @@ TRACE_EVENT_FN(hcall_entry,
76 hcall_tracepoint_regfunc, hcall_tracepoint_unregfunc 78 hcall_tracepoint_regfunc, hcall_tracepoint_unregfunc
77); 79);
78 80
79TRACE_EVENT_FN(hcall_exit, 81TRACE_EVENT_FN_COND(hcall_exit,
80 82
81 TP_PROTO(unsigned long opcode, unsigned long retval, 83 TP_PROTO(unsigned long opcode, unsigned long retval,
82 unsigned long *retbuf), 84 unsigned long *retbuf),
83 85
84 TP_ARGS(opcode, retval, retbuf), 86 TP_ARGS(opcode, retval, retbuf),
85 87
88 TP_CONDITION(cpu_online(raw_smp_processor_id())),
89
86 TP_STRUCT__entry( 90 TP_STRUCT__entry(
87 __field(unsigned long, opcode) 91 __field(unsigned long, opcode)
88 __field(unsigned long, retval) 92 __field(unsigned long, retval)
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index 938742135ee0..301be3126ae3 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -564,6 +564,7 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus)
564 */ 564 */
565 eeh_pe_state_mark(pe, EEH_PE_KEEP); 565 eeh_pe_state_mark(pe, EEH_PE_KEEP);
566 if (bus) { 566 if (bus) {
567 eeh_pe_state_clear(pe, EEH_PE_PRI_BUS);
567 pci_lock_rescan_remove(); 568 pci_lock_rescan_remove();
568 pcibios_remove_pci_devices(bus); 569 pcibios_remove_pci_devices(bus);
569 pci_unlock_rescan_remove(); 570 pci_unlock_rescan_remove();
@@ -803,6 +804,7 @@ perm_error:
803 * the their PCI config any more. 804 * the their PCI config any more.
804 */ 805 */
805 if (frozen_bus) { 806 if (frozen_bus) {
807 eeh_pe_state_clear(pe, EEH_PE_PRI_BUS);
806 eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED); 808 eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED);
807 809
808 pci_lock_rescan_remove(); 810 pci_lock_rescan_remove();
@@ -886,6 +888,7 @@ static void eeh_handle_special_event(void)
886 continue; 888 continue;
887 889
888 /* Notify all devices to be down */ 890 /* Notify all devices to be down */
891 eeh_pe_state_clear(pe, EEH_PE_PRI_BUS);
889 bus = eeh_pe_bus_get(phb_pe); 892 bus = eeh_pe_bus_get(phb_pe);
890 eeh_pe_dev_traverse(pe, 893 eeh_pe_dev_traverse(pe,
891 eeh_report_failure, NULL); 894 eeh_report_failure, NULL);
diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c
index ca9e5371930e..98f81800e00c 100644
--- a/arch/powerpc/kernel/eeh_pe.c
+++ b/arch/powerpc/kernel/eeh_pe.c
@@ -928,7 +928,7 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
928 bus = pe->phb->bus; 928 bus = pe->phb->bus;
929 } else if (pe->type & EEH_PE_BUS || 929 } else if (pe->type & EEH_PE_BUS ||
930 pe->type & EEH_PE_DEVICE) { 930 pe->type & EEH_PE_DEVICE) {
931 if (pe->bus) { 931 if (pe->state & EEH_PE_PRI_BUS) {
932 bus = pe->bus; 932 bus = pe->bus;
933 goto out; 933 goto out;
934 } 934 }
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
index ac64ffdb52c8..08b7a40de5f8 100644
--- a/arch/powerpc/kernel/module_64.c
+++ b/arch/powerpc/kernel/module_64.c
@@ -340,7 +340,7 @@ static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab)
340 if (name[0] == '.') { 340 if (name[0] == '.') {
341 if (strcmp(name+1, "TOC.") == 0) 341 if (strcmp(name+1, "TOC.") == 0)
342 syms[i].st_shndx = SHN_ABS; 342 syms[i].st_shndx = SHN_ABS;
343 memmove(name, name+1, strlen(name)); 343 syms[i].st_name++;
344 } 344 }
345 } 345 }
346 } 346 }
diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c
index 3124a20d0fab..cdf2123d46db 100644
--- a/arch/powerpc/mm/pgtable_64.c
+++ b/arch/powerpc/mm/pgtable_64.c
@@ -646,6 +646,28 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp)
646 return pgtable; 646 return pgtable;
647} 647}
648 648
649void pmdp_huge_split_prepare(struct vm_area_struct *vma,
650 unsigned long address, pmd_t *pmdp)
651{
652 VM_BUG_ON(address & ~HPAGE_PMD_MASK);
653 VM_BUG_ON(REGION_ID(address) != USER_REGION_ID);
654
655 /*
656 * We can't mark the pmd none here, because that will cause a race
657 * against exit_mmap. We need to continue mark pmd TRANS HUGE, while
658 * we spilt, but at the same time we wan't rest of the ppc64 code
659 * not to insert hash pte on this, because we will be modifying
660 * the deposited pgtable in the caller of this function. Hence
661 * clear the _PAGE_USER so that we move the fault handling to
662 * higher level function and that will serialize against ptl.
663 * We need to flush existing hash pte entries here even though,
664 * the translation is still valid, because we will withdraw
665 * pgtable_t after this.
666 */
667 pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_USER, 0);
668}
669
670
649/* 671/*
650 * set a new huge pmd. We should not be called for updating 672 * set a new huge pmd. We should not be called for updating
651 * an existing pmd entry. That should go via pmd_hugepage_update. 673 * an existing pmd entry. That should go via pmd_hugepage_update.
@@ -663,10 +685,20 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr,
663 return set_pte_at(mm, addr, pmdp_ptep(pmdp), pmd_pte(pmd)); 685 return set_pte_at(mm, addr, pmdp_ptep(pmdp), pmd_pte(pmd));
664} 686}
665 687
688/*
689 * We use this to invalidate a pmdp entry before switching from a
690 * hugepte to regular pmd entry.
691 */
666void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, 692void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
667 pmd_t *pmdp) 693 pmd_t *pmdp)
668{ 694{
669 pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 0); 695 pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 0);
696
697 /*
698 * This ensures that generic code that rely on IRQ disabling
699 * to prevent a parallel THP split work as expected.
700 */
701 kick_all_cpus_sync();
670} 702}
671 703
672/* 704/*
diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c
index 5f152b95ca0c..87f47e55aab6 100644
--- a/arch/powerpc/platforms/powernv/eeh-powernv.c
+++ b/arch/powerpc/platforms/powernv/eeh-powernv.c
@@ -444,9 +444,12 @@ static void *pnv_eeh_probe(struct pci_dn *pdn, void *data)
444 * PCI devices of the PE are expected to be removed prior 444 * PCI devices of the PE are expected to be removed prior
445 * to PE reset. 445 * to PE reset.
446 */ 446 */
447 if (!edev->pe->bus) 447 if (!(edev->pe->state & EEH_PE_PRI_BUS)) {
448 edev->pe->bus = pci_find_bus(hose->global_number, 448 edev->pe->bus = pci_find_bus(hose->global_number,
449 pdn->busno); 449 pdn->busno);
450 if (edev->pe->bus)
451 edev->pe->state |= EEH_PE_PRI_BUS;
452 }
450 453
451 /* 454 /*
452 * Enable EEH explicitly so that we will do EEH check 455 * Enable EEH explicitly so that we will do EEH check
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index 573ae1994097..f90dc04395bf 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -3180,6 +3180,7 @@ static void pnv_pci_ioda_shutdown(struct pci_controller *hose)
3180 3180
3181static const struct pci_controller_ops pnv_pci_ioda_controller_ops = { 3181static const struct pci_controller_ops pnv_pci_ioda_controller_ops = {
3182 .dma_dev_setup = pnv_pci_dma_dev_setup, 3182 .dma_dev_setup = pnv_pci_dma_dev_setup,
3183 .dma_bus_setup = pnv_pci_dma_bus_setup,
3183#ifdef CONFIG_PCI_MSI 3184#ifdef CONFIG_PCI_MSI
3184 .setup_msi_irqs = pnv_setup_msi_irqs, 3185 .setup_msi_irqs = pnv_setup_msi_irqs,
3185 .teardown_msi_irqs = pnv_teardown_msi_irqs, 3186 .teardown_msi_irqs = pnv_teardown_msi_irqs,
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c
index 2f55c86df703..b1ef84a6c9d1 100644
--- a/arch/powerpc/platforms/powernv/pci.c
+++ b/arch/powerpc/platforms/powernv/pci.c
@@ -599,6 +599,9 @@ int pnv_tce_build(struct iommu_table *tbl, long index, long npages,
599 u64 rpn = __pa(uaddr) >> tbl->it_page_shift; 599 u64 rpn = __pa(uaddr) >> tbl->it_page_shift;
600 long i; 600 long i;
601 601
602 if (proto_tce & TCE_PCI_WRITE)
603 proto_tce |= TCE_PCI_READ;
604
602 for (i = 0; i < npages; i++) { 605 for (i = 0; i < npages; i++) {
603 unsigned long newtce = proto_tce | 606 unsigned long newtce = proto_tce |
604 ((rpn + i) << tbl->it_page_shift); 607 ((rpn + i) << tbl->it_page_shift);
@@ -620,6 +623,9 @@ int pnv_tce_xchg(struct iommu_table *tbl, long index,
620 623
621 BUG_ON(*hpa & ~IOMMU_PAGE_MASK(tbl)); 624 BUG_ON(*hpa & ~IOMMU_PAGE_MASK(tbl));
622 625
626 if (newtce & TCE_PCI_WRITE)
627 newtce |= TCE_PCI_READ;
628
623 oldtce = xchg(pnv_tce(tbl, idx), cpu_to_be64(newtce)); 629 oldtce = xchg(pnv_tce(tbl, idx), cpu_to_be64(newtce));
624 *hpa = be64_to_cpu(oldtce) & ~(TCE_PCI_READ | TCE_PCI_WRITE); 630 *hpa = be64_to_cpu(oldtce) & ~(TCE_PCI_READ | TCE_PCI_WRITE);
625 *direction = iommu_tce_direction(oldtce); 631 *direction = iommu_tce_direction(oldtce);
@@ -760,6 +766,26 @@ void pnv_pci_dma_dev_setup(struct pci_dev *pdev)
760 phb->dma_dev_setup(phb, pdev); 766 phb->dma_dev_setup(phb, pdev);
761} 767}
762 768
769void pnv_pci_dma_bus_setup(struct pci_bus *bus)
770{
771 struct pci_controller *hose = bus->sysdata;
772 struct pnv_phb *phb = hose->private_data;
773 struct pnv_ioda_pe *pe;
774
775 list_for_each_entry(pe, &phb->ioda.pe_list, list) {
776 if (!(pe->flags & (PNV_IODA_PE_BUS | PNV_IODA_PE_BUS_ALL)))
777 continue;
778
779 if (!pe->pbus)
780 continue;
781
782 if (bus->number == ((pe->rid >> 8) & 0xFF)) {
783 pe->pbus = bus;
784 break;
785 }
786 }
787}
788
763void pnv_pci_shutdown(void) 789void pnv_pci_shutdown(void)
764{ 790{
765 struct pci_controller *hose; 791 struct pci_controller *hose;
diff --git a/arch/powerpc/platforms/powernv/pci.h b/arch/powerpc/platforms/powernv/pci.h
index 7f56313e8d72..00691a9b99af 100644
--- a/arch/powerpc/platforms/powernv/pci.h
+++ b/arch/powerpc/platforms/powernv/pci.h
@@ -242,6 +242,7 @@ extern void pnv_pci_reset_secondary_bus(struct pci_dev *dev);
242extern int pnv_eeh_phb_reset(struct pci_controller *hose, int option); 242extern int pnv_eeh_phb_reset(struct pci_controller *hose, int option);
243 243
244extern void pnv_pci_dma_dev_setup(struct pci_dev *pdev); 244extern void pnv_pci_dma_dev_setup(struct pci_dev *pdev);
245extern void pnv_pci_dma_bus_setup(struct pci_bus *bus);
245extern int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type); 246extern int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type);
246extern void pnv_teardown_msi_irqs(struct pci_dev *pdev); 247extern void pnv_teardown_msi_irqs(struct pci_dev *pdev);
247 248
diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h
index 0b3c0d39ef75..c370b261c720 100644
--- a/include/asm-generic/pgtable.h
+++ b/include/asm-generic/pgtable.h
@@ -239,6 +239,14 @@ extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
239 pmd_t *pmdp); 239 pmd_t *pmdp);
240#endif 240#endif
241 241
242#ifndef __HAVE_ARCH_PMDP_HUGE_SPLIT_PREPARE
243static inline void pmdp_huge_split_prepare(struct vm_area_struct *vma,
244 unsigned long address, pmd_t *pmdp)
245{
246
247}
248#endif
249
242#ifndef __HAVE_ARCH_PTE_SAME 250#ifndef __HAVE_ARCH_PTE_SAME
243static inline int pte_same(pte_t pte_a, pte_t pte_b) 251static inline int pte_same(pte_t pte_a, pte_t pte_b)
244{ 252{
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 722546dcfb7e..1c317b85ea7d 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2861,6 +2861,7 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd,
2861 young = pmd_young(*pmd); 2861 young = pmd_young(*pmd);
2862 dirty = pmd_dirty(*pmd); 2862 dirty = pmd_dirty(*pmd);
2863 2863
2864 pmdp_huge_split_prepare(vma, haddr, pmd);
2864 pgtable = pgtable_trans_huge_withdraw(mm, pmd); 2865 pgtable = pgtable_trans_huge_withdraw(mm, pmd);
2865 pmd_populate(mm, &_pmd, pgtable); 2866 pmd_populate(mm, &_pmd, pgtable);
2866 2867