Merge branch 'vmalloc' of git://git.linaro.org/people/nico/linux into devel-stable
Russell King [Mon, 5 Dec 2011 23:27:54 +0000 (23:27 +0000)]
1  2 
arch/arm/kernel/setup.c
arch/arm/mach-bcmring/dma.c
arch/arm/mach-omap2/io.c
arch/arm/mach-realview/realview_eb.c
arch/arm/mach-realview/realview_pbx.c
arch/arm/mm/nommu.c
arch/arm/plat-omap/include/plat/io.h
include/linux/vmalloc.h
mm/vmalloc.c

diff --combined arch/arm/kernel/setup.c
@@@ -31,6 -31,7 +31,7 @@@
  #include <linux/memblock.h>
  #include <linux/bug.h>
  #include <linux/compiler.h>
+ #include <linux/sort.h>
  
  #include <asm/unified.h>
  #include <asm/cpu.h>
@@@ -461,10 -462,8 +462,10 @@@ static void __init setup_processor(void
               cpu_name, read_cpuid_id(), read_cpuid_id() & 15,
               proc_arch[cpu_architecture()], cr_alignment);
  
 -      sprintf(init_utsname()->machine, "%s%c", list->arch_name, ENDIANNESS);
 -      sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
 +      snprintf(init_utsname()->machine, __NEW_UTS_LEN + 1, "%s%c",
 +               list->arch_name, ENDIANNESS);
 +      snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
 +               list->elf_name, ENDIANNESS);
        elf_hwcap = list->elf_hwcap;
  #ifndef CONFIG_ARM_THUMB
        elf_hwcap &= ~HWCAP_THUMB;
@@@ -890,6 -889,12 +891,12 @@@ static struct machine_desc * __init set
        return mdesc;
  }
  
+ static int __init meminfo_cmp(const void *_a, const void *_b)
+ {
+       const struct membank *a = _a, *b = _b;
+       long cmp = bank_pfn_start(a) - bank_pfn_start(b);
+       return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+ }
  
  void __init setup_arch(char **cmdline_p)
  {
        machine_desc = mdesc;
        machine_name = mdesc->name;
  
 -      if (mdesc->soft_reboot)
 -              reboot_setup("s");
 +      if (mdesc->restart_mode)
 +              reboot_setup(&mdesc->restart_mode);
  
        init_mm.start_code = (unsigned long) _text;
        init_mm.end_code   = (unsigned long) _etext;
  
        parse_early_param();
  
+       sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL);
        sanity_check_meminfo();
        arm_memblock_init(&meminfo, mdesc);
  
        paging_init(mdesc);
        request_standard_resources(mdesc);
  
 +      if (mdesc->restart)
 +              arm_pm_restart = mdesc->restart;
 +
        unflatten_device_tree();
  
  #ifdef CONFIG_SMP
@@@ -36,7 -36,6 +36,7 @@@
  #include <linux/mm.h>
  #include <linux/pfn.h>
  #include <linux/atomic.h>
 +#include <linux/sched.h>
  #include <mach/dma.h>
  
  /* I don't quite understand why dc4 fails when this is set to 1 and DMA is enabled */
