summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
1a93205)
Currently the function to build a zonelist for a BIND policy has the side
effect to set the policy_zone. This seems to be a bit strange. policy
zone seems to not be initialized elsewhere and therefore 0. Do we police
ZONE_DMA if no bind policy has been used yet?
This patch moves the determination of the zone to apply policies to into
the page allocator. We determine the zone while building the zonelist for
nodes.
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
extern struct zonelist *huge_zonelist(struct vm_area_struct *vma,
unsigned long addr);
extern struct zonelist *huge_zonelist(struct vm_area_struct *vma,
unsigned long addr);
+extern int policy_zone;
+
+static inline void check_highest_zone(int k)
+{
+ if (k > policy_zone)
+ policy_zone = k;
+}
+
#else
struct mempolicy {};
#else
struct mempolicy {};
return NODE_DATA(0)->node_zonelists + gfp_zone(GFP_HIGHUSER);
}
return NODE_DATA(0)->node_zonelists + gfp_zone(GFP_HIGHUSER);
}
+static inline void check_highest_zone(int k)
+{
+}
#endif /* CONFIG_NUMA */
#endif /* __KERNEL__ */
#endif /* CONFIG_NUMA */
#endif /* __KERNEL__ */
/* Highest zone. An specific allocation for a zone below that is not
policied. */
/* Highest zone. An specific allocation for a zone below that is not
policied. */
+int policy_zone = ZONE_DMA;
struct mempolicy default_policy = {
.refcnt = ATOMIC_INIT(1), /* never free it */
struct mempolicy default_policy = {
.refcnt = ATOMIC_INIT(1), /* never free it */
if (!zl)
return NULL;
num = 0;
if (!zl)
return NULL;
num = 0;
- for_each_node_mask(nd, *nodes) {
- int k;
- for (k = MAX_NR_ZONES-1; k >= 0; k--) {
- struct zone *z = &NODE_DATA(nd)->node_zones[k];
- if (!z->present_pages)
- continue;
- zl->zones[num++] = z;
- if (k > policy_zone)
- policy_zone = k;
- }
- }
+ for_each_node_mask(nd, *nodes)
+ zl->zones[num++] = &NODE_DATA(nd)->node_zones[policy_zone];
zl->zones[num] = NULL;
return zl;
}
zl->zones[num] = NULL;
return zl;
}
#include <linux/memory_hotplug.h>
#include <linux/nodemask.h>
#include <linux/vmalloc.h>
#include <linux/memory_hotplug.h>
#include <linux/nodemask.h>
#include <linux/vmalloc.h>
+#include <linux/mempolicy.h>
#include <asm/tlbflush.h>
#include "internal.h"
#include <asm/tlbflush.h>
#include "internal.h"
BUG_ON(zone - pgdat->node_zones > ZONE_NORMAL);
#endif
zonelist->zones[j++] = zone;
BUG_ON(zone - pgdat->node_zones > ZONE_NORMAL);
#endif
zonelist->zones[j++] = zone;