]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Pull percpu-dtc into release branch
authorTony Luck <tony.luck@intel.com>
Mon, 30 Apr 2007 20:56:00 +0000 (13:56 -0700)
committerTony Luck <tony.luck@intel.com>
Mon, 30 Apr 2007 20:56:00 +0000 (13:56 -0700)
1  2 
arch/ia64/kernel/entry.S
arch/ia64/kernel/setup.c
arch/ia64/kernel/vmlinux.lds.S
arch/ia64/mm/init.c
include/asm-ia64/processor.h

diff --combined arch/ia64/kernel/entry.S
index e7873eeae448c15ec1e6ecb7718974e67bce8786,ac4b304bea30b4b0b7a6be2e188e4d07394b1581..55fd2d5471e127df16d9edb7a54b161bb4255767
@@@ -767,7 -767,7 +767,7 @@@ ENTRY(ia64_leave_syscall
        ld8.fill r15=[r3]                       // M0|1 restore r15
        mov b6=r18                              // I0   restore b6
  
-       addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0 // A
+       LOAD_PHYS_STACK_REG_SIZE(r17)
        mov f9=f0                                       // F    clear f9
  (pKStk) br.cond.dpnt.many skip_rbs_switch             // B
  
        shr.u r18=r19,16                // I0|1 get byte size of existing "dirty" partition
        cover                           // B    add current frame into dirty partition & set cr.ifs
        ;;
- (pUStk) ld4 r17=[r17]                 // M0|1 r17 = cpu_data->phys_stacked_size_p8
        mov r19=ar.bsp                  // M2   get new backing store pointer
        mov f10=f0                      // F    clear f10
  
@@@ -953,9 -952,7 +952,7 @@@ GLOBAL_ENTRY(ia64_leave_kernel
        shr.u r18=r19,16        // get byte size of existing "dirty" partition
        ;;
        mov r16=ar.bsp          // get existing backing store pointer
-       addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0
-       ;;
-       ld4 r17=[r17]           // r17 = cpu_data->phys_stacked_size_p8
+       LOAD_PHYS_STACK_REG_SIZE(r17)
  (pKStk)       br.cond.dpnt skip_rbs_switch
  
        /*
@@@ -1610,7 -1607,5 +1607,7 @@@ sys_call_table
        data8 sys_sync_file_range               // 1300
        data8 sys_tee
        data8 sys_vmsplice
 +      data8 sys_ni_syscall                    // reserved for move_pages
 +      data8 sys_getcpu
  
        .org sys_call_table + 8*NR_syscalls     // guard against failures to increase NR_syscalls
diff --combined arch/ia64/kernel/setup.c
index dc7dd7648ec5fe7490af9fee94b20a2bce5d4690,f167b89f24ebf40c0a0d18a645dbb2fe850d5761..6e19da122ae3a75952513aaa49166f511440c2ac
@@@ -75,7 -75,6 +75,6 @@@ extern void ia64_setup_printk_clock(voi
  
  DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info);
  DEFINE_PER_CPU(unsigned long, local_per_cpu_offset);
- DEFINE_PER_CPU(unsigned long, ia64_phys_stacked_size_p8);
  unsigned long ia64_cycles_per_usec;
  struct ia64_boot_param *ia64_boot_param;
  struct screen_info screen_info;
@@@ -91,6 -90,8 +90,6 @@@ static struct resource code_resource = 
        .name   = "Kernel code",
        .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
  };
 -extern void efi_initialize_iomem_resources(struct resource *,
 -              struct resource *);
  extern char _text[], _end[], _etext[];
  
  unsigned long ia64_max_cacheline_size;
@@@ -249,12 -250,6 +248,12 @@@ reserve_memory (void
        }
  #endif
  
 +#ifdef CONFIG_PROC_VMCORE
 +      if (reserve_elfcorehdr(&rsvd_region[n].start,
 +                             &rsvd_region[n].end) == 0)
 +              n++;
 +#endif
 +
        efi_memmap_init(&rsvd_region[n].start, &rsvd_region[n].end);
        n++;
  
         * appropriate after a kernel panic.
         */
        {
 -              char *from = strstr(saved_command_line, "crashkernel=");
 +              char *from = strstr(boot_command_line, "crashkernel=");
                unsigned long base, size;
                if (from) {
                        size = memparse(from + 12, &from);
@@@ -457,30 -452,6 +456,30 @@@ static int __init parse_elfcorehdr(cha
        return 0;
  }
  early_param("elfcorehdr", parse_elfcorehdr);
 +
 +int __init reserve_elfcorehdr(unsigned long *start, unsigned long *end)
 +{
 +      unsigned long length;
 +
 +      /* We get the address using the kernel command line,
 +       * but the size is extracted from the EFI tables.
 +       * Both address and size are required for reservation
 +       * to work properly.
 +       */
 +
 +      if (elfcorehdr_addr >= ELFCORE_ADDR_MAX)
 +              return -EINVAL;
 +
 +      if ((length = vmcore_find_descriptor_size(elfcorehdr_addr)) == 0) {
 +              elfcorehdr_addr = ELFCORE_ADDR_MAX;
 +              return -EINVAL;
 +      }
 +
 +      *start = (unsigned long)__va(elfcorehdr_addr);
 +      *end = *start + length;
 +      return 0;
 +}
 +
  #endif /* CONFIG_PROC_VMCORE */
  
  void __init
@@@ -491,7 -462,7 +490,7 @@@ setup_arch (char **cmdline_p
        ia64_patch_vtop((u64) __start___vtop_patchlist, (u64) __end___vtop_patchlist);
  
        *cmdline_p = __va(ia64_boot_param->command_line);
 -      strlcpy(saved_command_line, *cmdline_p, COMMAND_LINE_SIZE);
 +      strlcpy(boot_command_line, *cmdline_p, COMMAND_LINE_SIZE);
  
        efi_init();
        io_port_init();
@@@ -597,31 -568,34 +596,31 @@@ show_cpuinfo (struct seq_file *m, void 
                { 1UL << 1, "spontaneous deferral"},
                { 1UL << 2, "16-byte atomic ops" }
        };
 -      char features[128], *cp, sep;
 +      char features[128], *cp, *sep;
        struct cpuinfo_ia64 *c = v;
        unsigned long mask;
        unsigned long proc_freq;
 -      int i;
 +      int i, size;
  
        mask = c->features;
  
        /* build the feature string: */
 -      memcpy(features, " standard", 10);
 +      memcpy(features, "standard", 9);
        cp = features;
 -      sep = 0;
 -      for (i = 0; i < (int) ARRAY_SIZE(feature_bits); ++i) {
 +      size = sizeof(features);
 +      sep = "";
 +      for (i = 0; i < ARRAY_SIZE(feature_bits) && size > 1; ++i) {
                if (mask & feature_bits[i].mask) {
 -                      if (sep)
 -                              *cp++ = sep;
 -                      sep = ',';
 -                      *cp++ = ' ';
 -                      strcpy(cp, feature_bits[i].feature_name);
 -                      cp += strlen(feature_bits[i].feature_name);
 +                      cp += snprintf(cp, size, "%s%s", sep,
 +                                     feature_bits[i].feature_name),
 +                      sep = ", ";
                        mask &= ~feature_bits[i].mask;
 +                      size = sizeof(features) - (cp - features);
                }
        }
 -      if (mask) {
 -              /* print unknown features as a hex value: */
 -              if (sep)
 -                      *cp++ = sep;
 -              sprintf(cp, " 0x%lx", mask);
 +      if (mask && size > 1) {
 +              /* print unknown features as a hex value */
 +              snprintf(cp, size, "%s0x%lx", sep, mask);
        }
  
        proc_freq = cpufreq_quick_get(cpunum);
                   "model name : %s\n"
                   "revision   : %u\n"
                   "archrev    : %u\n"
 -                 "features   :%s\n"   /* don't change this---it _is_ right! */
 +                 "features   : %s\n"
                   "cpu number : %lu\n"
                   "cpu regs   : %u\n"
 -                 "cpu MHz    : %lu.%06lu\n"
 +                 "cpu MHz    : %lu.%03lu\n"
                   "itc MHz    : %lu.%06lu\n"
                   "BogoMIPS   : %lu.%02lu\n",
                   cpunum, c->vendor, c->family, c->model,
@@@ -692,15 -666,12 +691,15 @@@ struct seq_operations cpuinfo_op = 
        .show =         show_cpuinfo
  };
  
 -static char brandname[128];
 +#define MAX_BRANDS    8
 +static char brandname[MAX_BRANDS][128];
  
  static char * __cpuinit
  get_model_name(__u8 family, __u8 model)
  {
 +      static int overflow;
        char brand[128];
 +      int i;
  
        memcpy(brand, "Unknown", 8);
        if (ia64_pal_get_brand_info(brand)) {
                        case 2: memcpy(brand, "Madison up to 9M cache", 23); break;
                }
        }
 -      if (brandname[0] == '\0')
 -              return strcpy(brandname, brand);
 -      else if (strcmp(brandname, brand) == 0)
 -              return brandname;
 -      else
 -              return kstrdup(brand, GFP_KERNEL);
 +      for (i = 0; i < MAX_BRANDS; i++)
 +              if (strcmp(brandname[i], brand) == 0)
 +                      return brandname[i];
 +      for (i = 0; i < MAX_BRANDS; i++)
 +              if (brandname[i][0] == '\0')
 +                      return strcpy(brandname[i], brand);
 +      if (overflow++ == 0)
 +              printk(KERN_ERR
 +                     "%s: Table overflow. Some processor model information will be missing\n",
 +                     __FUNCTION__);
 +      return "Unknown";
  }
  
  static void __cpuinit
@@@ -869,6 -835,7 +868,7 @@@ void __cpuini
  cpu_init (void)
  {
        extern void __cpuinit ia64_mmu_init (void *);
+       static unsigned long max_num_phys_stacked = IA64_NUM_PHYS_STACK_REG;
        unsigned long num_phys_stacked;
        pal_vm_info_2_u_t vmi;
        unsigned int max_ctx;
                num_phys_stacked = 96;
        }
        /* size of physical stacked register partition plus 8 bytes: */
-       __get_cpu_var(ia64_phys_stacked_size_p8) = num_phys_stacked*8 + 8;
+       if (num_phys_stacked > max_num_phys_stacked) {
+               ia64_patch_phys_stack_reg(num_phys_stacked*8 + 8);
+               max_num_phys_stacked = num_phys_stacked;
+       }
        platform_cpu_init();
        pm_idle = default_idle;
  }
index 25dd55e4db2482985e86563599be0f05ec74058b,d9599dcac7871befa866148b78039c1094de9e15..69238264211876fe1f0d506f4cd0cf9c4a5b20a2
@@@ -78,6 -78,13 +78,13 @@@ SECTION
          __stop___mca_table = .;
        }
  
+   .data.patch.phys_stack_reg : AT(ADDR(.data.patch.phys_stack_reg) - LOAD_OFFSET)
+       {
+         __start___phys_stack_reg_patchlist = .;
+         *(.data.patch.phys_stack_reg)
+         __end___phys_stack_reg_patchlist = .;
+       }
    /* Global data */
    _data = .;
  
    .init.data : AT(ADDR(.init.data) - LOAD_OFFSET)
        { *(.init.data) }
  
 +#ifdef CONFIG_BLK_DEV_INITRD
    .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET)
        {
          __initramfs_start = .;
          *(.init.ramfs)
          __initramfs_end = .;
        }
 +#endif
  
     . = ALIGN(16);
    .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET)
        }
  #endif
  
 +  . = ALIGN(8);
     __con_initcall_start = .;
    .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET)
        { *(.con_initcall.init) }
