diff for duplicates of <1455504278.16012.18.camel@gmail.com> diff --git a/a/1.txt b/N1/1.txt index ecfee67..04c883d 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,5 +1,5 @@ On Tue, 2016-02-09 at 06:50 +0530, Aneesh Kumar K.V wrote: -> +>A > Also make sure we wait for irq disable section in other cpus to finish > before flipping a huge pte entry with a regular pmd entry. Code paths > like find_linux_pte_or_hugepte depend on irq disable to get @@ -10,12 +10,12 @@ On Tue, 2016-02-09 at 06:50 +0530, Aneesh Kumar K.V wrote: > Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> > --- -> arch/powerpc/include/asm/book3s/64/pgtable.h | 4 ++++ -> arch/powerpc/mm/pgtable_64.c | 35 +> A arch/powerpc/include/asm/book3s/64/pgtable.h |A A 4 ++++ +> A arch/powerpc/mm/pgtable_64.cA A A A A A A A A A A A A A A A A | 35 > +++++++++++++++++++++++++++- -> include/asm-generic/pgtable.h | 8 +++++++ -> mm/huge_memory.c | 1 + -> 4 files changed, 47 insertions(+), 1 deletion(-) +> A include/asm-generic/pgtable.hA A A A A A A A A A A A A A A A |A A 8 +++++++ +> A mm/huge_memory.cA A A A A A A A A A A A A A A A A A A A A A A A A A A A A |A A 1 + +> A 4 files changed, 47 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h > b/arch/powerpc/include/asm/book3s/64/pgtable.h @@ -24,28 +24,28 @@ On Tue, 2016-02-09 at 06:50 +0530, Aneesh Kumar K.V wrote: > +++ 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); -> extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long +> A extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long > address, -> pmd_t *pmdp); -> +> A A A A A pmd_t *pmdp); +> A > +#define __HAVE_ARCH_PMDP_HUGE_SPLIT_PREPARE > +extern void pmdp_huge_split_prepare(struct vm_area_struct *vma, -> + unsigned long address, pmd_t *pmdp); +> + A A A A unsigned long address, pmd_t *pmdp); > + -> #define pmd_move_must_withdraw pmd_move_must_withdraw -> struct spinlock; -> static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl, +> A #define pmd_move_must_withdraw pmd_move_must_withdraw +> A struct spinlock; +> A static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl, > diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c > index 3124a20d0fab..c8a00da39969 100644 > --- a/arch/powerpc/mm/pgtable_64.c > +++ b/arch/powerpc/mm/pgtable_64.c > @@ -646,6 +646,30 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct > *mm, pmd_t *pmdp) -> return pgtable; -> } -> +> A return pgtable; +> A } +> A > +void pmdp_huge_split_prepare(struct vm_area_struct *vma, -> + unsigned long address, pmd_t *pmdp) +> + A A A A A unsigned long address, pmd_t *pmdp) > +{ > + VM_BUG_ON(address & ~HPAGE_PMD_MASK); > + @@ -53,17 +53,17 @@ On Tue, 2016-02-09 at 06:50 +0530, Aneesh Kumar K.V wrote: > + BUG_ON(REGION_ID(address) != USER_REGION_ID); > +#endif > + /* -> + * We can't mark the pmd none here, because that will cause a race -> + * against exit_mmap. We need to continue mark pmd TRANS HUGE, while -> + * we spilt, but at the same time we wan't rest of the ppc64 code -> + * not to insert hash pte on this, because we will be modifying -> + * the deposited pgtable in the caller of this function. Hence -> + * clear the _PAGE_USER so that we move the fault handling to -> + * higher level function and that will serialize against ptl. -> + * We need to flush existing hash pte entries here even though, -> + * the translation is still valid, because we will withdraw -> + * pgtable_t after this. -> + */ +> + A * We can't mark the pmd none here, because that will cause a race +> + A * against exit_mmap. We need to continue mark pmd TRANS HUGE, while +> + A * we spilt, but at the same time we wan't rest of the ppc64 code +> + A * not to insert hash pte on this, because we will be modifying +> + A * the deposited pgtable in the caller of this function. Hence +> + A * clear the _PAGE_USER so that we move the fault handling to +> + A * higher level function and that will serialize against ptl. +> + A * We need to flush existing hash pte entries here even though, +> + A * the translation is still valid, because we will withdraw +> + A * pgtable_t after this. +> + A */ > + pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_USER, 0); Can this break any checks for _PAGE_USER? From other paths? @@ -71,27 +71,27 @@ Can this break any checks for _PAGE_USER? From other paths? > +} > + > + -> /* -> * set a new huge pmd. We should not be called for updating -> * an existing pmd entry. That should go via pmd_hugepage_update. +> A /* +> A * set a new huge pmd. We should not be called for updating +> A * an existing pmd entry. That should go via pmd_hugepage_update. > @@ -663,10 +687,19 @@ void set_pmd_at(struct mm_struct *mm, unsigned long > addr, -> return set_pte_at(mm, addr, pmdp_ptep(pmdp), pmd_pte(pmd)); -> } -> +> A return set_pte_at(mm, addr, pmdp_ptep(pmdp), pmd_pte(pmd)); +> A } +> A > +/* > + * We use this to invalidate a pmdp entry before switching from a > + * hugepte to regular pmd entry. > + */ -> void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, -> pmd_t *pmdp) -> { +> A void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, +> A A A A A A pmd_t *pmdp) +> A { > - pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 0); > + pmd_hugepage_update(vma->vm_mm, address, pmdp, ~0UL, 0); > + /* -> + * This ensures that generic code that rely on IRQ disabling -> + * to prevent a parallel THP split work as expected. -> + */ +> + A * This ensures that generic code that rely on IRQ disabling +> + A * to prevent a parallel THP split work as expected. +> + A */ > + kick_all_cpus_sync(); Seems expensive, anyway I think the right should do something like or a wrapper @@ -102,3 +102,9 @@ on_each_cpu_mask(mm_cpumask(vma->vm_mm), do_nothing, NULL, 1); do_nothing is not exported, but that can be fixed :) Balbir Singh + +-- +To unsubscribe, send a message with 'unsubscribe linux-mm' in +the body to majordomo@kvack.org. For more info on Linux MM, +see: http://www.linux-mm.org/ . +Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> diff --git a/a/content_digest b/N1/content_digest index 85b162a..b9cdb7d 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -15,7 +15,7 @@ "\00:1\0" "b\0" "On Tue, 2016-02-09 at 06:50 +0530, Aneesh Kumar K.V wrote:\n" - ">\302\240\n" + ">A \n" "> Also make sure we wait for irq disable section in other cpus to finish\n" "> before flipping a huge pte entry with a regular pmd entry. Code paths\n" "> like find_linux_pte_or_hugepte depend on irq disable to get\n" @@ -26,12 +26,12 @@ "> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>\n" "> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>\n" "> ---\n" - "> \302\240arch/powerpc/include/asm/book3s/64/pgtable.h |\302\240\302\2404 ++++\n" - "> \302\240arch/powerpc/mm/pgtable_64.c\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240| 35\n" + "> A arch/powerpc/include/asm/book3s/64/pgtable.h |A A 4 ++++\n" + "> A arch/powerpc/mm/pgtable_64.cA A A A A A A A A A A A A A A A A | 35\n" "> +++++++++++++++++++++++++++-\n" - "> \302\240include/asm-generic/pgtable.h\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240|\302\240\302\2408 +++++++\n" - "> \302\240mm/huge_memory.c\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240|\302\240\302\2401 +\n" - "> \302\2404 files changed, 47 insertions(+), 1 deletion(-)\n" + "> A include/asm-generic/pgtable.hA A A A A A A A A A A A A A A A |A A 8 +++++++\n" + "> A mm/huge_memory.cA A A A A A A A A A A A A A A A A A A A A A A A A A A A A |A A 1 +\n" + "> A 4 files changed, 47 insertions(+), 1 deletion(-)\n" "> \n" "> diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h\n" "> b/arch/powerpc/include/asm/book3s/64/pgtable.h\n" @@ -40,28 +40,28 @@ "> +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h\n" "> @@ -281,6 +281,10 @@ extern pgtable_t pgtable_trans_huge_withdraw(struct\n" "> mm_struct *mm, pmd_t *pmdp);\n" - "> \302\240extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long\n" + "> A extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long\n" "> address,\n" - "> \302\240\t\t\t\302\240\302\240\302\240\302\240pmd_t *pmdp);\n" - "> \302\240\n" + "> A \t\t\tA A A A pmd_t *pmdp);\n" + "> A \n" "> +#define __HAVE_ARCH_PMDP_HUGE_SPLIT_PREPARE\n" "> +extern void pmdp_huge_split_prepare(struct vm_area_struct *vma,\n" - "> +\t\t\t\t\302\240\302\240\302\240\302\240unsigned long address, pmd_t *pmdp);\n" + "> +\t\t\t\tA A A A unsigned long address, pmd_t *pmdp);\n" "> +\n" - "> \302\240#define pmd_move_must_withdraw pmd_move_must_withdraw\n" - "> \302\240struct spinlock;\n" - "> \302\240static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,\n" + "> A #define pmd_move_must_withdraw pmd_move_must_withdraw\n" + "> A struct spinlock;\n" + "> A static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,\n" "> diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c\n" "> index 3124a20d0fab..c8a00da39969 100644\n" "> --- a/arch/powerpc/mm/pgtable_64.c\n" "> +++ b/arch/powerpc/mm/pgtable_64.c\n" "> @@ -646,6 +646,30 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct\n" "> *mm, pmd_t *pmdp)\n" - "> \302\240\treturn pgtable;\n" - "> \302\240}\n" - "> \302\240\n" + "> A \treturn pgtable;\n" + "> A }\n" + "> A \n" "> +void pmdp_huge_split_prepare(struct vm_area_struct *vma,\n" - "> +\t\t\t\302\240\302\240\302\240\302\240\302\240unsigned long address, pmd_t *pmdp)\n" + "> +\t\t\tA A A A A unsigned long address, pmd_t *pmdp)\n" "> +{\n" "> +\tVM_BUG_ON(address & ~HPAGE_PMD_MASK);\n" "> +\n" @@ -69,17 +69,17 @@ "> +\tBUG_ON(REGION_ID(address) != USER_REGION_ID);\n" "> +#endif\n" "> +\t/*\n" - "> +\t\302\240* We can't mark the pmd none here, because that will cause a race\n" - "> +\t\302\240* against exit_mmap. We need to continue mark pmd TRANS HUGE, while\n" - "> +\t\302\240* we spilt, but at the same time we wan't rest of the ppc64 code\n" - "> +\t\302\240* not to insert hash pte on this, because we will be modifying\n" - "> +\t\302\240* the deposited pgtable in the caller of this function. Hence\n" - "> +\t\302\240* clear the _PAGE_USER so that we move the fault handling to\n" - "> +\t\302\240* higher level function and that will serialize against ptl.\n" - "> +\t\302\240* We need to flush existing hash pte entries here even though,\n" - "> +\t\302\240* the translation is still valid, because we will withdraw\n" - "> +\t\302\240* pgtable_t after this.\n" - "> +\t\302\240*/\n" + "> +\tA * We can't mark the pmd none here, because that will cause a race\n" + "> +\tA * against exit_mmap. We need to continue mark pmd TRANS HUGE, while\n" + "> +\tA * we spilt, but at the same time we wan't rest of the ppc64 code\n" + "> +\tA * not to insert hash pte on this, because we will be modifying\n" + "> +\tA * the deposited pgtable in the caller of this function. Hence\n" + "> +\tA * clear the _PAGE_USER so that we move the fault handling to\n" + "> +\tA * higher level function and that will serialize against ptl.\n" + "> +\tA * We need to flush existing hash pte entries here even though,\n" + "> +\tA * the translation is still valid, because we will withdraw\n" + "> +\tA * pgtable_t after this.\n" + "> +\tA */\n" "> +\tpmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_USER, 0);\n" "\n" "Can this break any checks for _PAGE_USER? From other paths?\n" @@ -87,27 +87,27 @@ "> +}\n" "> +\n" "> +\n" - "> \302\240/*\n" - "> \302\240 * set a new huge pmd. We should not be called for updating\n" - "> \302\240 * an existing pmd entry. That should go via pmd_hugepage_update.\n" + "> A /*\n" + "> A * set a new huge pmd. We should not be called for updating\n" + "> A * an existing pmd entry. That should go via pmd_hugepage_update.\n" "> @@ -663,10 +687,19 @@ void set_pmd_at(struct mm_struct *mm, unsigned long\n" "> addr,\n" - "> \302\240\treturn set_pte_at(mm, addr, pmdp_ptep(pmdp), pmd_pte(pmd));\n" - "> \302\240}\n" - "> \302\240\n" + "> A \treturn set_pte_at(mm, addr, pmdp_ptep(pmdp), pmd_pte(pmd));\n" + "> A }\n" + "> A \n" "> +/*\n" "> + * We use this to invalidate a pmdp entry before switching from a\n" "> + * hugepte to regular pmd entry.\n" "> + */\n" - "> \302\240void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,\n" - "> \302\240\t\t\302\240\302\240\302\240\302\240\302\240pmd_t *pmdp)\n" - "> \302\240{\n" + "> A void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,\n" + "> A \t\tA A A A A pmd_t *pmdp)\n" + "> A {\n" "> -\tpmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 0);\n" "> +\tpmd_hugepage_update(vma->vm_mm, address, pmdp, ~0UL, 0);\n" "> +\t/*\n" - "> +\t\302\240* This ensures that generic code that rely on IRQ disabling\n" - "> +\t\302\240* to prevent a parallel THP split work as expected.\n" - "> +\t\302\240*/\n" + "> +\tA * This ensures that generic code that rely on IRQ disabling\n" + "> +\tA * to prevent a parallel THP split work as expected.\n" + "> +\tA */\n" "> +\tkick_all_cpus_sync();\n" "\n" "Seems expensive, anyway I think the right should do something like or a wrapper\n" @@ -117,6 +117,12 @@ "\n" "do_nothing is not exported, but that can be fixed :)\n" "\n" - Balbir Singh + "Balbir Singh\n" + "\n" + "--\n" + "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" + "the body to majordomo@kvack.org. For more info on Linux MM,\n" + "see: http://www.linux-mm.org/ .\n" + "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" -d80dfc075e7cf43c3cd7aedebe9b01747d921c2d74434f398e1efdbe5421519e +ffd976e8ed282e3e93c6b077609390313bf021e93eac03295696add0713262ca
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.