lkml.org 
[lkml]   [2009]   [Dec]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 15/25] x86: print bootmem free before pci_iommu_alloc and free_all_bootmem
    so we could double check if we have enough low pages later

    -v2: fix errors checkpatch.pl reported

    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    ---
    arch/x86/mm/init_64.c | 2 +
    include/linux/bootmem.h | 2 +
    mm/bootmem.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++
    3 files changed, 96 insertions(+), 0 deletions(-)

    diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
    index 1ea79ad..f9530eb 100644
    --- a/arch/x86/mm/init_64.c
    +++ b/arch/x86/mm/init_64.c
    @@ -654,6 +654,8 @@ void __init mem_init(void)
    long codesize, reservedpages, datasize, initsize;
    unsigned long absent_pages;

    + print_bootmem_free();
    +
    pci_iommu_alloc();

    /* clear_bss() already clear the empty_zero_page */
    diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h
    index b10ec49..3446bed 100644
    --- a/include/linux/bootmem.h
    +++ b/include/linux/bootmem.h
    @@ -55,6 +55,8 @@ extern void free_bootmem_node(pg_data_t *pgdat,
    extern void free_bootmem(unsigned long addr, unsigned long size);
    extern void free_bootmem_late(unsigned long addr, unsigned long size);

    +void print_bootmem_free(void);
    +
    /*
    * Flags for reserve_bootmem (also if CONFIG_HAVE_ARCH_BOOTMEM_NODE,
    * the architecture-specific code should honor this).
    diff --git a/mm/bootmem.c b/mm/bootmem.c
    index 8caf744..954a7e7 100644
    --- a/mm/bootmem.c
    +++ b/mm/bootmem.c
    @@ -268,6 +268,98 @@ static void __init __free(bootmem_data_t *bdata,
    BUG();
    }

    +static void __init print_all_bootmem_free_core(bootmem_data_t *bdata)
    +{
    + int aligned;
    + unsigned long *map;
    + unsigned long start, end, count = 0;
    + unsigned long free_start = -1UL, free_end = 0;
    +
    + if (!bdata->node_bootmem_map)
    + return;
    +
    + start = bdata->node_min_pfn;
    + end = bdata->node_low_pfn;
    +
    + /*
    + * If the start is aligned to the machines wordsize, we might
    + * be able to count it in bulks of that order.
    + */
    + aligned = !(start & (BITS_PER_LONG - 1));
    +
    + printk(KERN_DEBUG "nid=%td start=0x%010lx end=0x%010lx aligned=%d\n",
    + bdata - bootmem_node_data, start, end, aligned);
    + map = bdata->node_bootmem_map;
    +
    + while (start < end) {
    + unsigned long idx, vec;
    +
    + idx = start - bdata->node_min_pfn;
    + vec = ~map[idx / BITS_PER_LONG];
    +
    + if (aligned && vec == ~0UL && start + BITS_PER_LONG < end) {
    + if (free_start == -1UL) {
    + free_start = idx;
    + free_end = free_start + BITS_PER_LONG;
    + } else {
    + if (free_end == idx) {
    + free_end += BITS_PER_LONG;
    + } else {
    + /* there is gap, print old */
    + printk(KERN_DEBUG " free [0x%010lx - 0x%010lx]\n",
    + free_start + bdata->node_min_pfn,
    + free_end + bdata->node_min_pfn);
    + free_start = idx;
    + free_end = idx + BITS_PER_LONG;
    + }
    + }
    + count += BITS_PER_LONG;
    + } else {
    + unsigned long off = 0;
    +
    + while (vec && off < BITS_PER_LONG) {
    + if (vec & 1) {
    + if (free_start == -1UL) {
    + free_start = idx + off;
    + free_end = free_start + 1;
    + } else {
    + if (free_end == (idx + off)) {
    + free_end++;
    + } else {
    + /* there is gap, print old */
    + printk(KERN_DEBUG " free [0x%010lx - 0x%010lx]\n",
    + free_start + bdata->node_min_pfn,
    + free_end + bdata->node_min_pfn);
    + free_start = idx + off;
    + free_end = free_start + 1;
    + }
    + }
    + count++;
    + }
    + vec >>= 1;
    + off++;
    + }
    + }
    + start += BITS_PER_LONG;
    + }
    +
    + /* last one */
    + if (free_start != -1UL)
    + printk(KERN_DEBUG " free [0x%010lx - 0x%010lx]\n",
    + free_start + bdata->node_min_pfn,
    + free_end + bdata->node_min_pfn);
    + printk(KERN_DEBUG " total free 0x%010lx\n", count);
    +}
    +
    +void __init print_bootmem_free(void)
    +{
    + bootmem_data_t *bdata;
    +
    + list_for_each_entry(bdata, &bdata_list, list) {
    + print_all_bootmem_free_core(bdata);
    + }
    +}
    +
    static int __init __reserve(bootmem_data_t *bdata, unsigned long sidx,
    unsigned long eidx, int flags)
    {
    --
    1.6.0.2


    \
     
     \ /
      Last update: 2009-12-23 00:51    [W:2.491 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site