diff --combined arch/ia64/mm/init.c
index 4f36987eea7241bfea99187f0ec5765202426bd1,07d82cd7cbdd6f0a11ee3187f4431b0daee71bb7..5b70241741b4a163233439dd89ca70c04a4a6ddc
@@@ -19,7 -19,6 +19,7 @@@
  #include <linux/swap.h>
  #include <linux/proc_fs.h>
  #include <linux/bitops.h>
 +#include <linux/kexec.h>
  
  #include <asm/a.out.h>
  #include <asm/dma.h>
@@@ -68,7 -67,7 +68,7 @@@ max_pgt_pages(void
  #ifndef       CONFIG_NUMA
        node_free_pages = nr_free_pages();
  #else
 -      node_free_pages = nr_free_pages_pgdat(NODE_DATA(numa_node_id()));
 +      node_free_pages = node_page_state(numa_node_id(), NR_FREE_PAGES);
  #endif
        max_pgt_pages = node_free_pages / PGT_FRACTION_OF_NODE_MEM;
        max_pgt_pages = max(max_pgt_pages, MIN_PGT_PAGES);
@@@ -129,25 -128,6 +129,25 @@@ lazy_mmu_prot_update (pte_t pte
        set_bit(PG_arch_1, &page->flags);       /* mark page as clean */
  }
  
 +/*
 + * Since DMA is i-cache coherent, any (complete) pages that were written via
 + * DMA can be marked as "clean" so that lazy_mmu_prot_update() doesn't have to
 + * flush them when they get mapped into an executable vm-area.
 + */
 +void
 +dma_mark_clean(void *addr, size_t size)
 +{
 +      unsigned long pg_addr, end;
 +
 +      pg_addr = PAGE_ALIGN((unsigned long) addr);
 +      end = (unsigned long) addr + size;
 +      while (pg_addr + PAGE_SIZE <= end) {
 +              struct page *page = virt_to_page(pg_addr);
 +              set_bit(PG_arch_1, &page->flags);
 +              pg_addr += PAGE_SIZE;
 +      }
 +}
 +
  inline void
  ia64_set_rbs_bot (void)
  {
  
        if (stack_size > MAX_USER_STACK_SIZE)
                stack_size = MAX_USER_STACK_SIZE;
 -      current->thread.rbs_bot = STACK_TOP - stack_size;
 +      current->thread.rbs_bot = PAGE_ALIGN(current->mm->start_stack - stack_size);
  }
  
  /*
@@@ -176,8 -156,9 +176,8 @@@ ia64_init_addr_space (void
         * the problem.  When the process attempts to write to the register backing store
         * for the first time, it will get a SEGFAULT in this case.
         */
 -      vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
 +      vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
        if (vma) {
 -              memset(vma, 0, sizeof(*vma));
                vma->vm_mm = current->mm;
                vma->vm_start = current->thread.rbs_bot & PAGE_MASK;
                vma->vm_end = vma->vm_start + PAGE_SIZE;
  
        /* map NaT-page at address zero to speed up speculative dereferencing of NULL: */
        if (!(current->personality & MMAP_PAGE_ZERO)) {
 -              vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
 +              vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
                if (vma) {
 -                      memset(vma, 0, sizeof(*vma));
                        vma->vm_mm = current->mm;
                        vma->vm_end = PAGE_SIZE;
                        vma->vm_page_prot = __pgprot(pgprot_val(PAGE_READONLY) | _PAGE_MA_NAT);
@@@ -355,7 -337,7 +355,7 @@@ setup_gate (void
  void __devinit
  ia64_mmu_init (void *my_cpu_data)
  {
-       unsigned long psr, pta, impl_va_bits;
+       unsigned long pta, impl_va_bits;
        extern void __devinit tlb_init (void);
  
  #ifdef CONFIG_DISABLE_VHPT
  #     define VHPT_ENABLE_BIT  1
  #endif
  
-       /* Pin mapping for percpu area into TLB */
-       psr = ia64_clear_ic();
-       ia64_itr(0x2, IA64_TR_PERCPU_DATA, PERCPU_ADDR,
-                pte_val(pfn_pte(__pa(my_cpu_data) >> PAGE_SHIFT, PAGE_KERNEL)),
-                PERCPU_PAGE_SHIFT);
-       ia64_set_psr(psr);
-       ia64_srlz_i();
        /*
         * Check if the virtually mapped linear page table (VMLPT) overlaps with a mapped
         * address space.  The IA-64 architecture guarantees that at least 50 bits of
@@@ -613,27 -586,13 +604,27 @@@ find_largest_hole (u64 start, u64 end, 
        return 0;
  }
  
 +#endif /* CONFIG_VIRTUAL_MEM_MAP */
 +
  int __init
  register_active_ranges(u64 start, u64 end, void *arg)
  {
 -      add_active_range(0, __pa(start) >> PAGE_SHIFT, __pa(end) >> PAGE_SHIFT);
 +      int nid = paddr_to_nid(__pa(start));
 +
 +      if (nid < 0)
 +              nid = 0;
 +#ifdef CONFIG_KEXEC
 +      if (start > crashk_res.start && start < crashk_res.end)
 +              start = crashk_res.end;
 +      if (end > crashk_res.start && end < crashk_res.end)
 +              end = crashk_res.start;
 +#endif
 +
 +      if (start < end)
 +              add_active_range(nid, __pa(start) >> PAGE_SHIFT,
 +                      __pa(end) >> PAGE_SHIFT);
        return 0;
  }
 -#endif /* CONFIG_VIRTUAL_MEM_MAP */
  
  static int __init
  count_reserved_pages (u64 start, u64 end, void *arg)
        return 0;
  }
  
 +int
 +find_max_min_low_pfn (unsigned long start, unsigned long end, void *arg)
 +{
 +      unsigned long pfn_start, pfn_end;
 +#ifdef CONFIG_FLATMEM
 +      pfn_start = (PAGE_ALIGN(__pa(start))) >> PAGE_SHIFT;
 +      pfn_end = (PAGE_ALIGN(__pa(end - 1))) >> PAGE_SHIFT;
 +#else
 +      pfn_start = GRANULEROUNDDOWN(__pa(start)) >> PAGE_SHIFT;
 +      pfn_end = GRANULEROUNDUP(__pa(end - 1)) >> PAGE_SHIFT;
 +#endif
 +      min_low_pfn = min(min_low_pfn, pfn_start);
 +      max_low_pfn = max(max_low_pfn, pfn_end);
 +      return 0;
 +}
 +
  /*
   * Boot command-line option "nolwsys" can be used to disable the use of any light-weight
   * system call handler.  When this option is in effect, all fsyscalls will end up bubbling
index 4f4ee1c2db2fb8177b12a589fb9b1a512915505e,88c728b9ff4548f4eb3fc731f57cd33b132fff27..db81ba406ceff8b1cb4bd7226741cbdbb2413eb8
@@@ -19,6 -19,7 +19,7 @@@
  #include <asm/ptrace.h>
  #include <asm/ustack.h>
  
+ #define IA64_NUM_PHYS_STACK_REG       96
  #define IA64_NUM_DBG_REGS     8
  
  #define DEFAULT_MAP_BASE      __IA64_UL_CONST(0x2000000000000000)
@@@ -210,7 -211,7 +211,7 @@@ struct desc_struct 
        unsigned int a, b;
  };
  
 -#define desc_empty(desc)              (!((desc)->a + (desc)->b))
 +#define desc_empty(desc)              (!((desc)->a | (desc)->b))
  #define desc_equal(desc1, desc2)      (((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b))
  
  #define GDT_ENTRY_TLS_ENTRIES 3