Commit 260b2367 authored by Al Viro's avatar Al Viro Committed by Linus Torvalds

[PATCH] gfp_t: the rest

zone handling, mapping->flags handling
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c4cdd038
...@@ -302,7 +302,7 @@ void get_zone_counts(unsigned long *active, unsigned long *inactive, ...@@ -302,7 +302,7 @@ void get_zone_counts(unsigned long *active, unsigned long *inactive,
void build_all_zonelists(void); void build_all_zonelists(void);
void wakeup_kswapd(struct zone *zone, int order); void wakeup_kswapd(struct zone *zone, int order);
int zone_watermark_ok(struct zone *z, int order, unsigned long mark, int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
int alloc_type, int can_try_harder, int gfp_high); int alloc_type, int can_try_harder, gfp_t gfp_high);
#ifdef CONFIG_HAVE_MEMORY_PRESENT #ifdef CONFIG_HAVE_MEMORY_PRESENT
void memory_present(int nid, unsigned long start, unsigned long end); void memory_present(int nid, unsigned long start, unsigned long end);
......
...@@ -21,16 +21,17 @@ ...@@ -21,16 +21,17 @@
static inline gfp_t mapping_gfp_mask(struct address_space * mapping) static inline gfp_t mapping_gfp_mask(struct address_space * mapping)
{ {
return mapping->flags & __GFP_BITS_MASK; return (__force gfp_t)mapping->flags & __GFP_BITS_MASK;
} }
/* /*
* This is non-atomic. Only to be used before the mapping is activated. * This is non-atomic. Only to be used before the mapping is activated.
* Probably needs a barrier... * Probably needs a barrier...
*/ */
static inline void mapping_set_gfp_mask(struct address_space *m, int mask) static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask)
{ {
m->flags = (m->flags & ~__GFP_BITS_MASK) | mask; m->flags = (m->flags & ~(__force unsigned long)__GFP_BITS_MASK) |
(__force unsigned long)mask;
} }
/* /*
......
...@@ -30,11 +30,9 @@ ...@@ -30,11 +30,9 @@
static mempool_t *page_pool, *isa_page_pool; static mempool_t *page_pool, *isa_page_pool;
static void *page_pool_alloc(gfp_t gfp_mask, void *data) static void *page_pool_alloc_isa(gfp_t gfp_mask, void *data)
{ {
unsigned int gfp = gfp_mask | (unsigned int) (long) data; return alloc_page(gfp_mask | GFP_DMA);
return alloc_page(gfp);
} }
static void page_pool_free(void *page, void *data) static void page_pool_free(void *page, void *data)
...@@ -51,6 +49,12 @@ static void page_pool_free(void *page, void *data) ...@@ -51,6 +49,12 @@ static void page_pool_free(void *page, void *data)
* n means that there are (n-1) current users of it. * n means that there are (n-1) current users of it.
*/ */
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
static void *page_pool_alloc(gfp_t gfp_mask, void *data)
{
return alloc_page(gfp_mask);
}
static int pkmap_count[LAST_PKMAP]; static int pkmap_count[LAST_PKMAP];
static unsigned int last_pkmap_nr; static unsigned int last_pkmap_nr;
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(kmap_lock); static __cacheline_aligned_in_smp DEFINE_SPINLOCK(kmap_lock);
...@@ -267,7 +271,7 @@ int init_emergency_isa_pool(void) ...@@ -267,7 +271,7 @@ int init_emergency_isa_pool(void)
if (isa_page_pool) if (isa_page_pool)
return 0; return 0;
isa_page_pool = mempool_create(ISA_POOL_SIZE, page_pool_alloc, page_pool_free, (void *) __GFP_DMA); isa_page_pool = mempool_create(ISA_POOL_SIZE, page_pool_alloc_isa, page_pool_free, NULL);
if (!isa_page_pool) if (!isa_page_pool)
BUG(); BUG();
......
...@@ -734,7 +734,7 @@ buffered_rmqueue(struct zone *zone, int order, gfp_t gfp_flags) ...@@ -734,7 +734,7 @@ buffered_rmqueue(struct zone *zone, int order, gfp_t gfp_flags)
* of the allocation. * of the allocation.
*/ */
int zone_watermark_ok(struct zone *z, int order, unsigned long mark, int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
int classzone_idx, int can_try_harder, int gfp_high) int classzone_idx, int can_try_harder, gfp_t gfp_high)
{ {
/* free_pages my go negative - that's OK */ /* free_pages my go negative - that's OK */
long min = mark, free_pages = z->free_pages - (1 << order) + 1; long min = mark, free_pages = z->free_pages - (1 << order) + 1;
...@@ -777,7 +777,7 @@ struct page * fastcall ...@@ -777,7 +777,7 @@ struct page * fastcall
__alloc_pages(gfp_t gfp_mask, unsigned int order, __alloc_pages(gfp_t gfp_mask, unsigned int order,
struct zonelist *zonelist) struct zonelist *zonelist)
{ {
const int wait = gfp_mask & __GFP_WAIT; const gfp_t wait = gfp_mask & __GFP_WAIT;
struct zone **zones, *z; struct zone **zones, *z;
struct page *page; struct page *page;
struct reclaim_state reclaim_state; struct reclaim_state reclaim_state;
...@@ -996,7 +996,7 @@ fastcall unsigned long get_zeroed_page(gfp_t gfp_mask) ...@@ -996,7 +996,7 @@ fastcall unsigned long get_zeroed_page(gfp_t gfp_mask)
* get_zeroed_page() returns a 32-bit address, which cannot represent * get_zeroed_page() returns a 32-bit address, which cannot represent
* a highmem page * a highmem page
*/ */
BUG_ON(gfp_mask & __GFP_HIGHMEM); BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0);
page = alloc_pages(gfp_mask | __GFP_ZERO, 0); page = alloc_pages(gfp_mask | __GFP_ZERO, 0);
if (page) if (page)
...@@ -1428,6 +1428,16 @@ static int __init build_zonelists_node(pg_data_t *pgdat, struct zonelist *zoneli ...@@ -1428,6 +1428,16 @@ static int __init build_zonelists_node(pg_data_t *pgdat, struct zonelist *zoneli
return j; return j;
} }
static inline int highest_zone(int zone_bits)
{
int res = ZONE_NORMAL;
if (zone_bits & (__force int)__GFP_HIGHMEM)
res = ZONE_HIGHMEM;
if (zone_bits & (__force int)__GFP_DMA)
res = ZONE_DMA;
return res;
}
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
#define MAX_NODE_LOAD (num_online_nodes()) #define MAX_NODE_LOAD (num_online_nodes())
static int __initdata node_load[MAX_NUMNODES]; static int __initdata node_load[MAX_NUMNODES];
...@@ -1524,11 +1534,7 @@ static void __init build_zonelists(pg_data_t *pgdat) ...@@ -1524,11 +1534,7 @@ static void __init build_zonelists(pg_data_t *pgdat)
zonelist = pgdat->node_zonelists + i; zonelist = pgdat->node_zonelists + i;
for (j = 0; zonelist->zones[j] != NULL; j++); for (j = 0; zonelist->zones[j] != NULL; j++);
k = ZONE_NORMAL; k = highest_zone(i);
if (i & __GFP_HIGHMEM)
k = ZONE_HIGHMEM;
if (i & __GFP_DMA)
k = ZONE_DMA;
j = build_zonelists_node(NODE_DATA(node), zonelist, j, k); j = build_zonelists_node(NODE_DATA(node), zonelist, j, k);
zonelist->zones[j] = NULL; zonelist->zones[j] = NULL;
...@@ -1549,12 +1555,7 @@ static void __init build_zonelists(pg_data_t *pgdat) ...@@ -1549,12 +1555,7 @@ static void __init build_zonelists(pg_data_t *pgdat)
zonelist = pgdat->node_zonelists + i; zonelist = pgdat->node_zonelists + i;
j = 0; j = 0;
k = ZONE_NORMAL; k = highest_zone(i);
if (i & __GFP_HIGHMEM)
k = ZONE_HIGHMEM;
if (i & __GFP_DMA)
k = ZONE_DMA;
j = build_zonelists_node(pgdat, zonelist, j, k); j = build_zonelists_node(pgdat, zonelist, j, k);
/* /*
* Now we build the zonelist so that it contains the zones * Now we build the zonelist so that it contains the zones
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment