resources: support allocating space within a region from the top down
authorBjorn Helgaas <bjorn.helgaas@hp.com>
Tue, 26 Oct 2010 21:41:33 +0000 (15:41 -0600)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Tue, 26 Oct 2010 22:33:31 +0000 (15:33 -0700)
commite7f8567db9a7f6b3151b0b275e245c1cef0d9c70
treef04a01581e86ec2b8c175b9f27648679c70d592c
parenta1862e31079149a52b6223776228c3aee493d4a7
resources: support allocating space within a region from the top down

Allocate space from the top of a region first, then work downward,
if an architecture desires this.

When we allocate space from a resource, we look for gaps between children
of the resource.  Previously, we always looked at gaps from the bottom up.
For example, given this:

    [mem 0xbff00000-0xf7ffffff] PCI Bus 0000:00
      [mem 0xbff00000-0xbfffffff] gap -- available
      [mem 0xc0000000-0xdfffffff] PCI Bus 0000:02
      [mem 0xe0000000-0xf7ffffff] gap -- available

we attempted to allocate from the [mem 0xbff00000-0xbfffffff] gap first,
then the [mem 0xe0000000-0xf7ffffff] gap.

With this patch an architecture can choose to allocate from the top gap
[mem 0xe0000000-0xf7ffffff] first.

We can't do this across the board because iomem_resource.end is initialized
to 0xffffffff_ffffffff on 64-bit architectures, and most machines can't
address the entire 64-bit physical address space.  Therefore, we only
allocate top-down if the arch requests it by clearing
"resource_alloc_from_bottom".

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Documentation/kernel-parameters.txt
include/linux/ioport.h
kernel/resource.c