lkml.org 
[lkml]   [2006]   [Jul]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: 2.6.18-rc1-mm1 oops on x86_64
    On Mon, 10 Jul 2006, Christoph Lameter wrote:

    > Hmm... Actually we could leave __GFP_HIGHMEM at it prior value since
    > GFP_ZONEMASK masks it out anyways. Need to test this though. This may
    > also make some of the __GFP_DMA32 ifdefs unnecessary.

    Here is the patch that fixes __GFP_DMA32 and __GFP_HIGHMEM to always
    be nonzero. However, after the #ifdef in my last patch there is no
    remaining instance of this left. The cure here adds some complexity:




    Avoid __GFP_xx becoming 0

    We sometimes do comparisons like

    xx & (__GFP_x| __GFP_y)) == GFP_y

    This becomes a problem if GFP_y is redefined to be zero.

    Both __GFP_HIGHMEM (caused by me) and __GFP_DMA32 (was this way before)
    can become zero in order to cause a fall back to ZONE_NORMAL.

    We also have a GFP_MASK that is applied before indexing into the
    nodelists array. We can use that mask to avoid having both become zero
    and instead use the GFP_MASK to clear the respective bits before
    retrieving the zonelist.

    - Remove #ifdefs that cause __GFP_HIGHMEM or __GFP_DMA32 to become zero.

    - GFP_MASK works nicely to cause fall back to ZONE_NORMAL except if
    CONFIG_ZONE_DMA32 and !CONFIG_HIGHMEM are set. In that case the
    fallback to ZONE_NORMAL does not work. So add a special case
    to mmzone.h to define a special mask that switches off the highmem
    bit for this particular configuration.

    Signed-off-by: Christoph Lameter <clameter@sgi.com>

    Index: linux-2.6.18-rc1-mm1/include/linux/gfp.h
    ===================================================================
    --- linux-2.6.18-rc1-mm1.orig/include/linux/gfp.h 2006-07-10 09:37:56.352426085 -0700
    +++ linux-2.6.18-rc1-mm1/include/linux/gfp.h 2006-07-10 09:42:44.254485171 -0700
    @@ -12,17 +12,10 @@ struct vm_area_struct;
    */
    /* Zone modifiers in GFP_ZONEMASK (see linux/mmzone.h - low three bits) */
    #define __GFP_DMA ((__force gfp_t)0x01u)
    -
    -#ifdef CONFIG_HIGHMEM
    #define __GFP_HIGHMEM ((__force gfp_t)0x02u)
    -#else
    -#define __GFP_HIGHMEM ((__force gfp_t)0x00) /* NORMAL is HIGHMEM */
    -#endif

    -#ifndef CONFIG_ZONE_DMA32
    +#if !defined(CONFIG_ZONE_DMA32) && BITS_PER_LONG >= 64
    #define __GFP_DMA32 ((__force gfp_t)0x01) /* ZONE_DMA is ZONE_DMA32 */
    -#elif BITS_PER_LONG < 64
    -#define __GFP_DMA32 ((__force gfp_t)0x00) /* ZONE_NORMAL is ZONE_DMA32 */
    #else
    #define __GFP_DMA32 ((__force gfp_t)0x04) /* Has own ZONE_DMA32 */
    #endif
    Index: linux-2.6.18-rc1-mm1/include/linux/mmzone.h
    ===================================================================
    --- linux-2.6.18-rc1-mm1.orig/include/linux/mmzone.h 2006-07-10 09:37:56.424687226 -0700
    +++ linux-2.6.18-rc1-mm1/include/linux/mmzone.h 2006-07-10 09:49:18.442923919 -0700
    @@ -162,18 +162,33 @@ enum zone_type {
    *
    * NOTE! Make sure this matches the zones in <linux/gfp.h>
    */
    -#define GFP_ZONETYPES ((GFP_ZONEMASK + 1) / 2 + 1) /* Loner */

    #ifdef CONFIG_ZONE_DMA32
    +
    +#ifdef CONFIG_HIGHMEM
    +#define GFP_ZONETYPES ((GFP_ZONEMASK + 1) / 2 + 1) /* Loner */
    #define GFP_ZONEMASK 0x07
    -#define ZONES_SHIFT 2 /* ceil(log2(MAX_NR_ZONES)) */
    +#define ZONES_SHIFT 2 /* ceil(log2(MAX_NR_ZONES)) */
    +#else
    +#define GFP_ZONETYPES ((0x07 + 1) / 2 + 1) /* Loner */
    +/* Mask __GFP_HIGHMEM */
    +#define GFP_ZONEMASK 0x05
    +#define ZONES_SHIFT 2
    +#endif
    +
    #else
    #ifdef CONFIG_HIGHMEM
    +
    #define GFP_ZONEMASK 0x03
    -#define ZONES_SHIFT 2
    +#define ZONES_SHIFT 2
    +#define GFP_ZONETYPES 3
    +
    #else
    +
    #define GFP_ZONEMASK 0x01
    #define ZONES_SHIFT 1
    +#define GFP_ZONETYPES 2
    +
    #endif
    #endif

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-07-10 19:41    [W:0.030 / U:30.480 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site