1. 19 2月, 2011 8 次提交
  2. 04 10月, 2010 3 次提交
  3. 15 12月, 2009 1 次提交
  4. 04 12月, 2009 1 次提交
  5. 08 11月, 2009 1 次提交
    • Y
      genirq: try_one_irq() must be called with irq disabled · e7e7e0c0
      Yong Zhang 提交于
      Prarit reported:
      =================================
      [ INFO: inconsistent lock state ]
      2.6.32-rc5 #1
      ---------------------------------
      inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage.
      swapper/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
       (&irq_desc_lock_class){?.-...}, at: [<ffffffff810c264e>] try_one_irq+0x32/0x138
      {IN-HARDIRQ-W} state was registered at:
       [<ffffffff81095160>] __lock_acquire+0x2fc/0xd5d
       [<ffffffff81095cb4>] lock_acquire+0xf3/0x12d
       [<ffffffff814cdadd>] _spin_lock+0x40/0x89
       [<ffffffff810c3389>] handle_level_irq+0x30/0x105
       [<ffffffff81014e0e>] handle_irq+0x95/0xb7
       [<ffffffff810141bd>] do_IRQ+0x6a/0xe0
       [<ffffffff81012813>] ret_from_intr+0x0/0x16
      irq event stamp: 195096
      hardirqs last  enabled at (195096): [<ffffffff814cd7f7>] _spin_unlock_irq+0x3a/0x5c
      hardirqs last disabled at (195095): [<ffffffff814cdbdd>] _spin_lock_irq+0x29/0x95
      softirqs last  enabled at (195088): [<ffffffff81068c92>] __do_softirq+0x1c1/0x1ef
      softirqs last disabled at (195093): [<ffffffff8101304c>] call_softirq+0x1c/0x30
      
      other info that might help us debug this:
      1 lock held by swapper/0:
       #0:  (kernel/irq/spurious.c:21){+.-...}, at: [<ffffffff81070cf2>]
      run_timer_softirq+0x1a9/0x315
      
      stack backtrace:
      Pid: 0, comm: swapper Not tainted 2.6.32-rc5 #1
      Call Trace:
       <IRQ>  [<ffffffff81093e94>] valid_state+0x187/0x1ae
       [<ffffffff81093fe4>] mark_lock+0x129/0x253
       [<ffffffff810951d4>] __lock_acquire+0x370/0xd5d
       [<ffffffff81095cb4>] lock_acquire+0xf3/0x12d
       [<ffffffff814cdadd>] _spin_lock+0x40/0x89
       [<ffffffff810c264e>] try_one_irq+0x32/0x138
       [<ffffffff810c2795>] poll_all_shared_irqs+0x41/0x6d
       [<ffffffff810c27dd>] poll_spurious_irqs+0x1c/0x49
       [<ffffffff81070d82>] run_timer_softirq+0x239/0x315
       [<ffffffff81068bd3>] __do_softirq+0x102/0x1ef
       [<ffffffff8101304c>] call_softirq+0x1c/0x30
       [<ffffffff81014b65>] do_softirq+0x59/0xca
       [<ffffffff810686ad>] irq_exit+0x58/0xae
       [<ffffffff81029b84>] smp_apic_timer_interrupt+0x94/0xba
       [<ffffffff81012a33>] apic_timer_interrupt+0x13/0x20
      
      The reason is that try_one_irq() is called from hardirq context with
      interrupts disabled and from softirq context (poll_all_shared_irqs())
      with interrupts enabled.
      
      Disable interrupts before calling it from poll_all_shared_irqs().
      Reported-and-tested-by: NPrarit Bhargava <prarit@redhat.com>
      Signed-off-by: NYong Zhang <yong.zhang0@gmail.com>
      LKML-Reference: <1257563773-4620-1-git-send-email-yong.zhang0@gmail.com>
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      e7e7e0c0
  6. 04 11月, 2009 1 次提交
  7. 04 8月, 2009 1 次提交
  8. 17 1月, 2009 1 次提交
    • I
      irq: provide debug_poll_all_shared_irqs() method under CONFIG_DEBUG_SHIRQ · 74296a8e
      Ingo Molnar 提交于
      Provide a shared interrupt debug facility under CONFIG_DEBUG_SHIRQ:
      it uses the existing irqpoll facilities to iterate through all
      registered interrupt handlers and call those which can handle shared
      IRQ lines.
      
      This can be handy for suspend/resume debugging: if we call this function
      early during resume we can trigger crashes in those drivers which have
      incorrect assumptions about when exactly their ISRs will be called
      during suspend/resume.
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      74296a8e
  9. 26 12月, 2008 1 次提交
  10. 08 12月, 2008 1 次提交
    • Y
      sparse irq_desc[] array: core kernel and x86 changes · 0b8f1efa
      Yinghai Lu 提交于
      Impact: new feature
      
      Problem on distro kernels: irq_desc[NR_IRQS] takes megabytes of RAM with
      NR_CPUS set to large values. The goal is to be able to scale up to much
      larger NR_IRQS value without impacting the (important) common case.
      
      To solve this, we generalize irq_desc[NR_IRQS] to an (optional) array of
      irq_desc pointers.
      
      When CONFIG_SPARSE_IRQ=y is used, we use kzalloc_node to get irq_desc,
      this also makes the IRQ descriptors NUMA-local (to the site that calls
      request_irq()).
      
      This gets rid of the irq_cfg[] static array on x86 as well: irq_cfg now
      uses desc->chip_data for x86 to store irq_cfg.
      Signed-off-by: NYinghai Lu <yinghai@kernel.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      0b8f1efa
  11. 16 10月, 2008 4 次提交
  12. 19 7月, 2008 1 次提交
    • E
      genirq: enable polling for disabled screaming irqs · f84dbb91
      Eric W. Biederman 提交于
      When we disable a screaming irq we never see it again.  If the irq
      line is shared or if the driver half works this is a real pain.  So
      periodically poll the handlers for screaming interrupts.
      
      I use a timer instead of the classic irq poll technique of working off
      the timer interrupt because when we use the local apic timers
      note_interrupt is never called (bug?).  Further on a system with
      dynamic ticks the timer interrupt might not even fire unless there is
      a timer telling it it needs to.
      
      I forced this case on my test system with an e1000 nic and my ssh
      session remained responsive despite the interrupt handler only being
      called every 10th of a second.
      Signed-off-by: NEric W. Biederman <ebiederm@xmission.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      f84dbb91
  13. 02 5月, 2008 1 次提交
    • T
      genirq: reenable a nobody cared disabled irq when a new driver arrives · 1adb0850
      Thomas Gleixner 提交于
      Uwe Kleine-Koenig has some strange hardware where one of the shared
      interrupts can be asserted during boot before the appropriate driver
      loads. Requesting the shared irq line from another driver result in a
      spurious interrupt storm which finally disables the interrupt line.
      
      I have seen similar behaviour on resume before (the hardware does not
      work anymore so I can not verify).
      
      Change the spurious disable logic to increment the disable depth and
      mark the interrupt with an extra flag which allows us to reenable the
      interrupt when a new driver arrives which requests the same irq
      line. In the worst case this will disable the irq again via the
      spurious trap, but there is a decent chance that the new driver is the
      one which can handle the already asserted interrupt and makes the box
      usable again.
      
      Eric Biederman said further: This case also happens on a regular basis
      in kdump kernels where we deliberately don't shutdown the hardware
      before starting the new kernel.  This patch should reduce the need for
      using irqpoll in that situation by a small amount.
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      Tested-and-Acked-by: NUwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
      1adb0850
  14. 19 2月, 2008 1 次提交
  15. 30 1月, 2008 1 次提交
  16. 17 7月, 2007 1 次提交
    • A
      Improve behaviour of spurious IRQ detect · 4f27c00b
      Alan Cox 提交于
      Currently we handle spurious IRQ activity based upon seeing a lot of
      invalid interrupts, and we clear things back on the base of lots of valid
      interrupts.
      
      Unfortunately in some cases you get legitimate invalid interrupts caused by
      timing asynchronicity between the PCI bus and the APIC bus when disabling
      interrupts and pulling other tricks.  In this case although the spurious
      IRQs are not a problem our unhandled counters didn't clear and they act as
      a slow running timebomb.  (This is effectively what the serial port/tty
      problem that was fixed by clearing counters when registering a handler
      showed up)
      
      It's easy enough to add a second parameter - time.  This means that if we
      see a regular stream of harmless spurious interrupts which are not harming
      processing we don't go off and do something stupid like disable the IRQ
      after a month of running.  OTOH lockups and performance killers show up a
      lot more than 10/second
      
      [akpm@linux-foundation.org: cleanup]
      Signed-off-by: NAlan Cox <alan@redhat.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      4f27c00b
  17. 24 5月, 2007 1 次提交
    • L
      Fix crash with irqpoll due to the IRQF_IRQPOLL flag testing · 92ea7727
      Linus Torvalds 提交于
      With irqpoll enabled, trying to test the IRQF_IRQPOLL flag in the
      actions would cause a NULL pointer dereference if no action was
      installed (for example, the driver might have been unloaded with
      interrupts still pending).
      
      So be a bit more careful about testing the flag by making sure to test
      for that case.
      
      (The actual _change_ is trivial, the patch is more than a one-liner
      because I rewrote the testing to also be much more readable.
      
      Original (discarded) bugfix by Bernhard Walle.
      
      Cc: Bernhard Walle <bwalle@suse.de>
      Tested-by: NVivek Goyal <vgoyal@in.ibm.com>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      92ea7727
  18. 09 5月, 2007 1 次提交
    • B
      Add IRQF_IRQPOLL flag (common code) · d85a60d8
      Bernhard Walle 提交于
      irqpoll is broken on some architectures that don't use the IRQ 0 for the timer
      interrupt like IA64.  This patch adds a IRQF_IRQPOLL flag.
      
      Each architecture is handled in a separate pach.  As I left the irq == 0 as
      condition, this should not break existing architectures that use timer_irq ==
      0 and that I did't address with that patch (because I don't know).
      
      This patch:
      
      This patch adds a IRQF_IRQPOLL flag that the interrupt registration code could
      use for the interrupt it wants to use for IRQ polling.
      
      Because this must not be the timer interrupt, an additional flag was added
      instead of re-using the IRQF_TIMER constant.  Until all architectures will
      have an IRQF_IRQPOLL interrupt, irq == 0 will stay as alternative as it should
      not break anything.
      
      Also, note_interrupt() is called on CPU-specific interrupts to be used as
      interrupt source for IRQ polling.
      Signed-off-by: NBernhard Walle <bwalle@suse.de>
      Cc: Russell King <rmk@arm.linux.org.uk>
      Cc: Kyle McMartin <kyle@mcmartin.ca>
      Cc: Matthew Wilcox <willy@debian.org>
      Cc: Grant Grundler <grundler@google.com>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: "Luck, Tony" <tony.luck@intel.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      d85a60d8
  19. 11 1月, 2007 1 次提交
    • V
      [PATCH] x86-64: Make noirqdebug_setup function non init to fix modpost warning · 343cde51
      Vivek Goyal 提交于
      o noirqdebug_setup() is __init but it is being called by
        quirk_intel_irqbalance() which if of type __devinit. If CONFIG_HOTPLUG=y,
        quirk_intel_irqbalance() is put into text section and it is wrong to
        call a function in __init section.
      
      o MODPOST flags this on i386 if CONFIG_RELOCATABLE=y
      
      WARNING: vmlinux - Section mismatch: reference to .init.text:noirqdebug_setup from .text between 'quirk_intel_irqbalance' (at offset 0xc010969e) and 'i8237A_suspend'
      
      o Make noirqdebug_setup() non-init.
      Signed-off-by: NVivek Goyal <vgoyal@in.ibm.com>
      Signed-off-by: NAndi Kleen <ak@suse.de>
      343cde51
  20. 23 11月, 2006 1 次提交
  21. 13 11月, 2006 1 次提交
    • P
      [PATCH] Fix misrouted interrupts deadlocks · f72fa707
      Pavel Emelianov 提交于
      While testing kernel on machine with "irqpoll" option I've caught such a
      lockup:
      
      	__do_IRQ()
      	   spin_lock(&desc->lock);
                 desc->chip->ack(); /* IRQ is ACKed */
      	note_interrupt()
      	misrouted_irq()
      	handle_IRQ_event()
                 if (...)
      	      local_irq_enable_in_hardirq();
      	/* interrupts are enabled from now */
      	...
      	__do_IRQ() /* same IRQ we've started from */
      	   spin_lock(&desc->lock); /* LOCKUP */
      
      Looking at misrouted_irq() code I've found that a potential deadlock like
      this can also take place:
      
      1CPU:
      __do_IRQ()
         spin_lock(&desc->lock); /* irq = A */
      misrouted_irq()
         for (i = 1; i < NR_IRQS; i++) {
            spin_lock(&desc->lock); /* irq = B */
            if (desc->status & IRQ_INPROGRESS) {
      
      2CPU:
      __do_IRQ()
         spin_lock(&desc->lock); /* irq = B */
      misrouted_irq()
         for (i = 1; i < NR_IRQS; i++) {
            spin_lock(&desc->lock); /* irq = A */
            if (desc->status & IRQ_INPROGRESS) {
      
      As the second lock on both CPUs is taken before checking that this irq is
      being handled in another processor this may cause a deadlock.  This issue
      is only theoretical.
      
      I propose the attached patch to fix booth problems: when trying to handle
      misrouted IRQ active desc->lock may be unlocked.
      Acked-by: NIngo Molnar <mingo@redhat.com>
      Signed-off-by: NAndrew Morton <akpm@osdl.org>
      Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
      f72fa707
  22. 05 10月, 2006 1 次提交
    • D
      IRQ: Maintain regs pointer globally rather than passing to IRQ handlers · 7d12e780
      David Howells 提交于
      Maintain a per-CPU global "struct pt_regs *" variable which can be used instead
      of passing regs around manually through all ~1800 interrupt handlers in the
      Linux kernel.
      
      The regs pointer is used in few places, but it potentially costs both stack
      space and code to pass it around.  On the FRV arch, removing the regs parameter
      from all the genirq function results in a 20% speed up of the IRQ exit path
      (ie: from leaving timer_interrupt() to leaving do_IRQ()).
      
      Where appropriate, an arch may override the generic storage facility and do
      something different with the variable.  On FRV, for instance, the address is
      maintained in GR28 at all times inside the kernel as part of general exception
      handling.
      
      Having looked over the code, it appears that the parameter may be handed down
      through up to twenty or so layers of functions.  Consider a USB character
      device attached to a USB hub, attached to a USB controller that posts its
      interrupts through a cascaded auxiliary interrupt controller.  A character
      device driver may want to pass regs to the sysrq handler through the input
      layer which adds another few layers of parameter passing.
      
      I've build this code with allyesconfig for x86_64 and i386.  I've runtested the
      main part of the code on FRV and i386, though I can't test most of the drivers.
      I've also done partial conversion for powerpc and MIPS - these at least compile
      with minimal configurations.
      
      This will affect all archs.  Mostly the changes should be relatively easy.
      Take do_IRQ(), store the regs pointer at the beginning, saving the old one:
      
      	struct pt_regs *old_regs = set_irq_regs(regs);
      
      And put the old one back at the end:
      
      	set_irq_regs(old_regs);
      
      Don't pass regs through to generic_handle_irq() or __do_IRQ().
      
      In timer_interrupt(), this sort of change will be necessary:
      
      	-	update_process_times(user_mode(regs));
      	-	profile_tick(CPU_PROFILING, regs);
      	+	update_process_times(user_mode(get_irq_regs()));
      	+	profile_tick(CPU_PROFILING);
      
      I'd like to move update_process_times()'s use of get_irq_regs() into itself,
      except that i386, alone of the archs, uses something other than user_mode().
      
      Some notes on the interrupt handling in the drivers:
      
       (*) input_dev() is now gone entirely.  The regs pointer is no longer stored in
           the input_dev struct.
      
       (*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking.  It does
           something different depending on whether it's been supplied with a regs
           pointer or not.
      
       (*) Various IRQ handler function pointers have been moved to type
           irq_handler_t.
      Signed-Off-By: NDavid Howells <dhowells@redhat.com>
      (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)
      7d12e780
  23. 03 7月, 2006 1 次提交
  24. 30 6月, 2006 5 次提交