kernel-ark/include
Christoph Lameter 4e4785bcf0 [PATCH] mempolicies: fix policy_zone check
There is a check in zonelist_policy that compares pieces of the bitmap
obtained from a gfp mask via GFP_ZONETYPES with a zone number in function
zonelist_policy().

The bitmap is an ORed mask of __GFP_DMA, __GFP_DMA32 and __GFP_HIGHMEM.
The policy_zone is a zone number with the possible values of ZONE_DMA,
ZONE_DMA32, ZONE_HIGHMEM and ZONE_NORMAL. These are two different domains
of values.

For some reason seemed to work before the zone reduction patchset (It
definitely works on SGI boxes since we just have one zone and the check
cannot fail).

With the zone reduction patchset this check definitely fails on systems
with two zones if the system actually has memory in both zones.

This is because ZONE_NORMAL is selected using no __GFP flag at
all and thus gfp_zone(gfpmask) == 0. ZONE_DMA is selected when __GFP_DMA
is set. __GFP_DMA is 0x01.  So gfp_zone(gfpmask) == 1.

policy_zone is set to ZONE_NORMAL (==1) if ZONE_NORMAL and ZONE_DMA are
populated.

For ZONE_NORMAL gfp_zone(<no _GFP_DMA>) yields 0 which is <
policy_zone(ZONE_NORMAL) and so policy is not applied to regular memory
allocations!

Instead gfp_zone(__GFP_DMA) == 1 which results in policy being applied
to DMA allocations!

What we realy want in that place is to establish the highest allowable
zone for a given gfp_mask. If the highest zone is higher or equal to the
policy_zone then memory policies need to be applied. We have such
a highest_zone() function in page_alloc.c.

So move the highest_zone() function from mm/page_alloc.c into
include/linux/gfp.h.  On the way we simplify the function and use the new
zone_type that was also introduced with the zone reduction patchset plus we
also specify the right type for the gfp flags parameter.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-09-26 08:48:47 -07:00
..
acpi
asm-alpha [libata] No need for all those arch libata-portmap.h headers 2006-09-25 15:33:09 -04:00
asm-arm Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 2006-09-24 22:05:59 +01:00
asm-arm26
asm-cris
asm-frv [libata] No need for all those arch libata-portmap.h headers 2006-09-25 15:33:09 -04:00
asm-generic [PATCH] trigger a syntax error if percpu macros are incorrectly used 2006-09-26 08:48:44 -07:00
asm-h8300
asm-i386 [PATCH] convert i386 NUMA KVA space to bootmem 2006-09-26 08:48:45 -07:00
asm-ia64 [PATCH] cpu to node relationship fixup: map cpu to node 2006-09-25 17:38:36 -07:00
asm-m32r
asm-m68k
asm-m68knommu
asm-mips
asm-parisc
asm-powerpc [libata] No need for all those arch libata-portmap.h headers 2006-09-25 15:33:09 -04:00
asm-ppc [PATCH] #elif that should've been #elif defined 2006-09-23 11:34:43 -07:00
asm-s390 [PATCH] trigger a syntax error if percpu macros are incorrectly used 2006-09-26 08:48:44 -07:00
asm-sh
asm-sh64
asm-sparc [libata] No need for all those arch libata-portmap.h headers 2006-09-25 15:33:09 -04:00
asm-sparc64 [libata] No need for all those arch libata-portmap.h headers 2006-09-25 15:33:09 -04:00
asm-um
asm-v850
asm-x86_64 [PATCH] trigger a syntax error if percpu macros are incorrectly used 2006-09-26 08:48:44 -07:00
asm-xtensa
crypto
keys
linux [PATCH] mempolicies: fix policy_zone check 2006-09-26 08:48:47 -07:00
math-emu
media
mtd
net [NetLabel]: rework the Netlink attribute handling (part 1) 2006-09-25 15:56:09 -07:00
pcmcia
rdma
rxrpc
scsi [PATCH] SCSI gfp_t annotations 2006-09-24 20:07:49 -07:00
sound [ALSA] ak4xxx - Remove bogus IPGA controls 2006-09-23 10:46:55 +02:00
video
Kbuild