1. 31 Jul, 2007 1 commit
  2. 16 Jul, 2007 1 commit
    • Alan Cox's avatar
      Improve behaviour of spurious IRQ detect · 4f27c00b
      Alan Cox authored
      
      
      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: default avatarAlan Cox <alan@redhat.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      4f27c00b
  3. 08 May, 2007 1 commit
  4. 01 Mar, 2007 1 commit
  5. 26 Feb, 2007 1 commit
  6. 19 Feb, 2007 1 commit
    • Andrew Morton's avatar
      [PATCH] Declare init_irq_proc before we use it. · 6168a702
      Andrew Morton authored
      
      
      powerpc gets:
      
      init/main.c: In function `do_basic_setup':
      init/main.c:714: warning: implicit declaration of function `init_irq_proc'
      
      but we cannot include linux/irq.h in generic code.
      
      Fix it by moving the declaration into linux/interrupt.h instead.
      
      And make sure all code that defines init_irq_proc() is including
      linux/interrupt.h.
      
      And nuke an ifdef-in-C
      
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Paul Mackerras <paulus@samba.org>
      Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      6168a702
  7. 16 Feb, 2007 4 commits
  8. 07 Feb, 2007 1 commit
    • Eric W. Biederman's avatar
      msi: Kill the msi_desc array. · 5b912c10
      Eric W. Biederman authored
      
      
      We need to be able to get from an irq number to a struct msi_desc.
      The msi_desc array in msi.c had several short comings the big one was
      that it could not be used outside of msi.c.  Using irq_data in struct
      irq_desc almost worked except on some architectures irq_data needs to
      be used for something else.
      
      So this patch adds a msi_desc pointer to irq_desc, adds the appropriate
      wrappers and changes all of the msi code to use them.
      
      The dynamic_irq_init/cleanup code was tweaked to ensure the new
      field is left in a well defined state.
      Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
      Acked-by: default avatarIngo Molnar <mingo@elte.hu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      5b912c10
  9. 20 Oct, 2006 1 commit
  10. 17 Oct, 2006 1 commit
  11. 05 Oct, 2006 2 commits
    • David Howells's avatar
      IRQ: Maintain regs pointer globally rather than passing to IRQ handlers · 7d12e780
      David Howells authored
      
      
      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: default avatarDavid Howells <dhowells@redhat.com>
      (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)
      7d12e780
    • David Howells's avatar
      IRQ: Typedef the IRQ flow handler function type · 57a58a94
      David Howells authored
      
      
      Typedef the IRQ flow handler function type.
      Signed-Off-By: default avatarDavid Howells <dhowells@redhat.com>
      (cherry picked from 8e973fbdf5716b93a0a8c0365be33a31ca0fa351 commit)
      57a58a94
  12. 04 Oct, 2006 5 commits
    • Eric W. Biederman's avatar
      [PATCH] msi: simplify msi sanity checks by adding with generic irq code · 1f80025e
      Eric W. Biederman authored
      
      
      Currently msi.c is doing sanity checks that make certain before an irq is
      destroyed it has no more users.
      
      By adding irq_has_action I can perform the test is a generic way, instead of
      relying on a msi specific data structure.
      
      By performing the core check in dynamic_irq_cleanup I ensure every user of
      dynamic irqs has a test present and we don't free resources that are in use.
      
      In msi.c this allows me to kill the attrib.state member of msi_desc and all of
      the assciated code to maintain it.
      
      To keep from freeing data structures when irq cleanup code is called to soon
      changing dyanamic_irq_cleanup is insufficient because there are msi specific
      data structures that are also not safe to free.
      Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Tony Luck <tony.luck@intel.com>
      Cc: Andi Kleen <ak@suse.de>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Greg KH <greg@kroah.com>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
      1f80025e
    • Eric W. Biederman's avatar
      [PATCH] genirq: irq: remove msi hacks · 323a01c5
      Eric W. Biederman authored
      
      
      Because of the nasty way that CONFIG_PCI_MSI was implemented we wound up with
      set_irq_info and set_native_irq_info, with move_irq and move_native_irq.  Both
      functions did the same thing but they were built and called under different
      circumstances.  Now that the msi hacks are gone we can kill move_irq and
      set_irq_info.
      Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Rajesh Shah <rajesh.shah@intel.com>
      Cc: Andi Kleen <ak@muc.de>
      Cc: "Protasevich, Natalie" <Natalie.Protasevich@UNISYS.com>
      Cc: "Luck, Tony" <tony.luck@intel.com>
      Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
      323a01c5
    • Eric W. Biederman's avatar
      [PATCH] genirq: irq: add a dynamic irq creation API · 3a16d713
      Eric W. Biederman authored
      
      
      With the msi support comes a new concept in irq handling, irqs that are
      created dynamically at run time.
      
      Currently the msi code allocates irqs backwards.  First it allocates a
      platform dependent routing value for an interrupt the ``vector'' and then it
      figures out from the vector which irq you are on.
      
      This msi backwards allocator suffers from two basic problems.  The allocator
      suffers because it is trying to do something that is architecture specific in
      a generic way making it brittle, inflexible, and tied to tightly to the
      architecture implementation.  The alloctor also suffers from it's very
      backwards nature as it has tied things together that should have no
      dependencies.
      
      To solve the basic dynamic irq allocation problem two new architecture
      specific functions are added: create_irq and destroy_irq.
      
      create_irq takes no input and returns an unused irq number, that won't be
      reused until it is returned to the free poll with destroy_irq.  The irq then
      can be used for any purpose although the only initial consumer is the msi
      code.
      
      destroy_irq takes an irq number allocated with create_irq and returns it to
      the free pool.
      
      Making this functionality per architecture increases the simplicity of the irq
      allocation code and increases it's flexibility.
      
      dynamic_irq_init() and dynamic_irq_cleanup() are added to automate the
      irq_desc initializtion that should happen for dynamic irqs.
      Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Rajesh Shah <rajesh.shah@intel.com>
      Cc: Andi Kleen <ak@muc.de>
      Cc: "Protasevich, Natalie" <Natalie.Protasevich@UNISYS.com>
      Cc: "Luck, Tony" <tony.luck@intel.com>
      Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
      3a16d713
    • Eric W. Biederman's avatar
      [PATCH] genirq: irq: add moved_masked_irq · e7b946e9
      Eric W. Biederman authored
      
      
      Currently move_native_irq disables and renables the irq we are migrating to
      ensure we don't take that irq when we are actually doing the migration
      operation.  Disabling the irq needs to happen but sometimes doing the work is
      move_native_irq is too late.
      
      On x86 with ioapics the irq move sequences needs to be:
      edge_triggered:
        mask irq.
        move irq.
        unmask irq.
        ack irq.
      level_triggered:
        mask irq.
        ack irq.
        move irq.
        unmask irq.
      
      We can easily perform the edge triggered sequence, with the current defintion
      of move_native_irq.  However the level triggered case does not map well.  For
      that I have added move_masked_irq, to allow me to disable the irqs around both
      the ack and the move.
      
      Q: Why have we not seen this problem earlier?
      
      A: The only symptom I have been able to reproduce is that if we change
         the vector before acknowleding an irq the wrong irq is acknowledged.
         Since we currently are not reprogramming the irq vector during
         migration no problems show up.
      
         We have to mask the irq before we acknowledge the irq or else we could
         hit a window where an irq is asserted just before we acknowledge it.
      
         Edge triggered irqs do not have this problem because acknowledgements
         do not propogate in the same way.
      Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Rajesh Shah <rajesh.shah@intel.com>
      Cc: Andi Kleen <ak@muc.de>
      Cc: "Protasevich, Natalie" <Natalie.Protasevich@UNISYS.com>
      Cc: "Luck, Tony" <tony.luck@intel.com>
      Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
      e7b946e9
    • Eric W. Biederman's avatar
      [PATCH] genirq: irq: convert the move_irq flag from a 32bit word to a single bit · a24ceab4
      Eric W. Biederman authored
      
      
      The primary aim of this patchset is to remove maintenances problems caused by
      the irq infrastructure.  The two big issues I address are an artificially
      small cap on the number of irqs, and that MSI assumes vector == irq.  My
      primary focus is on x86_64 but I have touched other architectures where
      necessary to keep them from breaking.
      
      - To increase the number of irqs I modify the code to look at the (cpu,
        vector) pair instead of just looking at the vector.
      
        With a large number of irqs available systems with a large irq count no
        longer need to compress their irq numbers to fit.  Removing a lot of brittle
        special cases.
      
        For acpi guys the result is that irq == gsi.
      
      - Addressing the fact that MSI assumes irq == vector takes a few more
        patches.  But suffice it to say when I am done none of the generic irq code
        even knows what a vector is.
      
      In quick testing on a large Unisys x86_64 machine we stumbled over at least
      one driver that assumed that NR_IRQS could always fit into an 8 bit number.
      This driver is clearly buggy today.  But this has become a class of bugs that
      it is now much easier to hit.
      
      This patch:
      
      This is a minor space optimization.  In practice I don't think this has any
      affect because of our alignment constraints and the other fields but there is
      not point in chewing up an uncessary word and since we already read the flag
      field this should improve the cache hit ratio of the irq handler.
      Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Rajesh Shah <rajesh.shah@intel.com>
      Cc: Andi Kleen <ak@muc.de>
      Cc: "Protasevich, Natalie" <Natalie.Protasevich@UNISYS.com>
      Cc: "Luck, Tony" <tony.luck@intel.com>
      Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
      a24ceab4
  13. 26 Sep, 2006 1 commit
  14. 31 Jul, 2006 2 commits
  15. 02 Jul, 2006 2 commits
    • Thomas Gleixner's avatar
      [PATCH] genirq: ARM dyntick cleanup · d061daa0
      Thomas Gleixner authored
      
      
      Linus: "The hacks in kernel/irq/handle.c are really horrid. REALLY
      horrid."
      
      They are indeed. Move the dyntick quirks to ARM where they belong.
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
      d061daa0
    • Thomas Gleixner's avatar
      [PATCH] irq-flags: consolidate flags for request_irq · 6e213616
      Thomas Gleixner authored
      
      
      The recent interrupt rework introduced bit value conflicts with sparc.
      Instead of introducing new architecture flags mess, move the interrupt SA_
      flags out of the signal namespace and replace them by interrupt related flags.
      
      This allows to remove the obsolete SA_INTERRUPT flag and clean up the bit
      field values.
      
      This patch:
      
      Move the interrupt related SA_ flags out of linux/signal.h and rename them to
      IRQF_ .  This moves the interrupt related flags out of the signal namespace
      and allows to remove the architecture dependencies.
      
      SA_INTERRUPT is not needed by userspace and glibc so it can be removed safely.
      
      The existing SA_ constants are kept for easy transition and will be
      removed after a 6 month grace period.
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: "David S. Miller" <davem@davemloft.net>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: "Randy.Dunlap" <rdunlap@xenotime.net>
      Cc: Jaroslav Kysela <perex@suse.cz>
      Cc: Takashi Iwai <tiwai@suse.de>
      Cc: "Antonino A. Daplas" <adaplas@pol.net>
      Cc: Greg KH <greg@kroah.com>
      Cc: Russell King <rmk@arm.linux.org.uk>
      Cc: James Bottomley <James.Bottomley@steeleye.com>
      Cc: Kyle McMartin <kyle@mcmartin.ca>
      Cc: Jeff Garzik <jeff@garzik.org>
      Cc: Mauro Carvalho Chehab <mchehab@infradead.org>
      Cc: Karsten Keil <kkeil@suse.de>
      Cc: Jody McIntyre <scjody@modernduck.com>
      Cc: Ben Collins <bcollins@debian.org>
      Cc: Stefan Richter <stefanr@s5r6.in-berlin.de>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Cc: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>
      Cc: Dave Airlie <airlied@linux.ie>
      Cc: Jens Axboe <axboe@suse.de>
      Cc: Chris Zankel <chris@zankel.net>
      Cc: Andi Kleen <ak@muc.de>
      Cc: Miles Bader <uclinux-v850@lsi.nec.co.jp>
      Cc: Jeff Dike <jdike@addtoit.com>
      Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
      Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>                                 Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
      Cc: Ralf Baechle <ralf@linux-mips.org>
      Cc: Roman Zippel <zippel@linux-m68k.org>
      Cc: Geert Uytterhoeven <geert@linux-m68k.org>
      Cc: Greg Ungerer <gerg@uclinux.org>
      Cc: "Luck, Tony" <tony.luck@intel.com>
      Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
      Cc: David Howells <dhowells@redhat.com>
      Cc: Mikael Starvik <starvik@axis.com>
      Cc: Russell King <rmk@arm.linux.org.uk>
      Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
      Cc: Richard Henderson <rth@twiddle.net>
      Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
      6e213616
  16. 01 Jul, 2006 1 commit
  17. 29 Jun, 2006 14 commits