lkml.org 
[lkml]   [2006]   [Mar]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRE: [Patch] Move swiotlb_init early on X86_64
    From
    Date
    On Thu, 2006-03-02 at 17:09, Zhang, Yanmin wrote:
    > >>-----Original Message-----
    > >>From: linux-kernel-owner@vger.kernel.org [mailto:linux-kernel-owner@vger.kernel.org] On Behalf Of Zou Nan hai
    > >>Sent: 2006年3月2日 12:33
    > >>
    > >>Really, then how about the following patch?
    > >>
    > >>Let normal bootmem allocator go above 4G first.
    > >>This will save more memory with address less than 4G.
    > >>
    > >>Signed-off-by: Zou Nan hai <nanhai.zou@intel.com>
    > >>
    > >>--- linux-2.6.16-rc5/mm/bootmem.c 2006-03-03 08:31:52.000000000 +0800
    > >>+++ b/mm/bootmem.c 2006-03-03 09:05:17.000000000 +0800
    > >>@@ -381,16 +381,24 @@ unsigned long __init free_all_bootmem (v
    > >> return(free_all_bootmem_core(NODE_DATA(0)));
    > >> }
    > >>
    > >>+#define LOW32LIMIT 0xffffffff
    > >>+
    > >> void * __init __alloc_bootmem(unsigned long size, unsigned long align, unsigned long goal)
    > >> {
    > >> pg_data_t *pgdat = pgdat_list;
    > >> void *ptr;
    > >>
    > >>+ if (goal < LOW32LIMIT) {
    > On i386, above is always true.
    >
    >

    Ok, I modified the patch.

    On single node SMP System with large physical memory,
    allocation from bootmem allocator like memmap and vfs_cache
    may eat up usable memory under 4G, then software I/O TLB will not be able to allocate bounce buffer.

    This patch modify the bootmem allocator,
    let normal bootmem allocation on 64 bit system first go above 4G
    address.

    Signed-off-by: Zou Nan hai <nanhai.zou@intel.com>

    --- linux-2.6.16-rc5/mm/bootmem.c 2006-03-03 08:31:52.000000000 +0800
    +++ b/mm/bootmem.c 2006-03-04 03:48:55.000000000 +0800
    @@ -381,16 +381,25 @@ unsigned long __init free_all_bootmem (v
    return(free_all_bootmem_core(NODE_DATA(0)));
    }

    +#define LOW32LIMIT 0xffffffff
    +
    void * __init __alloc_bootmem(unsigned long size, unsigned long align, unsigned long goal)
    {
    pg_data_t *pgdat = pgdat_list;
    void *ptr;

    +#if (BITS_PER_LONG == 64)
    + if (goal < LOW32LIMIT) {
    + for_each_pgdat(pgdat)
    + if ((ptr = __alloc_bootmem_core(pgdat->bdata, size,
    + align, LOW32LIMIT, 0)))
    + return(ptr);
    + }
    +#endif
    for_each_pgdat(pgdat)
    if ((ptr = __alloc_bootmem_core(pgdat->bdata, size,
    align, goal, 0)))
    return(ptr);
    -
    /*
    * Whoops, we cannot satisfy the allocation request.
    */
    @@ -404,6 +413,14 @@ void * __init __alloc_bootmem_node(pg_da
    unsigned long goal)
    {
    void *ptr;
    +#if (BITS_PER_LONG == 64)
    + if (goal < LOW32LIMIT) {
    + ptr = __alloc_bootmem_core(pgdat->bdata, size, align,
    + LOW32LIMIT, 0);
    + if (ptr)
    + return (ptr);
    + }
    +#endif

    ptr = __alloc_bootmem_core(pgdat->bdata, size, align, goal, 0);
    if (ptr)
    @@ -412,7 +429,6 @@ void * __init __alloc_bootmem_node(pg_da
    return __alloc_bootmem(size, align, goal);
    }

    -#define LOW32LIMIT 0xffffffff

    void * __init __alloc_bootmem_low(unsigned long size, unsigned long align, unsigned long goal)
    {







    -
    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-03-03 02:18    [W:0.029 / U:0.176 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site