diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-02-20 12:22:11 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-02-20 12:22:11 -0500 |
commit | e6a1c1e9ddcc873c33833d5c1fc69f22b1838962 (patch) | |
tree | 9ae8bf8ed460fa4d3b95219b8bc1f56080e6cc98 | |
parent | da6b7366dbfc93f59873e252b8d53f17fb47a802 (diff) | |
parent | 6ecad912a0073c768db1491c27ca55ad2d0ee68f (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/Kconfig | 4 | ||||
-rw-r--r-- | arch/powerpc/include/asm/book3s/64/pgtable.h | 4 | ||||
-rw-r--r-- | arch/powerpc/include/asm/eeh.h | 1 | ||||
-rw-r--r-- | arch/powerpc/include/asm/trace.h | 8 | ||||
-rw-r--r-- | arch/powerpc/kernel/eeh_driver.c | 3 | ||||
-rw-r--r-- | arch/powerpc/kernel/eeh_pe.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/module_64.c | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/pgtable_64.c | 32 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/eeh-powernv.c | 5 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/pci-ioda.c | 1 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/pci.c | 26 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/pci.h | 1 | ||||
-rw-r--r-- | include/asm-generic/pgtable.h | 8 | ||||
-rw-r--r-- | mm/huge_memory.c | 1 |
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 | ||
558 | config PPC_4K_PAGES | 558 | config 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 | ||
562 | config PPC_16K_PAGES | 562 | config PPC_16K_PAGES |
563 | bool "16k page size" | 563 | bool "16k page size" |
@@ -566,7 +566,7 @@ config PPC_16K_PAGES | |||
566 | config PPC_64K_PAGES | 566 | config 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 | ||
571 | config PPC_256K_PAGES | 571 | config 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); | |||
281 | extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | 281 | extern 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 | ||
285 | extern 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 |
285 | struct spinlock; | 289 | struct spinlock; |
286 | static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl, | 290 | static 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 | ||
85 | struct eeh_pe { | 86 | struct 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, | |||
57 | extern void hcall_tracepoint_regfunc(void); | 57 | extern void hcall_tracepoint_regfunc(void); |
58 | extern void hcall_tracepoint_unregfunc(void); | 58 | extern void hcall_tracepoint_unregfunc(void); |
59 | 59 | ||
60 | TRACE_EVENT_FN(hcall_entry, | 60 | TRACE_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 | ||
79 | TRACE_EVENT_FN(hcall_exit, | 81 | TRACE_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 | ||
649 | void 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 | */ | ||
666 | void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | 692 | void 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 | ||
3181 | static const struct pci_controller_ops pnv_pci_ioda_controller_ops = { | 3181 | static 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 | ||
769 | void 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 | |||
763 | void pnv_pci_shutdown(void) | 789 | void 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); | |||
242 | extern int pnv_eeh_phb_reset(struct pci_controller *hose, int option); | 242 | extern int pnv_eeh_phb_reset(struct pci_controller *hose, int option); |
243 | 243 | ||
244 | extern void pnv_pci_dma_dev_setup(struct pci_dev *pdev); | 244 | extern void pnv_pci_dma_dev_setup(struct pci_dev *pdev); |
245 | extern void pnv_pci_dma_bus_setup(struct pci_bus *bus); | ||
245 | extern int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type); | 246 | extern int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type); |
246 | extern void pnv_teardown_msi_irqs(struct pci_dev *pdev); | 247 | extern 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 | ||
243 | static 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 |
243 | static inline int pte_same(pte_t pte_a, pte_t pte_b) | 251 | static 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 | ||