1. 04 8月, 2011 2 次提交
  2. 27 7月, 2011 1 次提交
  3. 24 7月, 2011 2 次提交
  4. 22 7月, 2011 6 次提交
  5. 21 7月, 2011 4 次提交
  6. 16 7月, 2011 1 次提交
  7. 15 7月, 2011 6 次提交
  8. 14 7月, 2011 4 次提交
  9. 13 7月, 2011 4 次提交
  10. 11 7月, 2011 2 次提交
    • N
      x86, ioapic: Also print Dest field · 7fece832
      Naga Chumbalkar 提交于
      The code in setup_ioapic_irq() determines the Destination Field,
      so why not also include it in the debug printk output that gets
      displayed when the boot parameter "apic=debug" is used.
      
      Before the change, "dmesg" will show:
      
       IOAPIC[0]: Set routing entry (8-1 -> 0x31 -> IRQ 1 Mode:0 Active:0)
       IOAPIC[0]: Set routing entry (8-2 -> 0x30 -> IRQ 0 Mode:0 Active:0)
       IOAPIC[0]: Set routing entry (8-3 -> 0x33 -> IRQ 3 Mode:0 Active:0) ...
      
      After the change, you will see:
      
       IOAPIC[0]: Set routing entry (8-1 -> 0x31 -> IRQ 1 Mode:0 Active:0 Dest:0)
       IOAPIC[0]: Set routing entry (8-2 -> 0x30 -> IRQ 0 Mode:0 Active:0 Dest:0)
       IOAPIC[0]: Set routing entry (8-3 -> 0x33 -> IRQ 3 Mode:0 Active:0 Dest:0) ...
      Signed-off-by: NNaga Chumbalkar <nagananda.chumbalkar@hp.com>
      Link: http://lkml.kernel.org/r/20110708184603.2734.91071.sendpatchset@nchumbalkar.americas.cpqcorp.netSigned-off-by: NIngo Molnar <mingo@elte.hu>
      7fece832
    • N
      x86, ioapic: Format clean up for IOAPIC output · bd6a46e0
      Naga Chumbalkar 提交于
      When IOAPIC data is displayed in "dmesg" with the help of the
      boot parameter "apic=debug" certain values are not formatted
      correctly wrt their size.
      
      In the "dmesg" snippet below, note that the output for "max
      redirection entries", and "IO APIC version" which are each
      defined to be just 8-bits long are displayed as 2 bytes in
      length. Similarly, "Dst" under the "IRQ redirection table"
      should only be 8-bits long.
      
      IO APIC #0......
      ...
      ...
      .... register #01: 00170020
      .......     : max redirection entries: 0017
      .......     : PRQ implemented: 0
      .......     : IO APIC version: 0020
      ...
      ...
      .... IRQ redirection table:
       NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:
       00 000 1    0    0   0   0    0    0    00
       01 000 0    0    0   0   0    0    0    31
       02 000 0    0    0   0   0    0    0    30
       03 000 1    0    0   0   0    0    0    33
      ...
      ...
      
      Do some formatting clean up, so you will see output like below:
      
      IO APIC #0......
      ...
      ...
      .... register #01: 00170020
      .......     : max redirection entries: 17
      .......     : PRQ implemented: 0
      .......     : IO APIC version: 20
      ...
      ...
      .... IRQ redirection table:
       NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:
       00 00  1    0    0   0   0    0    0    00
       01 00  0    0    0   0   0    0    0    31
       02 00  0    0    0   0   0    0    0    30
       03 00  1    0    0   0   0    0    0    33
      ...
      ...
      Signed-off-by: NNaga Chumbalkar <nagananda.chumbalkar@hp.com>
      Link: http://lkml.kernel.org/r/20110708184557.2734.61830.sendpatchset@nchumbalkar.americas.cpqcorp.netSigned-off-by: NIngo Molnar <mingo@elte.hu>
      bd6a46e0
  11. 09 7月, 2011 2 次提交
  12. 08 7月, 2011 1 次提交
    • N
      x86: print APIC data a little later during boot · ded1f6ab
      Naga Chumbalkar 提交于
      To view IOAPIC data you could boot with "apic=debug".
      
      When booting in such a way then the kernel will dump the
      IO-APIC's registers, for example:
      
      NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:
       00 000 1    0    0   0   0    0    0    00
       01 000 0    0    0   0   0    0    0    31
       02 000 0    0    0   0   0    0    0    30
       03 000 0    0    0   0   0    0    0    33
       04 000 0    0    0   0   0    0    0    34
       05 000 0    0    0   0   0    0    0    35
       06 000 0    0    0   0   0    0    0    36
       07 000 0    0    0   0   0    0    0    37
       08 000 0    0    0   0   0    0    0    38
       09 000 0    1    0   0   0    0    0    39
       0a 000 0    0    0   0   0    0    0    3A
       0b 000 0    0    0   0   0    0    0    3B
       0c 000 0    0    0   0   0    0    0    3C
       0d 000 0    0    0   0   0    0    0    3D
       0e 000 0    0    0   0   0    0    0    3E
       0f 000 0    0    0   0   0    0    0    3F
       10 000 1    0    0   0   0    0    0    00
       11 000 1    0    0   0   0    0    0    00
       12 000 1    0    0   0   0    0    0    00
       13 000 1    0    0   0   0    0    0    00
       14 000 1    0    0   0   0    0    0    00
       15 000 1    0    0   0   0    0    0    00
       16 000 1    0    0   0   0    0    0    00
       17 000 1    0    0   0   0    0    0    00
      
      Delaying the call to print_ICs() gives better results:
      
      NR Dst Mask Trig IRR Pol Stat Dmod Deli Vect:
       00 000 1    0    0   0   0    0    0    00
       01 000 0    0    0   0   0    0    0    31
       02 000 0    0    0   0   0    0    0    30
       03 000 1    0    0   0   0    0    0    33
       04 000 1    0    0   0   0    0    0    34
       05 000 1    0    0   0   0    0    0    35
       06 000 1    0    0   0   0    0    0    36
       07 000 1    0    0   0   0    0    0    37
       08 000 0    0    0   0   0    0    0    38
       09 000 0    1    0   0   0    0    0    39
       0a 000 1    0    0   0   0    0    0    3A
       0b 000 1    0    0   0   0    0    0    3B
       0c 000 0    0    0   0   0    0    0    3C
       0d 000 1    0    0   0   0    0    0    3D
       0e 000 1    0    0   0   0    0    0    3E
       0f 000 1    0    0   0   0    0    0    3F
       10 000 1    1    0   1   0    0    0    29
       11 000 1    0    0   0   0    0    0    00
       12 000 1    0    0   0   0    0    0    00
       13 000 1    0    0   0   0    0    0    00
       14 000 0    1    0   1   0    0    0    51
       15 000 1    0    0   0   0    0    0    00
       16 000 0    1    0   1   0    0    0    61
       17 000 0    1    0   1   0    0    0    59
      
      Notice that the entries beyond interrupt input signal 0x0f also
      get populated and arent just the hw-initialization default of
      all zeroes.
      Signed-off-by: NNaga Chumbalkar <nagananda.chumbalkar@hp.com>
      Link: http://lkml.kernel.org/r/20110708083555.2598.42216.sendpatchset@nchumbalkar.americas.hpqcorp.netSigned-off-by: NIngo Molnar <mingo@elte.hu>
      ded1f6ab
  13. 07 7月, 2011 1 次提交
    • K
      x86, suspend: Restore MISC_ENABLE MSR in realmode wakeup · 7a313666
      Kees Cook 提交于
      Some BIOSes will reset the Intel MISC_ENABLE MSR (specifically the
      XD_DISABLE bit) when resuming from S3, which can interact poorly with
      ebba638a. In 32bit PAE mode, this can
      lead to a fault when EFER is restored by the kernel wakeup routines,
      due to it setting the NX bit for a CPU that (thanks to the BIOS reset)
      now incorrectly thinks it lacks the NX feature. (64bit is not affected
      because it uses a common CPU bring-up that specifically handles the
      XD_DISABLE bit.)
      
      The need for MISC_ENABLE being restored so early is specific to the S3
      resume path. Normally, MISC_ENABLE is saved in save_processor_state(),
      but this happens after the resume header is created, so just reproduce
      the logic here. (acpi_suspend_lowlevel() creates the header, calls
      do_suspend_lowlevel, which calls save_processor_state(), so the saved
      processor context isn't available during resume header creation.)
      
      [ hpa: Consider for stable if OK in mainline ]
      Signed-off-by: NKees Cook <kees.cook@canonical.com>
      Link: http://lkml.kernel.org/r/20110707011034.GA8523@outflux.netSigned-off-by: NH. Peter Anvin <hpa@zytor.com>
      Cc: Rafael J. Wysocki <rjw@sisk.pl>
      Cc: <stable@kernel.org> 2.6.38+
      7a313666
  14. 06 7月, 2011 1 次提交
  15. 03 7月, 2011 3 次提交
    • F
      x86: Don't use frame pointer to save old stack on irq entry · a2bbe750
      Frederic Weisbecker 提交于
      rbp is used in SAVE_ARGS_IRQ to save the old stack pointer
      in order to restore it later in ret_from_intr.
      
      It is convenient because we save its value in the irq regs
      and it's easily restored using the leave instruction.
      
      However this is a kind of abuse of the frame pointer which
      role is to help unwinding the kernel by chaining frames
      together, each node following the return address to the
      previous frame.
      
      But although we are breaking the frame by changing the stack
      pointer, there is no preceding return address before the new
      frame. Hence using the frame pointer to link the two stacks
      breaks the stack unwinders that find a random value instead of
      a return address here.
      
      There is no workaround that can work in every case. We are using
      the fixup_bp_irq_link() function to dereference that abused frame
      pointer in the case of non nesting interrupt (which means stack
      changed).
      But that doesn't fix the case of interrupts that don't change the
      stack (but we still have the unconditional frame link), which is
      the case of hardirq interrupting softirq. We have no way to detect
      this transition so the frame irq link is considered as a real frame
      pointer and the return address is dereferenced but it is still a
      spurious one.
      
      There are two possible results of this: either the spurious return
      address, a random stack value, luckily belongs to the kernel text
      and then the unwinding can continue and we just have a weird entry
      in the stack trace. Or it doesn't belong to the kernel text and
      unwinding stops there.
      
      This is the reason why stacktraces (including perf callchains) on
      irqs that interrupted softirqs don't work very well.
      
      To solve this, we don't save the old stack pointer on rbp anymore
      but we save it to a scratch register that we push on the new
      stack and that we pop back later on irq return.
      
      This preserves the whole frame chain without spurious return addresses
      in the middle and drops the need for the horrid fixup_bp_irq_link()
      workaround.
      
      And finally irqs that interrupt softirq are sanely unwinded.
      
      Before:
      
          99.81%         perf  [kernel.kallsyms]  [k] perf_pending_event
                         |
                         --- perf_pending_event
                             irq_work_run
                             smp_irq_work_interrupt
                             irq_work_interrupt
                            |
                            |--41.60%-- __read
                            |          |
                            |          |--99.90%-- create_worker
                            |          |          bench_sched_messaging
                            |          |          cmd_bench
                            |          |          run_builtin
                            |          |          main
                            |          |          __libc_start_main
                            |           --0.10%-- [...]
      
      After:
      
           1.64%  swapper  [kernel.kallsyms]  [k] perf_pending_event
                  |
                  --- perf_pending_event
                      irq_work_run
                      smp_irq_work_interrupt
                      irq_work_interrupt
                     |
                     |--95.00%-- arch_irq_work_raise
                     |          irq_work_queue
                     |          __perf_event_overflow
                     |          perf_swevent_overflow
                     |          perf_swevent_event
                     |          perf_tp_event
                     |          perf_trace_softirq
                     |          __do_softirq
                     |          call_softirq
                     |          do_softirq
                     |          irq_exit
                     |          |
                     |          |--73.68%-- smp_apic_timer_interrupt
                     |          |          apic_timer_interrupt
                     |          |          |
                     |          |          |--96.43%-- amd_e400_idle
                     |          |          |          cpu_idle
                     |          |          |          start_secondary
      Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Jan Beulich <JBeulich@novell.com>
      a2bbe750
    • F
      x86: Remove useless unwinder backlink from irq regs saving · 48ffee7d
      Frederic Weisbecker 提交于
      The unwinder backlink in interrupt entry is very useless.
      It's actually not part of the stack frame chain and thus is
      never used.
      Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Jan Beulich <JBeulich@novell.com>
      48ffee7d
    • F
      x86,64: Separate arg1 from rbp handling in SAVE_REGS_IRQ · 3b99a3ef
      Frederic Weisbecker 提交于
      Just for clarity in the code. Have a first block that handles
      the frame pointer and a separate one that handles pt_regs
      pointer and its use.
      Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Jan Beulich <JBeulich@novell.com>
      3b99a3ef