Merge commit 'v2.6.29-rc8' into cpus4096
Ingo Molnar [Fri, 13 Mar 2009 04:54:43 +0000 (05:54 +0100)]
1  2 
Makefile
arch/sparc/kernel/irq_64.c
arch/x86/mm/pageattr.c
include/linux/sched.h

diff --combined Makefile
+++ b/Makefile
@@@ -1,7 -1,7 +1,7 @@@
  VERSION = 2
  PATCHLEVEL = 6
  SUBLEVEL = 29
- EXTRAVERSION = -rc7
+ EXTRAVERSION = -rc8
  NAME = Erotic Pickled Herring
  
  # *DOCUMENTATION*
@@@ -533,9 -533,8 +533,9 @@@ KBUILD_CFLAGS += $(call cc-option,-Wfra
  endif
  
  # Force gcc to behave correct even for buggy distributions
 -# Arch Makefiles may override this setting
 +ifndef CONFIG_CC_STACKPROTECTOR
  KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
 +endif
  
  ifdef CONFIG_FRAME_POINTER
  KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
@@@ -905,12 -904,18 +905,18 @@@ localver = $(subst $(space),, $(string
  # and if the SCM is know a tag from the SCM is appended.
  # The appended tag is determined by the SCM used.
  #
- # Currently, only git is supported.
- # Other SCMs can edit scripts/setlocalversion and add the appropriate
- # checks as needed.
+ # .scmversion is used when generating rpm packages so we do not loose
+ # the version information from the SCM when we do the build of the kernel
+ # from the copied source
  ifdef CONFIG_LOCALVERSION_AUTO
-       _localver-auto = $(shell $(CONFIG_SHELL) \
-                         $(srctree)/scripts/setlocalversion $(srctree))
+ ifeq ($(wildcard .scmversion),)
+         _localver-auto = $(shell $(CONFIG_SHELL) \
+                          $(srctree)/scripts/setlocalversion $(srctree))
+ else
+         _localver-auto = $(shell cat .scmversion 2> /dev/null)
+ endif
        localver-auto  = $(LOCALVERSION)$(_localver-auto)
  endif
  
@@@ -1538,7 -1543,7 +1544,7 @@@ quiet_cmd_depmod = DEPMOD  $(KERNELRELE
        cmd_depmod = \
        if [ -r System.map -a -x $(DEPMOD) ]; then                              \
                $(DEPMOD) -ae -F System.map                                     \
-               $(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) -r)   \
+               $(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) )     \
                $(KERNELRELEASE);                                               \
        fi
  
@@@ -252,10 -252,9 +252,10 @@@ struct irq_handler_data 
  #ifdef CONFIG_SMP
  static int irq_choose_cpu(unsigned int virt_irq)
  {
 -      cpumask_t mask = irq_desc[virt_irq].affinity;
 +      cpumask_t mask;
        int cpuid;
  
 +      cpumask_copy(&mask, irq_desc[virt_irq].affinity);
        if (cpus_equal(mask, CPU_MASK_ALL)) {
                static int irq_rover;
                static DEFINE_SPINLOCK(irq_rover_lock);
@@@ -324,17 -323,25 +324,25 @@@ static void sun4u_set_affinity(unsigne
        sun4u_irq_enable(virt_irq);
  }
  
+ /* Don't do anything.  The desc->status check for IRQ_DISABLED in
+  * handler_irq() will skip the handler call and that will leave the
+  * interrupt in the sent state.  The next ->enable() call will hit the
+  * ICLR register to reset the state machine.
+  *
+  * This scheme is necessary, instead of clearing the Valid bit in the
+  * IMAP register, to handle the case of IMAP registers being shared by
+  * multiple INOs (and thus ICLR registers).  Since we use a different
+  * virtual IRQ for each shared IMAP instance, the generic code thinks
+  * there is only one user so it prematurely calls ->disable() on
+  * free_irq().
+  *
+  * We have to provide an explicit ->disable() method instead of using
+  * NULL to get the default.  The reason is that if the generic code
+  * sees that, it also hooks up a default ->shutdown method which
+  * invokes ->mask() which we do not want.  See irq_chip_set_defaults().
+  */
  static void sun4u_irq_disable(unsigned int virt_irq)
  {
-       struct irq_handler_data *data = get_irq_chip_data(virt_irq);
-       if (likely(data)) {
-               unsigned long imap = data->imap;
-               unsigned long tmp = upa_readq(imap);
-               tmp &= ~IMAP_VALID;
-               upa_writeq(tmp, imap);
-       }
  }
  
  static void sun4u_irq_eoi(unsigned int virt_irq)
@@@ -747,7 -754,8 +755,8 @@@ void handler_irq(int irq, struct pt_reg
  
                desc = irq_desc + virt_irq;
  
-               desc->handle_irq(virt_irq, desc);
+               if (!(desc->status & IRQ_DISABLED))
+                       desc->handle_irq(virt_irq, desc);
  
                bucket_pa = next_pa;
        }
@@@ -797,7 -805,7 +806,7 @@@ void fixup_irqs(void
                    !(irq_desc[irq].status & IRQ_PER_CPU)) {
                        if (irq_desc[irq].chip->set_affinity)
                                irq_desc[irq].chip->set_affinity(irq,
 -                                      &irq_desc[irq].affinity);
 +                                      irq_desc[irq].affinity);
                }
                spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
        }
diff --combined arch/x86/mm/pageattr.c
@@@ -482,13 -482,6 +482,13 @@@ static int split_large_page(pte_t *kpte
        pbase = (pte_t *)page_address(base);
        paravirt_alloc_pte(&init_mm, page_to_pfn(base));
        ref_prot = pte_pgprot(pte_clrhuge(*kpte));
 +      /*
 +       * If we ever want to utilize the PAT bit, we need to
 +       * update this function to make sure it's converted from
 +       * bit 12 to bit 7 when we cross from the 2MB level to
 +       * the 4K level:
 +       */
 +      WARN_ON_ONCE(pgprot_val(ref_prot) & _PAGE_PAT_LARGE);
  
  #ifdef CONFIG_X86_64
        if (level == PG_LEVEL_1G) {
         * primary protection behavior:
         */
        __set_pmd_pte(kpte, address, mk_pte(base, __pgprot(_KERNPG_TABLE)));
+       /*
+        * Intel Atom errata AAH41 workaround.
+        *
+        * The real fix should be in hw or in a microcode update, but
+        * we also probabilistically try to reduce the window of having
+        * a large TLB mixed with 4K TLBs while instruction fetches are
+        * going on.
+        */
+       __flush_tlb_all();
        base = NULL;
  
  out_unlock:
diff --combined include/linux/sched.h
@@@ -1178,9 -1178,10 +1178,9 @@@ struct task_struct 
        pid_t pid;
        pid_t tgid;
  
 -#ifdef CONFIG_CC_STACKPROTECTOR
        /* Canary value for the -fstack-protector gcc feature */
        unsigned long stack_canary;
 -#endif
 +
        /* 
         * pointers to (original) parent process, youngest child, younger sibling,
         * older sibling, respectively.  (p->father can be replaced with 
  #endif
  };
  
+ /* Future-safe accessor for struct task_struct's cpus_allowed. */
+ #define tsk_cpumask(tsk) (&(tsk)->cpus_allowed)
  /*
   * Priority of a process goes from 0..MAX_PRIO-1, valid RT
   * priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
@@@ -2086,19 -2090,6 +2089,19 @@@ static inline int object_is_on_stack(vo
  
  extern void thread_info_cache_init(void);
  
 +#ifdef CONFIG_DEBUG_STACK_USAGE
 +static inline unsigned long stack_not_used(struct task_struct *p)
 +{
 +      unsigned long *n = end_of_stack(p);
 +
 +      do {    /* Skip over canary */
 +              n++;
 +      } while (!*n);
 +
 +      return (unsigned long)n - (unsigned long)end_of_stack(p);
 +}
 +#endif
 +
  /* set thread flags in other task's structures
   * - see asm/thread_info.h for TIF_xxxx flags available
   */