All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
	Zwane Mwaikambo <zwane@arm.linux.org.uk>,
	"Theodore Ts'o" <tytso@mit.edu>,
	Randy Dunlap <rdunlap@xenotime.net>,
	Dave Jones <davej@redhat.com>,
	Chuck Wolber <chuckw@quantumlinux.com>,
	Chris Wedgwood <reviews@ml.cw.f00f.org>,
	Michael Krufky <mkrufky@linuxtv.org>,
	Chuck Ebbert <cebbert@redhat.com>,
	Domenico Andreoli <cavokz@gmail.com>, Willy Tarreau <w@1wt.eu>,
	Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
	Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
	torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk, "David S. Miller" <davem@davemloft.net>,
	Greg Kroah-Hartman <gregkh@suse.de>
Subject: [patch 09/60] sparc64: Fix lost interrupts on sun4u.
Date: Tue, 09 Jun 2009 17:13:37 -0700	[thread overview]
Message-ID: <20090610002341.717841012@blue.kroah.org> (raw)
In-Reply-To: <20090610032135.GA19346@kroah.com>

[-- Attachment #1: sparc64-fix-lost-interrupts-on-sun4u.patch --]
[-- Type: text/plain, Size: 3250 bytes --]

-stable review patch.  If anyone has any objections, please let us know.

------------------
From: David S. Miller <davem@davemloft.net>

[ Upstream commit d0cac39e4ec8097e4c7099d291b1fdcc0fe56b58 ]

Based upon a report by Meelis Roos.

Sparc64 SBUS and PCI controllers use a combination of IMAP and ICLR
registers to manage device interrupts.

The IMAP register contains the "valid" enable bit as well as CPU
targetting information.  Whereas the ICLR register is written with
zero at the end of handling an interrupt to reset the state machine
for that interrupt to IDLE so it can be sent again.

For PCI slot and SBUS slot devices we can have multiple interrupts
sharing the same IMAP register.  There are individual ICLR registers
but only one IMAP register for managing those.

We represent each shared case with individual virtual IRQs so the
generic IRQ layer thinks there is only one user of the IRQ instance.

In such shared IMAP cases this is wrong, so if there are multiple
active users then a free_irq() call will prematurely turn off the
interrupt by clearing the Valid bit in the IMAP register even though
there are other active users.

Fix this by simply doing nothing in sun4u_disable_irq() and checking
IRQF_DISABLED during IRQ dispatch.

This situation doesn't exist in the hypervisor sun4v cases, so I left
those alone.

Tested-by: Meelis Roos <mroos@linux.ee>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 arch/sparc64/kernel/irq.c |   29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

--- a/arch/sparc64/kernel/irq.c
+++ b/arch/sparc64/kernel/irq.c
@@ -318,17 +318,25 @@ static void sun4u_set_affinity(unsigned 
 	sun4u_irq_enable(virt_irq);
 }
 
+/* Don't do anything.  The desc->status check for IRQ_DISABLED in
+ * handler_irq() will skip the handler call and that will leave the
+ * interrupt in the sent state.  The next ->enable() call will hit the
+ * ICLR register to reset the state machine.
+ *
+ * This scheme is necessary, instead of clearing the Valid bit in the
+ * IMAP register, to handle the case of IMAP registers being shared by
+ * multiple INOs (and thus ICLR registers).  Since we use a different
+ * virtual IRQ for each shared IMAP instance, the generic code thinks
+ * there is only one user so it prematurely calls ->disable() on
+ * free_irq().
+ *
+ * We have to provide an explicit ->disable() method instead of using
+ * NULL to get the default.  The reason is that if the generic code
+ * sees that, it also hooks up a default ->shutdown method which
+ * invokes ->mask() which we do not want.  See irq_chip_set_defaults().
+ */
 static void sun4u_irq_disable(unsigned int virt_irq)
 {
-	struct irq_handler_data *data = get_irq_chip_data(virt_irq);
-
-	if (likely(data)) {
-		unsigned long imap = data->imap;
-		unsigned long tmp = upa_readq(imap);
-
-		tmp &= ~IMAP_VALID;
-		upa_writeq(tmp, imap);
-	}
 }
 
 static void sun4u_irq_eoi(unsigned int virt_irq)
@@ -739,7 +747,8 @@ void handler_irq(int irq, struct pt_regs
 
 		desc = irq_desc + virt_irq;
 
-		desc->handle_irq(virt_irq, desc);
+		if (!(desc->status & IRQ_DISABLED))
+			desc->handle_irq(virt_irq, desc);
 
 		bucket_pa = next_pa;
 	}



  parent reply	other threads:[~2009-06-10  3:35 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20090610001328.251476848@blue.kroah.org>
2009-06-10  3:21 ` [patch 00/60] 2.6.27-stable review Greg KH
2009-06-10  0:13   ` [patch 01/60] icom: fix rmmod crash Greg KH
2009-06-10  0:13   ` [patch 02/60] nfs: Fix NFS v4 client handling of MAY_EXEC in nfs_permission Greg KH
2009-06-10  0:13   ` [patch 03/60] TPM: get_event_name stack corruption Greg KH
2009-06-10  0:13   ` [patch 04/60] sparc64: Fix smp_callin() locking Greg KH
2009-06-10  0:13   ` [patch 05/60] sparc: Fix bus type probing for ESP and LE devices Greg KH
2009-06-10  0:13   ` [patch 06/60] sparc64: Fix MM refcount check in smp_flush_tlb_pending() Greg KH
2009-06-10  0:13   ` [patch 07/60] sparc64: Flush TLB before releasing pages Greg KH
2009-06-10  0:13   ` [patch 08/60] sparc64: Fix crash with /proc/iomem Greg KH
2009-06-10  0:13   ` Greg KH [this message]
2009-06-10  0:13   ` [patch 10/60] sparc64: Reschedule KGDB capture to a software interrupt Greg KH
2009-06-10  0:13   ` [patch 11/60] bonding: fix alb mode locking regression Greg KH
2009-06-10  0:13   ` [patch 12/60] vlan/macvlan: fix NULL pointer dereferences in ethtool handlers Greg KH
2009-06-10  0:13   ` [patch 13/60] myr10ge: again fix lro_gen_skb() alignment Greg KH
2009-06-10  0:13   ` [patch 14/60] pktgen: do not access flows[] beyond its length Greg KH
2009-06-10  0:13   ` [patch 15/60] net: fix skb_seq_read returning wrong offset/length for page frag data Greg KH
2009-06-10  0:13   ` [patch 16/60] tcp: fix >2 iw selection Greg KH
2009-06-10  0:13   ` [patch 17/60] x86: work around Fedora-11 x86-32 kernel failures on Intel Atom CPUs Greg KH
2009-06-10  0:13   ` [patch 18/60] [SCSI] 3w-xxxx: scsi_dma_unmap fix Greg KH
2009-06-10  0:13   ` [patch 19/60] bnx2: Fix panic in bnx2_poll_work() Greg KH
2009-06-10  0:13   ` [patch 20/60] cpuidle: fix AMD C1E suspend hang Greg KH
2009-06-10  0:13   ` [patch 21/60] cpuidle: make AMC C1E work in processor_idle Greg KH
2009-06-10  0:13   ` [patch 22/60] drivers/serial/mpc52xx_uart.c: fix array overindexing check Greg KH
2009-06-10  0:13   ` [patch 23/60] e1000: add missing length check to e1000 receive routine Greg KH
2009-06-10  0:13   ` [patch 24/60] hwmon: (lm78) Add missing __devexit_p() Greg KH
2009-06-10  0:13   ` [patch 25/60] igb: fix LRO warning Greg KH
2009-06-10  0:13   ` [patch 26/60] mm: account for MAP_SHARED mappings using VM_MAYSHARE and not VM_SHARED in hugetlbfs Greg KH
2009-06-10  0:13   ` [patch 27/60] random: make get_random_int() more random Greg KH
2009-06-10  0:13   ` [patch 28/60] Avoid ICE in get_random_int() with gcc-3.4.5 Greg KH
2009-06-10  0:13   ` [patch 29/60] SELinux: BUG in SELinux compat_net code Greg KH
2009-06-10  0:13   ` [patch 30/60] sound: usb-audio: make the MotU Fastlane work again Greg KH
2009-06-10  0:13   ` [patch 31/60] USB: isp1760: urb_dequeue doesnt always find the urbs Greg KH
2009-06-10  0:14   ` [patch 32/60] x86: ignore VM_LOCKED when determining if hugetlb-backed page tables can be shared or not Greg KH
2009-06-10  0:14   ` [patch 33/60] x86/pci: fix mmconfig detection with 32bit near 4g Greg KH
2009-06-10  0:14   ` [patch 34/60] V4L/DVB (10943): cx88: Prevent general protection fault on rmmod Greg KH
2009-06-10  0:14   ` [patch 35/60] x86: fix DMI on EFI Greg KH
2009-06-10  0:14   ` [patch 36/60] mac80211: pid, fix memory corruption Greg KH
2009-06-10  0:14   ` [patch 37/60] ext4: fix ext4_free_inode() vs. ext4_claim_inode() race Greg KH
2009-06-10  0:14   ` [patch 38/60] ext4: fix header check in ext4_ext_search_right() for deep extent trees Greg KH
2009-06-10  0:14   ` [patch 39/60] ext4: Print the find_group_flex() warning only once Greg KH
2009-06-10  0:14   ` [patch 40/60] ext4: fix bogus BUG_ONs in in mballoc code Greg KH
2009-06-10  0:14   ` [patch 41/60] ext4: fix bb_prealloc_list corruption due to wrong group locking Greg KH
2009-06-10  0:14   ` [patch 42/60] ext4: dont inherit inappropriate inode flags from parent Greg KH
2009-06-10  0:14   ` [patch 43/60] ext4: tighten restrictions on inode flags Greg KH
2009-06-10  0:14   ` [patch 44/60] ext4: return -EIO not -ESTALE on directory traversal through deleted inode Greg KH
2009-06-10  0:14   ` [patch 45/60] ext4: Add fine print for the 32000 subdirectory limit Greg KH
2009-06-10  0:14   ` [patch 46/60] ext4: add EXT4_IOC_ALLOC_DA_BLKS ioctl Greg KH
2009-06-10  0:14   ` [patch 47/60] ext4: Automatically allocate delay allocated blocks on close Greg KH
2009-06-10  0:14   ` [patch 48/60] ext4: Automatically allocate delay allocated blocks on rename Greg KH
2009-06-10  0:14   ` [patch 49/60] ext4: Fix discard of inode prealloc space with delayed allocation Greg KH
2009-06-10  0:14   ` [patch 50/60] ext4: Check for an valid i_mode when reading the inode from disk Greg KH
2009-06-10  0:14   ` [patch 51/60] jbd2: Update locking coments Greg KH
2009-06-10  0:14     ` Greg KH
2009-06-10  0:14   ` [patch 52/60] ext4: fix typo which causes a memory leak on error path Greg KH
2009-06-10  0:14   ` [patch 53/60] ext4: fix locking typo in mballoc which could cause soft lockup hangs Greg KH
2009-06-10  0:14   ` [patch 54/60] ext4: really print the find_group_flex fallback warning only once Greg KH
2009-06-10  0:14   ` [patch 55/60] ext4: Fix softlockup caused by illegal i_file_acl value in on-disk inode Greg KH
2009-06-10  0:14   ` [patch 56/60] ext4: Ignore i_file_acl_high unless EXT4_FEATURE_INCOMPAT_64BIT is present Greg KH
2009-06-10  0:14   ` [patch 57/60] ext4: Fix sub-block zeroing for writes into preallocated extents Greg KH
2009-06-10  0:14   ` [patch 58/60] ext4: Use a fake block number for delayed new buffer_head Greg KH
2009-06-10  0:14   ` [patch 59/60] ext4: Clear the unwritten buffer_head flag after the extent is initialized Greg KH
2009-06-10  0:14   ` [patch 60/60] ext4: Fix race in ext4_inode_info.i_cached_extent Greg KH
2009-06-10  0:14     ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090610002341.717841012@blue.kroah.org \
    --to=gregkh@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=cavokz@gmail.com \
    --cc=cebbert@redhat.com \
    --cc=chuckw@quantumlinux.com \
    --cc=davej@redhat.com \
    --cc=davem@davemloft.net \
    --cc=eteo@redhat.com \
    --cc=jake@lwn.net \
    --cc=jmforbes@linuxtx.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mkrufky@linuxtv.org \
    --cc=rbranco@la.checkpoint.com \
    --cc=rdunlap@xenotime.net \
    --cc=reviews@ml.cw.f00f.org \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=tytso@mit.edu \
    --cc=w@1wt.eu \
    --cc=zwane@arm.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.