Message ID | 20200515131656.12890-7-willy@infradead.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Large pages in the page cache | expand |
On 15.05.20 15:16, Matthew Wilcox wrote: > From: "Matthew Wilcox (Oracle)" <willy@infradead.org> > > Mirroring offset_in_page(), this gives you the offset within this > particular page, no matter what size page it is. It optimises down > to offset_in_page() if CONFIG_TRANSPARENT_HUGEPAGE is not set. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> > --- > include/linux/mm.h | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 088acbda722d..9a55dce6a535 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1577,6 +1577,7 @@ static inline void clear_page_pfmemalloc(struct page *page) > extern void pagefault_out_of_memory(void); > > #define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK) > +#define offset_in_thp(page, p) ((unsigned long)(p) & (thp_size(page) - 1)) > > /* > * Flags passed to show_mem() and show_free_areas() to suppress output in > Reviewed-by: David Hildenbrand <david@redhat.com>
On Fri, May 15, 2020 at 06:16:26AM -0700, Matthew Wilcox wrote: > From: "Matthew Wilcox (Oracle)" <willy@infradead.org> > > Mirroring offset_in_page(), this gives you the offset within this > particular page, no matter what size page it is. It optimises down > to offset_in_page() if CONFIG_TRANSPARENT_HUGEPAGE is not set. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> > --- > include/linux/mm.h | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 088acbda722d..9a55dce6a535 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1577,6 +1577,7 @@ static inline void clear_page_pfmemalloc(struct page *page) > extern void pagefault_out_of_memory(void); > > #define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK) > +#define offset_in_thp(page, p) ((unsigned long)(p) & (thp_size(page) - 1)) Looks like thp_mask() would be handy here.
On Fri, May 22, 2020 at 08:15:17PM +0300, Kirill A. Shutemov wrote: > On Fri, May 15, 2020 at 06:16:26AM -0700, Matthew Wilcox wrote: > > +#define offset_in_thp(page, p) ((unsigned long)(p) & (thp_size(page) - 1)) > > Looks like thp_mask() would be handy here. It's not the only place we could use a thp_mask(), but PAGE_MASK is the inverse of what I think it should be: include/asm-generic/page.h:#define PAGE_MASK (~(PAGE_SIZE-1)) ie addr & PAGE_MASK returns the address aligned to page size, not the offset within the page. Given this ambiguity, I'm inclined to leave it as (thp_size(page) - 1), as it's clear which bits we're masking off.
diff --git a/include/linux/mm.h b/include/linux/mm.h index 088acbda722d..9a55dce6a535 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1577,6 +1577,7 @@ static inline void clear_page_pfmemalloc(struct page *page) extern void pagefault_out_of_memory(void); #define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK) +#define offset_in_thp(page, p) ((unsigned long)(p) & (thp_size(page) - 1)) /* * Flags passed to show_mem() and show_free_areas() to suppress output in