1. 18 11月, 2008 1 次提交
    • Y
      x86: fix wakeup_cpu with numaq/es7000, v2 · 569712b2
      Yinghai Lu 提交于
      Impact: fix secondary-CPU wakeup/init path with numaq and es7000
      
      While looking at wakeup_secondary_cpu for WAKE_SECONDARY_VIA_NMI:
      
      |#ifdef WAKE_SECONDARY_VIA_NMI
      |/*
      | * Poke the other CPU in the eye via NMI to wake it up. Remember that the normal
      | * INIT, INIT, STARTUP sequence will reset the chip hard for us, and this
      | * won't ... remember to clear down the APIC, etc later.
      | */
      |static int __devinit
      |wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip)
      |{
      |        unsigned long send_status, accept_status = 0;
      |        int maxlvt;
      |...
      |        if (APIC_INTEGRATED(apic_version[phys_apicid])) {
      |                maxlvt = lapic_get_maxlvt();
      
      I noticed that there is no warning about undefined phys_apicid...
      
      because WAKE_SECONDARY_VIA_NMI and WAKE_SECONDARY_VIA_INIT can not be
      defined at the same time. So NUMAQ is using wrong wakeup_secondary_cpu.
      
      WAKE_SECONDARY_VIA_NMI, WAKE_SECONDARY_VIA_INIT and
      WAKE_SECONDARY_VIA_MIP are variants of a weird and fragile
      preprocessor-driven "HAL" mechanisms to specify the kind of secondary-CPU
      wakeup strategy a given x86 kernel will use.
      
      The vast majority of systems want to use INIT for secondary wakeup - NUMAQ
      uses an NMI, (old-style-) ES7000 uses 'MIP' (a firmware driven in-memory
      flag to let secondaries continue).
      
      So convert these mechanisms to x86_quirks and add a
      ->wakeup_secondary_cpu() method to specify the rare exception
      to the sane default.
      
      Extend genapic accordingly as well, for 32-bit.
      
      While looking further, I noticed that functions in wakecup.h for numaq
      and es7000 are different to the default in mach_wakecpu.h - but smpboot.c
      will only use default mach_wakecpu.h with smphook.h.
      
      So we need to add mach_wakecpu.h for mach_generic, to properly support
      numaq and es7000, and vectorize the following SMP init methods:
      
      	int trampoline_phys_low;
      	int trampoline_phys_high;
      	void (*wait_for_init_deassert)(atomic_t *deassert);
      	void (*smp_callin_clear_local_apic)(void);
      	void (*store_NMI_vector)(unsigned short *high, unsigned short *low);
      	void (*restore_NMI_vector)(unsigned short *high, unsigned short *low);
      	void (*inquire_remote_apic)(int apicid);
      Signed-off-by: NYinghai Lu <yinghai@kernel.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      569712b2
  2. 28 10月, 2008 1 次提交
  3. 23 10月, 2008 1 次提交
  4. 26 7月, 2008 1 次提交
  5. 23 7月, 2008 1 次提交
    • V
      x86: consolidate header guards · 77ef50a5
      Vegard Nossum 提交于
      This patch is the result of an automatic script that consolidates the
      format of all the headers in include/asm-x86/.
      
      The format:
      
      1. No leading underscore. Names with leading underscores are reserved.
      2. Pathname components are separated by two underscores. So we can
         distinguish between mm_types.h and mm/types.h.
      3. Everything except letters and numbers are turned into single
         underscores.
      Signed-off-by: NVegard Nossum <vegard.nossum@gmail.com>
      77ef50a5
  6. 11 10月, 2007 1 次提交
  7. 19 8月, 2007 1 次提交
    • S
      i386: Fix a couple busy loops in mach_wakecpu.h:wait_for_init_deassert() · 62be9001
      Satyam Sharma 提交于
      Use cpu_relax() in the busy loops, as atomic_read() doesn't automatically
      imply volatility for i386 and x86_64. x86_64 doesn't have this issue because
      it open-codes the while loop in smpboot.c:smp_callin() itself that already
      uses cpu_relax().
      
      For i386, however, smpboot.c:smp_callin() calls wait_for_init_deassert()
      which is buggy for mach-default and mach-es7000 cases.
      
      [ I test-built a kernel -- smp_callin() itself got inlined in its only
        callsite, smpboot.c:start_secondary() -- and the relevant piece of
        code disassembles to the following:
      
      0xc1019704 <start_secondary+12>:        mov    0xc144c4c8,%eax
      0xc1019709 <start_secondary+17>:        test   %eax,%eax
      0xc101970b <start_secondary+19>:        je     0xc1019709 <start_secondary+17>
      
        init_deasserted (at 0xc144c4c8) gets fetched into %eax only once and
        then we loop over the test of the stale value in the register only,
        so these look like real bugs to me. With the fix below, this becomes:
      
      0xc1019706 <start_secondary+14>:        pause
      0xc1019708 <start_secondary+16>:        cmpl   $0x0,0xc144c4c8
      0xc101970f <start_secondary+23>:        je     0xc1019706 <start_secondary+14>
      
        which looks nice and healthy. ]
      
      Thanks to Heiko Carstens for noticing this.
      Signed-off-by: NSatyam Sharma <satyam@infradead.org>
      Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      62be9001
  8. 17 4月, 2005 1 次提交
    • L
      Linux-2.6.12-rc2 · 1da177e4
      Linus Torvalds 提交于
      Initial git repository build. I'm not bothering with the full history,
      even though we have it. We can create a separate "historical" git
      archive of that later if we want to, and in the meantime it's about
      3.2GB when imported into git - space that would just make the early
      git days unnecessarily complicated, when we don't have a lot of good
      infrastructure for it.
      
      Let it rip!
      1da177e4