Skip to content

Commit

Permalink
[PATCH] x86_64: Move NUMA page_to_pfn/pfn_to_page functions out of line
Browse files Browse the repository at this point in the history
Saves about ~18K .text in defconfig

There would be more optimization potential, but that's for later.

Suggestion originally from Bill Irwin.
Fix from Andy Whitcroft.

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Andi Kleen authored and Linus Torvalds committed Jan 12, 2006
1 parent cdc4b9c commit cf05013
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 13 deletions.
36 changes: 36 additions & 0 deletions arch/x86_64/mm/numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -360,3 +360,39 @@ EXPORT_SYMBOL(node_to_cpumask);
EXPORT_SYMBOL(memnode_shift);
EXPORT_SYMBOL(memnodemap);
EXPORT_SYMBOL(node_data);

#ifdef CONFIG_DISCONTIGMEM
/*
* Functions to convert PFNs from/to per node page addresses.
* These are out of line because they are quite big.
* They could be all tuned by pre caching more state.
* Should do that.
*/

/* Requires pfn_valid(pfn) to be true */
struct page *pfn_to_page(unsigned long pfn)
{
int nid = phys_to_nid(((unsigned long)(pfn)) << PAGE_SHIFT);
return (pfn - node_start_pfn(nid)) + NODE_DATA(nid)->node_mem_map;
}
EXPORT_SYMBOL(pfn_to_page);

unsigned long page_to_pfn(struct page *page)
{
return (long)(((page) - page_zone(page)->zone_mem_map) +
page_zone(page)->zone_start_pfn);
}
EXPORT_SYMBOL(page_to_pfn);

int pfn_valid(unsigned long pfn)
{
unsigned nid;
if (pfn >= num_physpages)
return 0;
nid = pfn_to_nid(pfn);
if (nid == 0xff)
return 0;
return pfn >= node_start_pfn(nid) && (pfn) < node_end_pfn(nid);
}
EXPORT_SYMBOL(pfn_valid);
#endif
16 changes: 3 additions & 13 deletions include/asm-x86_64/mmzone.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,12 @@ static inline __attribute__((pure)) int phys_to_nid(unsigned long addr)
NODE_DATA(nid)->node_spanned_pages)

#ifdef CONFIG_DISCONTIGMEM

#define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT)
#define kvaddr_to_nid(kaddr) phys_to_nid(__pa(kaddr))

/* Requires pfn_valid(pfn) to be true */
#define pfn_to_page(pfn) ({ \
int nid = phys_to_nid(((unsigned long)(pfn)) << PAGE_SHIFT); \
((pfn) - node_start_pfn(nid)) + NODE_DATA(nid)->node_mem_map; \
})

#define page_to_pfn(page) \
(long)(((page) - page_zone(page)->zone_mem_map) + page_zone(page)->zone_start_pfn)

#define pfn_valid(pfn) ((pfn) >= num_physpages ? 0 : \
({ u8 nid__ = pfn_to_nid(pfn); \
nid__ != 0xff && (pfn) >= node_start_pfn(nid__) && (pfn) < node_end_pfn(nid__); }))
extern struct page *pfn_to_page(unsigned long pfn);
extern unsigned long page_to_pfn(struct page *page);
extern int pfn_valid(unsigned long pfn);
#endif

#define local_mapnr(kvaddr) \
Expand Down

0 comments on commit cf05013

Please sign in to comment.