mm: uninline and cleanup page-mapping related helpers
Most-used page->mapping helper -- page_mapping() -- has already uninlined.
Let's uninline also page_rmapping() and page_anon_vma(). It saves us
depending on configuration around 400 bytes in text:
text data bss dec hex filename
660318 99254 410000 1169572
11d8a4 mm/built-in.o-before
659854 99254 410000 1169108 11d6d4 mm/built-in.o
I also tried to make code a bit more clean.
[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Konstantin Khlebnikov <koct9i@gmail.com>
Cc: Rik van Riel <riel@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
99e8ea6cd2
commit
e39155ea11
3 changed files with 38 additions and 19 deletions
|
@ -950,14 +950,10 @@ void page_address_init(void);
|
||||||
#define page_address_init() do { } while(0)
|
#define page_address_init() do { } while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern void *page_rmapping(struct page *page);
|
||||||
|
extern struct anon_vma *page_anon_vma(struct page *page);
|
||||||
extern struct address_space *page_mapping(struct page *page);
|
extern struct address_space *page_mapping(struct page *page);
|
||||||
|
|
||||||
/* Neutral page->mapping pointer to address_space or anon_vma or other */
|
|
||||||
static inline void *page_rmapping(struct page *page)
|
|
||||||
{
|
|
||||||
return (void *)((unsigned long)page->mapping & ~PAGE_MAPPING_FLAGS);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern struct address_space *__page_file_mapping(struct page *);
|
extern struct address_space *__page_file_mapping(struct page *);
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
|
|
|
@ -105,14 +105,6 @@ static inline void put_anon_vma(struct anon_vma *anon_vma)
|
||||||
__put_anon_vma(anon_vma);
|
__put_anon_vma(anon_vma);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct anon_vma *page_anon_vma(struct page *page)
|
|
||||||
{
|
|
||||||
if (((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) !=
|
|
||||||
PAGE_MAPPING_ANON)
|
|
||||||
return NULL;
|
|
||||||
return page_rmapping(page);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void vma_lock_anon_vma(struct vm_area_struct *vma)
|
static inline void vma_lock_anon_vma(struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
struct anon_vma *anon_vma = vma->anon_vma;
|
struct anon_vma *anon_vma = vma->anon_vma;
|
||||||
|
|
41
mm/util.c
41
mm/util.c
|
@ -325,9 +325,37 @@ void kvfree(const void *addr)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kvfree);
|
EXPORT_SYMBOL(kvfree);
|
||||||
|
|
||||||
|
static inline void *__page_rmapping(struct page *page)
|
||||||
|
{
|
||||||
|
unsigned long mapping;
|
||||||
|
|
||||||
|
mapping = (unsigned long)page->mapping;
|
||||||
|
mapping &= ~PAGE_MAPPING_FLAGS;
|
||||||
|
|
||||||
|
return (void *)mapping;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Neutral page->mapping pointer to address_space or anon_vma or other */
|
||||||
|
void *page_rmapping(struct page *page)
|
||||||
|
{
|
||||||
|
page = compound_head(page);
|
||||||
|
return __page_rmapping(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct anon_vma *page_anon_vma(struct page *page)
|
||||||
|
{
|
||||||
|
unsigned long mapping;
|
||||||
|
|
||||||
|
page = compound_head(page);
|
||||||
|
mapping = (unsigned long)page->mapping;
|
||||||
|
if ((mapping & PAGE_MAPPING_FLAGS) != PAGE_MAPPING_ANON)
|
||||||
|
return NULL;
|
||||||
|
return __page_rmapping(page);
|
||||||
|
}
|
||||||
|
|
||||||
struct address_space *page_mapping(struct page *page)
|
struct address_space *page_mapping(struct page *page)
|
||||||
{
|
{
|
||||||
struct address_space *mapping = page->mapping;
|
unsigned long mapping;
|
||||||
|
|
||||||
/* This happens if someone calls flush_dcache_page on slab page */
|
/* This happens if someone calls flush_dcache_page on slab page */
|
||||||
if (unlikely(PageSlab(page)))
|
if (unlikely(PageSlab(page)))
|
||||||
|
@ -337,10 +365,13 @@ struct address_space *page_mapping(struct page *page)
|
||||||
swp_entry_t entry;
|
swp_entry_t entry;
|
||||||
|
|
||||||
entry.val = page_private(page);
|
entry.val = page_private(page);
|
||||||
mapping = swap_address_space(entry);
|
return swap_address_space(entry);
|
||||||
} else if ((unsigned long)mapping & PAGE_MAPPING_ANON)
|
}
|
||||||
mapping = NULL;
|
|
||||||
return mapping;
|
mapping = (unsigned long)page->mapping;
|
||||||
|
if (mapping & PAGE_MAPPING_FLAGS)
|
||||||
|
return NULL;
|
||||||
|
return page->mapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
int overcommit_ratio_handler(struct ctl_table *table, int write,
|
int overcommit_ratio_handler(struct ctl_table *table, int write,
|
||||||
|
|
Loading…
Reference in a new issue