1. 31 3月, 2009 1 次提交
    • R
      PM: Introduce functions for suspending and resuming device interrupts · 0a0c5168
      Rafael J. Wysocki 提交于
      Introduce helper functions allowing us to prevent device drivers from
      getting any interrupts (without disabling interrupts on the CPU)
      during suspend (or hibernation) and to make them start to receive
      interrupts again during the subsequent resume.  These functions make it
      possible to keep timer interrupts enabled while the "late" suspend and
      "early" resume callbacks provided by device drivers are being
      executed.  In turn, this allows device drivers' "late" suspend and
      "early" resume callbacks to sleep, execute ACPI callbacks etc.
      
      The functions introduced here will be used to rework the handling of
      interrupts during suspend (hibernation) and resume.  Namely,
      interrupts will only be disabled on the CPU right before suspending
      sysdevs, while device drivers will be prevented from receiving
      interrupts, with the help of the new helper function, before their
      "late" suspend callbacks run (and analogously during resume).
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Acked-by: NIngo Molnar <mingo@elte.hu>
      0a0c5168
  2. 13 3月, 2009 2 次提交
  3. 12 3月, 2009 3 次提交
  4. 18 2月, 2009 2 次提交
  5. 15 2月, 2009 2 次提交
  6. 13 2月, 2009 1 次提交
  7. 09 2月, 2009 1 次提交
  8. 28 1月, 2009 2 次提交
  9. 12 1月, 2009 1 次提交
    • M
      cpumask: update irq_desc to use cpumask_var_t · 7f7ace0c
      Mike Travis 提交于
      Impact: reduce memory usage, use new cpumask API.
      
      Replace the affinity and pending_masks with cpumask_var_t's.  This adds
      to the significant size reduction done with the SPARSE_IRQS changes.
      
      The added functions (init_alloc_desc_masks & init_copy_desc_masks) are
      in the include file so they can be inlined (and optimized out for the
      !CONFIG_CPUMASKS_OFFSTACK case.)  [Naming chosen to be consistent with
      the other init*irq functions, as well as the backwards arg declaration
      of "from, to" instead of the more common "to, from" standard.]
      
      Includes a slight change to the declaration of struct irq_desc to embed
      the pending_mask within ifdef(CONFIG_SMP) to be consistent with other
      references, and some small changes to Xen.
      
      Tested: sparse/non-sparse/cpumask_offstack/non-cpumask_offstack/nonuma/nosmp on x86_64
      Signed-off-by: NMike Travis <travis@sgi.com>
      Cc: Chris Wright <chrisw@sous-sol.org>
      Cc: Jeremy Fitzhardinge <jeremy@xensource.com>
      Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
      Cc: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
      Cc: virtualization@lists.osdl.org
      Cc: xen-devel@lists.xensource.com
      Cc: Yinghai Lu <yhlu.kernel@gmail.com>
      7f7ace0c
  10. 01 1月, 2009 1 次提交
  11. 29 12月, 2008 2 次提交
    • Y
      sparseirq: move __weak symbols into separate compilation unit · 43a25632
      Yinghai Lu 提交于
      GCC has a bug with __weak alias functions: if the functions are in
      the same compilation unit as their call site, GCC can decide to
      inline them - and thus rob the linker of the opportunity to override
      the weak alias with the real thing.
      
      So move all the IRQ handling related __weak symbols to kernel/irq/chip.c.
      Signed-off-by: NYinghai Lu <yinghai@kernel.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      43a25632
    • I
      sparseirq: work around __weak alias bug · b2e2fe99
      Ingo Molnar 提交于
      Impact: fix boot crash if the kernel is built with certain GCC versions
      
      GCC has a bug with __weak alias functions: if the functions are in
      the same compilation unit as their call site, GCC can decide to
      inline them - and thus rob the linker of the opportunity to override
      the weak alias with the real thing.
      
      This can lead to the boot crash reported by Kamalesh Babulal:
      
       ACPI: Core revision 20080926
       Setting APIC routing to flat
       BUG: unable to handle kernel NULL pointer dereference at
       0000000000000000
       IP: [<ffffffff8021f9a8>] add_pin_to_irq_cpu+0x14/0x74
       PGD 0
       Oops: 0000 [#1] SMP
       [...]
      
      So move the arch_init_chip_data() function from handle.c to manage.c.
      Reported-by: NKamalesh Babulal <kamalesh@linux.vnet.ibm.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      b2e2fe99
  12. 13 12月, 2008 1 次提交
  13. 02 12月, 2008 2 次提交
  14. 13 11月, 2008 1 次提交
    • M
      genirq: __irq_set_trigger: change pr_warning to pr_debug · 3ff68a6a
      Mark Nelson 提交于
      Commit 0c5d1eb7 (genirq: record trigger
      type) caused powerpc platforms that had no set_type() function in their
      struct irq_chip to spew out warnings about "No set_type function for
      IRQ...". This warning isn't necessarily justified though because the
      generic powerpc platform code calls set_irq_type() (which in turn calls
      __irq_set_trigger) with information from the device tree to establish
      the interrupt mappings, regardless of whether the PIC can actually set
      a type.
      
      A platform's irq_chip might not have a set_type function for a variety
      of reasons, for example: the platform may have the type essentially
      hard-coded, or as in the case for Cell interrupts are just messages
      past around that have no real concept of type, or the platform
      could even have a virtual PIC as on the PS3.
      Signed-off-by: NMark Nelson <markn@au1.ibm.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      3ff68a6a
  15. 10 11月, 2008 3 次提交
  16. 16 10月, 2008 8 次提交
  17. 02 10月, 2008 1 次提交
    • D
      genirq: record trigger type · 0c5d1eb7
      David Brownell 提交于
      Genirq hasn't previously recorded the trigger type used by any given IRQ,
      although some irq_chip support has done so.  That data can be useful when
      troubleshooting.  This patch records it in the relevant irq_desc.status
      bits, and improves consistency between the two driver-visible calls
      affected:
      
       - Make set_irq_type() usage match request_irq() usage:
          * IRQ_TYPE_NONE should be a NOP; succeed, so irq_chip methods
            won't have to handle that case any more (many do it wrong).
          * IRQ_TYPE_PROBE is ignored; any buggy out-of-tree callers
            might need to switch over to the real IRQ probing code.
          * emit the same diagnostics (from shared utility code)
      
       - Their kerneldoc now reflects usage:
          * request_irq() flags include IRQF_TRIGGER_* to specify
            active edge(s)/level ... docs previously omitted that
          * set_irq_type() is declared in <linux/irq.h> so callers
            should use the (bit-equivalent) IRQ_TYPE_* symbols there
      
      Also: adds a warning about shared IRQs that don't end up using the
      requested trigger mode; and fix an unrelated "sparse" warning.
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Acked-by: NThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      0c5d1eb7
  18. 07 9月, 2008 1 次提交
  19. 22 8月, 2008 1 次提交
    • A
      genirq: fix irq_desc->depth handling with DEBUG_SHIRQ · 377bf1e4
      Anton Vorontsov 提交于
      When DEBUG_SHIRQ is selected, a spurious IRQ is issued before
      the setup_irq() initializes the desc->depth. An IRQ handler may
      call disable_irq_nosync(), but then setup_irq() will overwrite
      desc->depth, and upon enable_irq() we'll catch this WARN:
      
      ------------[ cut here ]------------
      Badness at kernel/irq/manage.c:180
      NIP: c0061ab8 LR: c0061f10 CTR: 00000000
      REGS: cf83be50 TRAP: 0700   Not tainted  (2.6.27-rc3-23450-g74919b0)
      MSR: 00021032 <ME,IR,DR>  CR: 22042022  XER: 20000000
      TASK = cf829100[5] 'events/0' THREAD: cf83a000
      GPR00: c0061f10 cf83bf00 cf829100 c038e674 00000016 00000000 cf83bef8 00000038
      GPR08: c0298910 00000000 c0310d28 cf83a000 00000c9c 1001a1a8 0fffe000 00800000
      GPR16: ffffffff 00000000 007fff00 00000000 007ffeb0 c03320a0 c031095c c0310924
      GPR24: cf8292ec cf807190 cf83a000 00009032 c038e6a4 c038e674 cf99b1cc c038e674
      NIP [c0061ab8] __enable_irq+0x20/0x80
      LR [c0061f10] enable_irq+0x50/0x70
      Call Trace:
      [cf83bf00] [c038e674] irq_desc+0x630/0x9000 (unreliable)
      [cf83bf10] [c0061f10] enable_irq+0x50/0x70
      [cf83bf30] [c01abe94] phy_change+0x68/0x108
      [cf83bf50] [c0046394] run_workqueue+0xc4/0x16c
      [cf83bf90] [c0046834] worker_thread+0x74/0xd4
      [cf83bfd0] [c004ab7c] kthread+0x48/0x84
      [cf83bff0] [c00135e0] kernel_thread+0x44/0x60
      Instruction dump:
      4e800020 3d20c031 38a94214 4bffffcc 9421fff0 7c0802a6 93e1000c 7c7f1b78
      90010014 8123001c 2f890000 409e001c <0fe00000> 80010014 83e1000c 38210010
      
      That trace corresponds to this line:
      WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", irq);
      
      The patch fixes the problem by moving the SHIRQ code below the
      setup_irq().
      
      Unfortunately we can't easily move the SHIRQ code inside the
      setup_irq(), since it grabs a spinlock, so to prvent a 'real'
      IRQ from interfere us we should disable that IRQ.
      
      p.s. The driver in question is drivers/net/phy/phy.c.
      Signed-off-by: NAnton Vorontsov <avorontsov@ru.mvista.com>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      377bf1e4
  20. 06 8月, 2008 1 次提交
  21. 27 7月, 2008 1 次提交
  22. 26 7月, 2008 1 次提交
  23. 25 7月, 2008 1 次提交
    • U
      generic irqs: handle failure of irqchip->set_type in setup_irq · 82736f4d
      Uwe Kleine-König 提交于
      set_type returns an int indicating success or failure, but up to now
      setup_irq ignores that.
      
      In my case this resulted in a machine hang:
      
      gpio-keys requested IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, but
      arm/ns9xxx can only trigger on one direction so set_type didn't touch
      the configuration which happens do default to a level sensitiveness and
      returned -EINVAL.  setup_irq ignored that and unmasked the irq.  This
      resulted in an endless triggering of the gpio-key interrupt service
      routine which effectively killed the machine.
      
      With this patch applied setup_irq propagates the error to the caller.
      
      Note that before in the case
      
      	chip && !chip->set_type && !chip->name
      
      a NULL pointer was feed to printk.  This is fixed, too.
      Signed-off-by: NUwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      82736f4d