* [PATCH 1/2] mm: make dev_pagemap_mapping_shift() externally visible [not found] <20181109203921.178363-1-brho@google.com> @ 2018-11-09 20:39 ` Barret Rhoden 2018-11-13 9:28 ` David Hildenbrand [not found] ` <20181114215155.259978-1-brho@google.com> 1 sibling, 1 reply; 5+ messages in thread From: Barret Rhoden @ 2018-11-09 20:39 UTC (permalink / raw) To: Dan Williams, Dave Jiang, Ross Zwisler, Vishal Verma, Paolo Bonzini, Radim Krčmář, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Naoya Horiguchi Cc: linux-nvdimm, linux-kernel, H. Peter Anvin, x86, kvm, yu.c.zhang, yi.z.zhang, linux-mm KVM has a use case for determining the size of a dax mapping. The KVM code has easy access to the address and the mm; hence the change in parameters. Signed-off-by: Barret Rhoden <brho@google.com> --- include/linux/mm.h | 3 +++ mm/memory-failure.c | 38 +++----------------------------------- mm/util.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 35 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 5411de93a363..51215d695753 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -935,6 +935,9 @@ static inline bool is_pci_p2pdma_page(const struct page *page) } #endif /* CONFIG_DEV_PAGEMAP_OPS */ +unsigned long dev_pagemap_mapping_shift(unsigned long address, + struct mm_struct *mm); + static inline void get_page(struct page *page) { page = compound_head(page); diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 0cd3de3550f0..c3f2c6a8607e 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -265,40 +265,6 @@ void shake_page(struct page *p, int access) } EXPORT_SYMBOL_GPL(shake_page); -static unsigned long dev_pagemap_mapping_shift(struct page *page, - struct vm_area_struct *vma) -{ - unsigned long address = vma_address(page, vma); - pgd_t *pgd; - p4d_t *p4d; - pud_t *pud; - pmd_t *pmd; - pte_t *pte; - - pgd = pgd_offset(vma->vm_mm, address); - if (!pgd_present(*pgd)) - return 0; - p4d = p4d_offset(pgd, address); - if (!p4d_present(*p4d)) - return 0; - pud = pud_offset(p4d, address); - if (!pud_present(*pud)) - return 0; - if (pud_devmap(*pud)) - return PUD_SHIFT; - pmd = pmd_offset(pud, address); - if (!pmd_present(*pmd)) - return 0; - if (pmd_devmap(*pmd)) - return PMD_SHIFT; - pte = pte_offset_map(pmd, address); - if (!pte_present(*pte)) - return 0; - if (pte_devmap(*pte)) - return PAGE_SHIFT; - return 0; -} - /* * Failure handling: if we can't find or can't kill a process there's * not much we can do. We just print a message and ignore otherwise. @@ -329,7 +295,9 @@ static void add_to_kill(struct task_struct *tsk, struct page *p, tk->addr = page_address_in_vma(p, vma); tk->addr_valid = 1; if (is_zone_device_page(p)) - tk->size_shift = dev_pagemap_mapping_shift(p, vma); + tk->size_shift = + dev_pagemap_mapping_shift(vma_address(page, vma), + vma->vm_mm); else tk->size_shift = compound_order(compound_head(p)) + PAGE_SHIFT; diff --git a/mm/util.c b/mm/util.c index 8bf08b5b5760..61bc9bab931d 100644 --- a/mm/util.c +++ b/mm/util.c @@ -780,3 +780,37 @@ int get_cmdline(struct task_struct *task, char *buffer, int buflen) out: return res; } + +unsigned long dev_pagemap_mapping_shift(unsigned long address, + struct mm_struct *mm) +{ + pgd_t *pgd; + p4d_t *p4d; + pud_t *pud; + pmd_t *pmd; + pte_t *pte; + + pgd = pgd_offset(mm, address); + if (!pgd_present(*pgd)) + return 0; + p4d = p4d_offset(pgd, address); + if (!p4d_present(*p4d)) + return 0; + pud = pud_offset(p4d, address); + if (!pud_present(*pud)) + return 0; + if (pud_devmap(*pud)) + return PUD_SHIFT; + pmd = pmd_offset(pud, address); + if (!pmd_present(*pmd)) + return 0; + if (pmd_devmap(*pmd)) + return PMD_SHIFT; + pte = pte_offset_map(pmd, address); + if (!pte_present(*pte)) + return 0; + if (pte_devmap(*pte)) + return PAGE_SHIFT; + return 0; +} +EXPORT_SYMBOL_GPL(dev_pagemap_mapping_shift); -- 2.19.1.930.g4563a0d9d0-goog ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] mm: make dev_pagemap_mapping_shift() externally visible 2018-11-09 20:39 ` [PATCH 1/2] mm: make dev_pagemap_mapping_shift() externally visible Barret Rhoden @ 2018-11-13 9:28 ` David Hildenbrand 0 siblings, 0 replies; 5+ messages in thread From: David Hildenbrand @ 2018-11-13 9:28 UTC (permalink / raw) To: Barret Rhoden, Dan Williams, Dave Jiang, Ross Zwisler, Vishal Verma, Paolo Bonzini, Radim Krčmář, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Naoya Horiguchi Cc: linux-nvdimm, linux-kernel, H. Peter Anvin, x86, kvm, yu.c.zhang, yi.z.zhang, linux-mm On 09.11.18 21:39, Barret Rhoden wrote: > KVM has a use case for determining the size of a dax mapping. The KVM > code has easy access to the address and the mm; hence the change in > parameters. > > Signed-off-by: Barret Rhoden <brho@google.com> > --- > include/linux/mm.h | 3 +++ > mm/memory-failure.c | 38 +++----------------------------------- > mm/util.c | 34 ++++++++++++++++++++++++++++++++++ > 3 files changed, 40 insertions(+), 35 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 5411de93a363..51215d695753 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -935,6 +935,9 @@ static inline bool is_pci_p2pdma_page(const struct page *page) > } > #endif /* CONFIG_DEV_PAGEMAP_OPS */ > > +unsigned long dev_pagemap_mapping_shift(unsigned long address, > + struct mm_struct *mm); > + > static inline void get_page(struct page *page) > { > page = compound_head(page); > diff --git a/mm/memory-failure.c b/mm/memory-failure.c > index 0cd3de3550f0..c3f2c6a8607e 100644 > --- a/mm/memory-failure.c > +++ b/mm/memory-failure.c > @@ -265,40 +265,6 @@ void shake_page(struct page *p, int access) > } > EXPORT_SYMBOL_GPL(shake_page); > > -static unsigned long dev_pagemap_mapping_shift(struct page *page, > - struct vm_area_struct *vma) > -{ > - unsigned long address = vma_address(page, vma); > - pgd_t *pgd; > - p4d_t *p4d; > - pud_t *pud; > - pmd_t *pmd; > - pte_t *pte; > - > - pgd = pgd_offset(vma->vm_mm, address); > - if (!pgd_present(*pgd)) > - return 0; > - p4d = p4d_offset(pgd, address); > - if (!p4d_present(*p4d)) > - return 0; > - pud = pud_offset(p4d, address); > - if (!pud_present(*pud)) > - return 0; > - if (pud_devmap(*pud)) > - return PUD_SHIFT; > - pmd = pmd_offset(pud, address); > - if (!pmd_present(*pmd)) > - return 0; > - if (pmd_devmap(*pmd)) > - return PMD_SHIFT; > - pte = pte_offset_map(pmd, address); > - if (!pte_present(*pte)) > - return 0; > - if (pte_devmap(*pte)) > - return PAGE_SHIFT; > - return 0; > -} > - > /* > * Failure handling: if we can't find or can't kill a process there's > * not much we can do. We just print a message and ignore otherwise. > @@ -329,7 +295,9 @@ static void add_to_kill(struct task_struct *tsk, struct page *p, > tk->addr = page_address_in_vma(p, vma); > tk->addr_valid = 1; > if (is_zone_device_page(p)) > - tk->size_shift = dev_pagemap_mapping_shift(p, vma); > + tk->size_shift = > + dev_pagemap_mapping_shift(vma_address(page, vma), > + vma->vm_mm); > else > tk->size_shift = compound_order(compound_head(p)) + PAGE_SHIFT; > > diff --git a/mm/util.c b/mm/util.c > index 8bf08b5b5760..61bc9bab931d 100644 > --- a/mm/util.c > +++ b/mm/util.c > @@ -780,3 +780,37 @@ int get_cmdline(struct task_struct *task, char *buffer, int buflen) > out: > return res; > } > + > +unsigned long dev_pagemap_mapping_shift(unsigned long address, > + struct mm_struct *mm) > +{ > + pgd_t *pgd; > + p4d_t *p4d; > + pud_t *pud; > + pmd_t *pmd; > + pte_t *pte; > + > + pgd = pgd_offset(mm, address); > + if (!pgd_present(*pgd)) > + return 0; > + p4d = p4d_offset(pgd, address); > + if (!p4d_present(*p4d)) > + return 0; > + pud = pud_offset(p4d, address); > + if (!pud_present(*pud)) > + return 0; > + if (pud_devmap(*pud)) > + return PUD_SHIFT; > + pmd = pmd_offset(pud, address); > + if (!pmd_present(*pmd)) > + return 0; > + if (pmd_devmap(*pmd)) > + return PMD_SHIFT; > + pte = pte_offset_map(pmd, address); > + if (!pte_present(*pte)) > + return 0; > + if (pte_devmap(*pte)) > + return PAGE_SHIFT; > + return 0; > +} > +EXPORT_SYMBOL_GPL(dev_pagemap_mapping_shift); > Looks good to me Reviewed-by: David Hildenbrand <david@redhat.com> -- Thanks, David / dhildenb ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <20181114215155.259978-1-brho@google.com>]
* [PATCH v2 1/3] mm: make dev_pagemap_mapping_shift() externally visible [not found] ` <20181114215155.259978-1-brho@google.com> @ 2018-11-14 21:51 ` Barret Rhoden 2018-11-26 16:50 ` Paolo Bonzini 2018-11-26 18:32 ` Dan Williams 0 siblings, 2 replies; 5+ messages in thread From: Barret Rhoden @ 2018-11-14 21:51 UTC (permalink / raw) To: Dan Williams, Dave Jiang, Ross Zwisler, Vishal Verma, Paolo Bonzini, Radim Krčmář, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Naoya Horiguchi Cc: linux-nvdimm, linux-kernel, H. Peter Anvin, x86, kvm, yu.c.zhang, yi.z.zhang, linux-mm, David Hildenbrand KVM has a use case for determining the size of a dax mapping. The KVM code has easy access to the address and the mm; hence the change in parameters. Signed-off-by: Barret Rhoden <brho@google.com> Reviewed-by: David Hildenbrand <david@redhat.com> --- include/linux/mm.h | 3 +++ mm/memory-failure.c | 38 +++----------------------------------- mm/util.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 35 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 5411de93a363..51215d695753 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -935,6 +935,9 @@ static inline bool is_pci_p2pdma_page(const struct page *page) } #endif /* CONFIG_DEV_PAGEMAP_OPS */ +unsigned long dev_pagemap_mapping_shift(unsigned long address, + struct mm_struct *mm); + static inline void get_page(struct page *page) { page = compound_head(page); diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 0cd3de3550f0..c3f2c6a8607e 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -265,40 +265,6 @@ void shake_page(struct page *p, int access) } EXPORT_SYMBOL_GPL(shake_page); -static unsigned long dev_pagemap_mapping_shift(struct page *page, - struct vm_area_struct *vma) -{ - unsigned long address = vma_address(page, vma); - pgd_t *pgd; - p4d_t *p4d; - pud_t *pud; - pmd_t *pmd; - pte_t *pte; - - pgd = pgd_offset(vma->vm_mm, address); - if (!pgd_present(*pgd)) - return 0; - p4d = p4d_offset(pgd, address); - if (!p4d_present(*p4d)) - return 0; - pud = pud_offset(p4d, address); - if (!pud_present(*pud)) - return 0; - if (pud_devmap(*pud)) - return PUD_SHIFT; - pmd = pmd_offset(pud, address); - if (!pmd_present(*pmd)) - return 0; - if (pmd_devmap(*pmd)) - return PMD_SHIFT; - pte = pte_offset_map(pmd, address); - if (!pte_present(*pte)) - return 0; - if (pte_devmap(*pte)) - return PAGE_SHIFT; - return 0; -} - /* * Failure handling: if we can't find or can't kill a process there's * not much we can do. We just print a message and ignore otherwise. @@ -329,7 +295,9 @@ static void add_to_kill(struct task_struct *tsk, struct page *p, tk->addr = page_address_in_vma(p, vma); tk->addr_valid = 1; if (is_zone_device_page(p)) - tk->size_shift = dev_pagemap_mapping_shift(p, vma); + tk->size_shift = + dev_pagemap_mapping_shift(vma_address(page, vma), + vma->vm_mm); else tk->size_shift = compound_order(compound_head(p)) + PAGE_SHIFT; diff --git a/mm/util.c b/mm/util.c index 8bf08b5b5760..61bc9bab931d 100644 --- a/mm/util.c +++ b/mm/util.c @@ -780,3 +780,37 @@ int get_cmdline(struct task_struct *task, char *buffer, int buflen) out: return res; } + +unsigned long dev_pagemap_mapping_shift(unsigned long address, + struct mm_struct *mm) +{ + pgd_t *pgd; + p4d_t *p4d; + pud_t *pud; + pmd_t *pmd; + pte_t *pte; + + pgd = pgd_offset(mm, address); + if (!pgd_present(*pgd)) + return 0; + p4d = p4d_offset(pgd, address); + if (!p4d_present(*p4d)) + return 0; + pud = pud_offset(p4d, address); + if (!pud_present(*pud)) + return 0; + if (pud_devmap(*pud)) + return PUD_SHIFT; + pmd = pmd_offset(pud, address); + if (!pmd_present(*pmd)) + return 0; + if (pmd_devmap(*pmd)) + return PMD_SHIFT; + pte = pte_offset_map(pmd, address); + if (!pte_present(*pte)) + return 0; + if (pte_devmap(*pte)) + return PAGE_SHIFT; + return 0; +} +EXPORT_SYMBOL_GPL(dev_pagemap_mapping_shift); -- 2.19.1.1215.g8438c0b245-goog ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/3] mm: make dev_pagemap_mapping_shift() externally visible 2018-11-14 21:51 ` [PATCH v2 1/3] " Barret Rhoden @ 2018-11-26 16:50 ` Paolo Bonzini 2018-11-26 18:32 ` Dan Williams 1 sibling, 0 replies; 5+ messages in thread From: Paolo Bonzini @ 2018-11-26 16:50 UTC (permalink / raw) To: Barret Rhoden, Dan Williams, Dave Jiang, Ross Zwisler, Vishal Verma, Radim Krčmář, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Naoya Horiguchi Cc: linux-nvdimm, linux-kernel, H. Peter Anvin, x86, kvm, yu.c.zhang, yi.z.zhang, linux-mm, David Hildenbrand, Andrew Morton On 14/11/18 22:51, Barret Rhoden wrote: > KVM has a use case for determining the size of a dax mapping. The KVM > code has easy access to the address and the mm; hence the change in > parameters. > > Signed-off-by: Barret Rhoden <brho@google.com> > Reviewed-by: David Hildenbrand <david@redhat.com> > --- > include/linux/mm.h | 3 +++ > mm/memory-failure.c | 38 +++----------------------------------- > mm/util.c | 34 ++++++++++++++++++++++++++++++++++ > 3 files changed, 40 insertions(+), 35 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 5411de93a363..51215d695753 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -935,6 +935,9 @@ static inline bool is_pci_p2pdma_page(const struct page *page) > } > #endif /* CONFIG_DEV_PAGEMAP_OPS */ > > +unsigned long dev_pagemap_mapping_shift(unsigned long address, > + struct mm_struct *mm); > + > static inline void get_page(struct page *page) > { > page = compound_head(page); > diff --git a/mm/memory-failure.c b/mm/memory-failure.c > index 0cd3de3550f0..c3f2c6a8607e 100644 > --- a/mm/memory-failure.c > +++ b/mm/memory-failure.c > @@ -265,40 +265,6 @@ void shake_page(struct page *p, int access) > } > EXPORT_SYMBOL_GPL(shake_page); > > -static unsigned long dev_pagemap_mapping_shift(struct page *page, > - struct vm_area_struct *vma) > -{ > - unsigned long address = vma_address(page, vma); > - pgd_t *pgd; > - p4d_t *p4d; > - pud_t *pud; > - pmd_t *pmd; > - pte_t *pte; > - > - pgd = pgd_offset(vma->vm_mm, address); > - if (!pgd_present(*pgd)) > - return 0; > - p4d = p4d_offset(pgd, address); > - if (!p4d_present(*p4d)) > - return 0; > - pud = pud_offset(p4d, address); > - if (!pud_present(*pud)) > - return 0; > - if (pud_devmap(*pud)) > - return PUD_SHIFT; > - pmd = pmd_offset(pud, address); > - if (!pmd_present(*pmd)) > - return 0; > - if (pmd_devmap(*pmd)) > - return PMD_SHIFT; > - pte = pte_offset_map(pmd, address); > - if (!pte_present(*pte)) > - return 0; > - if (pte_devmap(*pte)) > - return PAGE_SHIFT; > - return 0; > -} > - > /* > * Failure handling: if we can't find or can't kill a process there's > * not much we can do. We just print a message and ignore otherwise. > @@ -329,7 +295,9 @@ static void add_to_kill(struct task_struct *tsk, struct page *p, > tk->addr = page_address_in_vma(p, vma); > tk->addr_valid = 1; > if (is_zone_device_page(p)) > - tk->size_shift = dev_pagemap_mapping_shift(p, vma); > + tk->size_shift = > + dev_pagemap_mapping_shift(vma_address(page, vma), > + vma->vm_mm); > else > tk->size_shift = compound_order(compound_head(p)) + PAGE_SHIFT; > > diff --git a/mm/util.c b/mm/util.c > index 8bf08b5b5760..61bc9bab931d 100644 > --- a/mm/util.c > +++ b/mm/util.c > @@ -780,3 +780,37 @@ int get_cmdline(struct task_struct *task, char *buffer, int buflen) > out: > return res; > } > + > +unsigned long dev_pagemap_mapping_shift(unsigned long address, > + struct mm_struct *mm) > +{ > + pgd_t *pgd; > + p4d_t *p4d; > + pud_t *pud; > + pmd_t *pmd; > + pte_t *pte; > + > + pgd = pgd_offset(mm, address); > + if (!pgd_present(*pgd)) > + return 0; > + p4d = p4d_offset(pgd, address); > + if (!p4d_present(*p4d)) > + return 0; > + pud = pud_offset(p4d, address); > + if (!pud_present(*pud)) > + return 0; > + if (pud_devmap(*pud)) > + return PUD_SHIFT; > + pmd = pmd_offset(pud, address); > + if (!pmd_present(*pmd)) > + return 0; > + if (pmd_devmap(*pmd)) > + return PMD_SHIFT; > + pte = pte_offset_map(pmd, address); > + if (!pte_present(*pte)) > + return 0; > + if (pte_devmap(*pte)) > + return PAGE_SHIFT; > + return 0; > +} > +EXPORT_SYMBOL_GPL(dev_pagemap_mapping_shift); > Andrew, can you ack this patch? Thanks, Paolo ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/3] mm: make dev_pagemap_mapping_shift() externally visible 2018-11-14 21:51 ` [PATCH v2 1/3] " Barret Rhoden 2018-11-26 16:50 ` Paolo Bonzini @ 2018-11-26 18:32 ` Dan Williams 1 sibling, 0 replies; 5+ messages in thread From: Dan Williams @ 2018-11-26 18:32 UTC (permalink / raw) To: Barret Rhoden Cc: Dave Jiang, zwisler, Vishal L Verma, Paolo Bonzini, rkrcmar, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Naoya Horiguchi, linux-nvdimm, Linux Kernel Mailing List, H. Peter Anvin, X86 ML, KVM list, Zhang, Yu C, Zhang, Yi Z, Linux MM, David Hildenbrand On Wed, Nov 14, 2018 at 1:53 PM Barret Rhoden <brho@google.com> wrote: > > KVM has a use case for determining the size of a dax mapping. The KVM > code has easy access to the address and the mm; hence the change in > parameters. > > Signed-off-by: Barret Rhoden <brho@google.com> > Reviewed-by: David Hildenbrand <david@redhat.com> Acked-by: Dan Williams <dan.j.williams@intel.com> ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2018-11-26 18:32 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20181109203921.178363-1-brho@google.com> 2018-11-09 20:39 ` [PATCH 1/2] mm: make dev_pagemap_mapping_shift() externally visible Barret Rhoden 2018-11-13 9:28 ` David Hildenbrand [not found] ` <20181114215155.259978-1-brho@google.com> 2018-11-14 21:51 ` [PATCH v2 1/3] " Barret Rhoden 2018-11-26 16:50 ` Paolo Bonzini 2018-11-26 18:32 ` Dan Williams
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).