linux-mips
[Top] [All Lists]

Re: weirdness in bootmem_init(), arch/mips64/kernel/setup.c

To: Andrew Clausen <clausen@melbourne.sgi.com>
Subject: Re: weirdness in bootmem_init(), arch/mips64/kernel/setup.c
From: Ralf Baechle <ralf@linux-mips.org>
Date: Tue, 18 Feb 2003 11:42:44 +0100
Cc: Linux-MIPS <linux-mips@linux-mips.org>
In-reply-to: <20030218065427.GA915@pureza.melbourne.sgi.com>; from clausen@melbourne.sgi.com on Tue, Feb 18, 2003 at 05:54:27PM +1100
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <20030218065427.GA915@pureza.melbourne.sgi.com>
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.2.5.1i
On Tue, Feb 18, 2003 at 05:54:27PM +1100, Andrew Clausen wrote:

> This code isn't really relevant to what I'm working on (it isn't compiled
> in to kernels for the ip27), but I just noticed it, and it looks broken:
> 
>         /* Find the highest page frame number we have available.  */
>         max_pfn = 0;
>         for (i = 0; i < boot_mem_map.nr_map; i++) {
>                 unsigned long start, end;
> 
>                 if (boot_mem_map.map[i].type != BOOT_MEM_RAM)
>                         continue;
> 
> *****           start = PFN_UP(boot_mem_map.map[i].addr);
> *****           end = PFN_DOWN(boot_mem_map.map[i].addr
>                       + boot_mem_map.map[i].size);
> 
> *****           if (start >= end)
>                         continue;
>                 if (end > max_pfn)
>                         max_pfn = end;
>         }
> 
> 
> That test looks like it will always succeed... and it looks like the
> author wanted it to be a sanity check.

> Why all this business with PFN_UP and PFN_DOWN?  (They are bit
> shifts... PFN_UP shifts left, PFN_DOWN shifts right)

Read again.  PFN_PHYS is shifting left, the others shift right.

Mm is based on complete pages and page numbers.  This code simply discards
partial pages before initializing mm with the list of available memory.
The case start > end cannot happen but start = end is possible for small
areas near the end of a page - but such an area is not usable for mm so
it's ignored.

  Ralf

<Prev in Thread] Current Thread [Next in Thread>