@@@ -1615,7 -1614,7 +1615,7 @@@ DMA_MemType_t dma_mem_type(void *addr
  {
        unsigned long addrVal = (unsigned long)addr;
  
-       if (addrVal >= VMALLOC_END) {
+       if (addrVal >= CONSISTENT_BASE) {
                /* NOTE: DMA virtual memory space starts at 0xFFxxxxxx */
  
                /* dma_alloc_xxx pages are physically and virtually contiguous */
diff --combined arch/arm/mach-omap2/io.c
@@@ -35,7 -35,7 +35,7 @@@
  #include "clock3xxx.h"
  #include "clock44xx.h"
  
 -#include <plat/common.h>
 +#include "common.h"
  #include <plat/omap-pm.h>
  #include "voltage.h"
  #include "powerdomain.h"
@@@ -43,7 -43,7 +43,7 @@@
  #include "clockdomain.h"
  #include <plat/omap_hwmod.h>
  #include <plat/multi.h>
 -#include <plat/common.h>
 +#include "common.h"
  
  /*
   * The machine specific code may provide the extra mapping besides the
@@@ -316,10 -316,12 +316,9 @@@ static int _set_hwmod_postsetup_state(s
        return omap_hwmod_set_postsetup_state(oh, *(u8 *)data);
  }
  
  static void __init omap_common_init_early(void)
  {
        omap2_check_revision();
-       omap_ioremap_init();
        omap_init_consistent_dma_size();
  }
  
@@@ -91,8 -91,8 +91,8 @@@ static struct map_desc realview_eb_io_d
  
  static struct map_desc realview_eb11mp_io_desc[] __initdata = {
        {
-               .virtual        = IO_ADDRESS(REALVIEW_EB11MP_GIC_CPU_BASE),
-               .pfn            = __phys_to_pfn(REALVIEW_EB11MP_GIC_CPU_BASE),
+               .virtual        = IO_ADDRESS(REALVIEW_EB11MP_SCU_BASE),
+               .pfn            = __phys_to_pfn(REALVIEW_EB11MP_SCU_BASE),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
        }, {
@@@ -469,7 -469,6 +469,7 @@@ MACHINE_START(REALVIEW_EB, "ARM-RealVie
        .init_early     = realview_init_early,
        .init_irq       = gic_init_irq,
        .timer          = &realview_eb_timer,
 +      .handle_irq     = gic_handle_irq,
        .init_machine   = realview_eb_init,
  #ifdef CONFIG_ZONE_DMA
        .dma_zone_size  = SZ_256M,
@@@ -98,8 -98,8 +98,8 @@@ static struct map_desc realview_pbx_io_
  
  static struct map_desc realview_local_io_desc[] __initdata = {
        {
-               .virtual        = IO_ADDRESS(REALVIEW_PBX_TILE_GIC_CPU_BASE),
-               .pfn            = __phys_to_pfn(REALVIEW_PBX_TILE_GIC_CPU_BASE),
+               .virtual        = IO_ADDRESS(REALVIEW_PBX_TILE_SCU_BASE),
+               .pfn            = __phys_to_pfn(REALVIEW_PBX_TILE_SCU_BASE),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
        }, {
@@@ -399,7 -399,6 +399,7 @@@ MACHINE_START(REALVIEW_PBX, "ARM-RealVi
        .init_early     = realview_init_early,
        .init_irq       = gic_init_irq,
        .timer          = &realview_pbx_timer,
 +      .handle_irq     = gic_handle_irq,
        .init_machine   = realview_pbx_init,
  #ifdef CONFIG_ZONE_DMA
        .dma_zone_size  = SZ_256M,
diff --combined arch/arm/mm/nommu.c
@@@ -29,6 -29,8 +29,8 @@@ void __init arm_mm_memblock_reserve(voi
  
  void __init sanity_check_meminfo(void)
  {
+       phys_addr_t end = bank_phys_end(&meminfo.bank[meminfo.nr_banks - 1]);
+       high_memory = __va(end - 1) + 1;
  }
  
  /*
@@@ -43,7 -45,7 +45,7 @@@ void __init paging_init(struct machine_
  /*
   * We don't need to do anything here for nommu machines.
   */
 -void setup_mm_for_reboot(char mode)
 +void setup_mm_for_reboot(void)
  {
  }
  
   * NOTE: Please use ioremap + __raw_read/write where possible instead of these
   */
  
- void omap_ioremap_init(void);
  extern u8 omap_readb(u32 pa);
  extern u16 omap_readw(u32 pa);
  extern u32 omap_readl(u32 pa);
@@@ -257,15 -255,77 +255,9 @@@ extern void omap_writew(u16 v, u32 pa)
  extern void omap_writel(u32 v, u32 pa);
  
  struct omap_sdrc_params;
  extern void omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
                                      struct omap_sdrc_params *sdrc_cs1);
  
- #define __arch_ioremap        omap_ioremap
- #define __arch_iounmap        omap_iounmap
- void __iomem *omap_ioremap(unsigned long phys, size_t size, unsigned int type);
- void omap_iounmap(volatile void __iomem *addr);
  extern void __init omap_init_consistent_dma_size(void);
  
  #endif
diff --combined include/linux/vmalloc.h
@@@ -119,7 -119,7 +119,7 @@@ unmap_kernel_range(unsigned long addr, 
  #endif
  
  /* Allocate/destroy a 'vmalloc' VM area. */
 -extern struct vm_struct *alloc_vm_area(size_t size);
 +extern struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes);
  extern void free_vm_area(struct vm_struct *area);
  
  /* for /dev/kmem */
@@@ -131,6 -131,7 +131,7 @@@ extern long vwrite(char *buf, char *add
   */
  extern rwlock_t vmlist_lock;
  extern struct vm_struct *vmlist;
+ extern __init void vm_area_add_early(struct vm_struct *vm);
  extern __init void vm_area_register_early(struct vm_struct *vm, size_t align);
  
  #ifdef CONFIG_SMP
diff --combined mm/vmalloc.c
@@@ -1118,6 -1118,32 +1118,32 @@@ void *vm_map_ram(struct page **pages, u
  EXPORT_SYMBOL(vm_map_ram);
  
  /**
+  * vm_area_add_early - add vmap area early during boot
+  * @vm: vm_struct to add
+  *
+  * This function is used to add fixed kernel vm area to vmlist before
+  * vmalloc_init() is called.  @vm->addr, @vm->size, and @vm->flags
+  * should contain proper values and the other fields should be zero.
+  *
+  * DO NOT USE THIS FUNCTION UNLESS YOU KNOW WHAT YOU'RE DOING.
+  */
+ void __init vm_area_add_early(struct vm_struct *vm)
+ {
+       struct vm_struct *tmp, **p;
+       BUG_ON(vmap_initialized);
+       for (p = &vmlist; (tmp = *p) != NULL; p = &tmp->next) {
+               if (tmp->addr >= vm->addr) {
+                       BUG_ON(tmp->addr < vm->addr + vm->size);
+                       break;
+               } else
+                       BUG_ON(tmp->addr + tmp->size > vm->addr);
+       }
+       vm->next = *p;
+       *p = vm;
+ }
+ /**
   * vm_area_register_early - register vmap area early during boot
   * @vm: vm_struct to register
   * @align: requested alignment
@@@ -1139,8 -1165,7 +1165,7 @@@ void __init vm_area_register_early(stru
  
        vm->addr = (void *)addr;
  
-       vm->next = vmlist;
-       vmlist = vm;
+       vm_area_add_early(vm);
  }
  
  void __init vmalloc_init(void)
@@@ -2141,30 -2166,23 +2166,30 @@@ void  __attribute__((weak)) vmalloc_syn
  
  static int f(pte_t *pte, pgtable_t table, unsigned long addr, void *data)
  {
 -      /* apply_to_page_range() does all the hard work. */
 +      pte_t ***p = data;
 +
 +      if (p) {
 +              *(*p) = pte;
 +              (*p)++;
 +      }
        return 0;
  }
  
  /**
   *    alloc_vm_area - allocate a range of kernel address space
   *    @size:          size of the area
 + *    @ptes:          returns the PTEs for the address space
   *
   *    Returns:        NULL on failure, vm_struct on success
   *
   *    This function reserves a range of kernel address space, and
   *    allocates pagetables to map that range.  No actual mappings
 - *    are created.  If the kernel address space is not shared
 - *    between processes, it syncs the pagetable across all
 - *    processes.
 + *    are created.
 + *
 + *    If @ptes is non-NULL, pointers to the PTEs (in init_mm)
 + *    allocated for the VM area are returned.
   */
 -struct vm_struct *alloc_vm_area(size_t size)
 +struct vm_struct *alloc_vm_area(size_t size, pte_t **ptes)
  {
        struct vm_struct *area;
  
         * of kernel virtual address space and mapped into init_mm.
         */
        if (apply_to_page_range(&init_mm, (unsigned long)area->addr,
 -                              area->size, f, NULL)) {
 +                              size, f, ptes ? &ptes : NULL)) {
                free_vm_area(area);
                return NULL;
        }
  
 -      /*
 -       * If the allocated address space is passed to a hypercall
 -       * before being used then we cannot rely on a page fault to
 -       * trigger an update of the page tables.  So sync all the page
 -       * tables here.
 -       */
 -      vmalloc_sync_all();
 -
        return area;
  }
  EXPORT_SYMBOL_GPL(alloc_vm_area);