linux-kernel.vger.kernel.org archive mirror
 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>,
	torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk, bunk@stusta.de,
	"David S. Miller" <davem@davemloft.net>
Subject: [2.6.22.2 review 05/84] Fix deadlocks in sparc serial console.
Date: Tue, 7 Aug 2007 13:42:53 -0700	[thread overview]
Message-ID: <20070807204253.GF23028@kroah.com> (raw)
In-Reply-To: <20070807204157.GA23028@kroah.com>

[-- Attachment #1: fix-deadlocks-in-sparc-serial-console.patch --]
[-- Type: text/plain, Size: 4905 bytes --]


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

Subject: [2.6.22.2 review 05/84] [PATCH] [SERIAL]: Fix console write locking in sparc drivers.

Mirror the logic in 8250 for proper console write locking
when SYSRQ is triggered or an OOPS is in progress.

Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/serial/sunhv.c    |   30 ++++++++++++++++++++++++++----
 drivers/serial/sunsab.c   |   19 ++++++++++++++-----
 drivers/serial/sunsu.c    |   14 ++++++++++++++
 drivers/serial/sunzilog.c |   17 ++++++++++++++---
 4 files changed, 68 insertions(+), 12 deletions(-)

--- a/drivers/serial/sunhv.c
+++ b/drivers/serial/sunhv.c
@@ -440,8 +440,16 @@ static void sunhv_console_write_paged(st
 {
 	struct uart_port *port = sunhv_port;
 	unsigned long flags;
+	int locked = 1;
+
+	local_irq_save(flags);
+	if (port->sysrq) {
+		locked = 0;
+	} else if (oops_in_progress) {
+		locked = spin_trylock(&port->lock);
+	} else
+		spin_lock(&port->lock);
 
-	spin_lock_irqsave(&port->lock, flags);
 	while (n > 0) {
 		unsigned long ra = __pa(con_write_page);
 		unsigned long page_bytes;
@@ -469,7 +477,10 @@ static void sunhv_console_write_paged(st
 			ra += written;
 		}
 	}
-	spin_unlock_irqrestore(&port->lock, flags);
+
+	if (locked)
+		spin_unlock(&port->lock);
+	local_irq_restore(flags);
 }
 
 static inline void sunhv_console_putchar(struct uart_port *port, char c)
@@ -488,7 +499,15 @@ static void sunhv_console_write_bychar(s
 {
 	struct uart_port *port = sunhv_port;
 	unsigned long flags;
-	int i;
+	int i, locked = 1;
+
+	local_irq_save(flags);
+	if (port->sysrq) {
+		locked = 0;
+	} else if (oops_in_progress) {
+		locked = spin_trylock(&port->lock);
+	} else
+		spin_lock(&port->lock);
 
 	spin_lock_irqsave(&port->lock, flags);
 	for (i = 0; i < n; i++) {
@@ -496,7 +515,10 @@ static void sunhv_console_write_bychar(s
 			sunhv_console_putchar(port, '\r');
 		sunhv_console_putchar(port, *s++);
 	}
-	spin_unlock_irqrestore(&port->lock, flags);
+
+	if (locked)
+		spin_unlock(&port->lock);
+	local_irq_restore(flags);
 }
 
 static struct console sunhv_console = {
--- a/drivers/serial/sunsab.c
+++ b/drivers/serial/sunsab.c
@@ -860,22 +860,31 @@ static int num_channels;
 static void sunsab_console_putchar(struct uart_port *port, int c)
 {
 	struct uart_sunsab_port *up = (struct uart_sunsab_port *)port;
-	unsigned long flags;
-
-	spin_lock_irqsave(&up->port.lock, flags);
 
 	sunsab_tec_wait(up);
 	writeb(c, &up->regs->w.tic);
-
-	spin_unlock_irqrestore(&up->port.lock, flags);
 }
 
 static void sunsab_console_write(struct console *con, const char *s, unsigned n)
 {
 	struct uart_sunsab_port *up = &sunsab_ports[con->index];
+	unsigned long flags;
+	int locked = 1;
+
+	local_irq_save(flags);
+	if (up->port.sysrq) {
+		locked = 0;
+	} else if (oops_in_progress) {
+		locked = spin_trylock(&up->port.lock);
+	} else
+		spin_lock(&up->port.lock);
 
 	uart_console_write(&up->port, s, n, sunsab_console_putchar);
 	sunsab_tec_wait(up);
+
+	if (locked)
+		spin_unlock(&up->port.lock);
+	local_irq_restore(flags);
 }
 
 static int sunsab_console_setup(struct console *con, char *options)
--- a/drivers/serial/sunsu.c
+++ b/drivers/serial/sunsu.c
@@ -1288,7 +1288,17 @@ static void sunsu_console_write(struct c
 				unsigned int count)
 {
 	struct uart_sunsu_port *up = &sunsu_ports[co->index];
+	unsigned long flags;
 	unsigned int ier;
+	int locked = 1;
+
+	local_irq_save(flags);
+	if (up->port.sysrq) {
+		locked = 0;
+	} else if (oops_in_progress) {
+		locked = spin_trylock(&up->port.lock);
+	} else
+		spin_lock(&up->port.lock);
 
 	/*
 	 *	First save the UER then disable the interrupts
@@ -1304,6 +1314,10 @@ static void sunsu_console_write(struct c
 	 */
 	wait_for_xmitr(up);
 	serial_out(up, UART_IER, ier);
+
+	if (locked)
+		spin_unlock(&up->port.lock);
+	local_irq_restore(flags);
 }
 
 /*
--- a/drivers/serial/sunzilog.c
+++ b/drivers/serial/sunzilog.c
@@ -9,7 +9,7 @@
  * C. Dost, Pete Zaitcev, Ted Ts'o and Alex Buell for their
  * work there.
  *
- *  Copyright (C) 2002, 2006 David S. Miller (davem@davemloft.net)
+ * Copyright (C) 2002, 2006, 2007 David S. Miller (davem@davemloft.net)
  */
 
 #include <linux/module.h>
@@ -1151,11 +1151,22 @@ sunzilog_console_write(struct console *c
 {
 	struct uart_sunzilog_port *up = &sunzilog_port_table[con->index];
 	unsigned long flags;
+	int locked = 1;
+
+	local_irq_save(flags);
+	if (up->port.sysrq) {
+		locked = 0;
+	} else if (oops_in_progress) {
+		locked = spin_trylock(&up->port.lock);
+	} else
+		spin_lock(&up->port.lock);
 
-	spin_lock_irqsave(&up->port.lock, flags);
 	uart_console_write(&up->port, s, count, sunzilog_putchar);
 	udelay(2);
-	spin_unlock_irqrestore(&up->port.lock, flags);
+
+	if (locked)
+		spin_unlock(&up->port.lock);
+	local_irq_restore(flags);
 }
 
 static int __init sunzilog_console_setup(struct console *con, char *options)

-- 

  parent reply	other threads:[~2007-08-07 20:47 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20070807204034.882009319@mini.kroah.org>
2007-08-07 20:41 ` [2.6.22.2 review 00/84] 2.6.22.2 -stable review Greg KH
2007-08-07 20:42   ` [2.6.22.2 review 01/84] USB: cdc-acm: fix sysfs attribute registration bug Greg KH
2007-08-07 20:42   ` [2.6.22.2 review 02/84] TCP FRTO retransmit bug fix Greg KH
2007-08-07 20:42   ` [2.6.22.2 review 03/84] Fix TC deadlock Greg KH
2007-08-07 20:42   ` [2.6.22.2 review 04/84] Fix IPCOMP crashes Greg KH
2007-08-07 20:42   ` Greg KH [this message]
2007-08-07 20:42   ` [2.6.22.2 review 06/84] Add a PCI ID for santa rosas PATA controller Greg KH
2007-08-07 23:39     ` Chr
2007-08-09 19:39       ` Andrew Morton
2007-08-07 20:43   ` [2.6.22.2 review 07/84] Missing header include in ipt_iprange.h Greg KH
2007-08-07 20:43   ` [2.6.22.2 review 08/84] SCTP scope_id handling fix Greg KH
2007-08-07 20:43   ` [2.6.22.2 review 09/84] Fix rfkill IRQ flags Greg KH
2007-08-07 21:37     ` Jan Engelhardt
2007-08-09  5:24       ` Alexey Dobriyan
2007-08-07 20:43   ` [2.6.22.2 review 10/84] gen estimator timer unload race Greg KH
2007-08-07 20:43   ` [2.6.22.2 review 11/84] gen estimator deadlock fix Greg KH
2007-08-07 20:43   ` [2.6.22.2 review 12/84] Fix error queue socket lookup in ipv6 Greg KH
2007-08-07 20:43   ` [2.6.22.2 review 13/84] Fix ipv6 link down handling Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 14/84] Netpoll leak Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 15/84] Sparc64 bootup assembler bug Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 16/84] Fix ipv6 tunnel endianness bug Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 17/84] Fix sparc32 memset() Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 18/84] Fix sparc32 udelay() rounding errors Greg KH
2007-08-07 21:41     ` Jan Engelhardt
2007-08-07 20:44   ` [2.6.22.2 review 19/84] Fix TCP IPV6 MD5 bug Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 20/84] KVM: SVM: Reliably detect if SVM was disabled by BIOS Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 21/84] USB: fix warning caused by autosuspend counter going negative Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 22/84] usb-serial: Fix edgeport regression on non-EPiC devices Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 23/84] Fix reported task file values in sense data Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 24/84] aacraid: fix security hole Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 25/84] firewire: fw-sbp2: set correct maximum payload (fixes CardBus adapters) Greg KH
2007-08-07 20:44   ` [2.6.22.2 review 26/84] make timerfd return a u64 and fix the __put_user Greg KH
2007-08-07 21:44     ` Jan Engelhardt
2007-08-07 20:45   ` [2.6.22.2 review 27/84] V4L: Add check for valid control ID to v4l2_ctrl_next Greg KH
2007-08-07 20:45   ` [2.6.22.2 review 28/84] V4L: ivtv: fix broken VBI output support Greg KH
2007-08-07 20:45   ` [2.6.22.2 review 29/84] V4L: ivtv: fix DMA timeout when capturing VBI + another stream Greg KH
2007-08-07 20:45   ` [2.6.22.2 review 30/84] V4L: ivtv: Add locking to ensure stream setup is atomic Greg KH
2007-08-07 20:45   ` [2.6.22.2 review 31/84] V4L: wm8775/wm8739: Fix memory leak when unloading module Greg KH
2007-08-07 20:45   ` [2.6.22.2 review 32/84] Input: lifebook - fix an oops on Panasonic CF-18 Greg KH
2007-08-07 20:45   ` [2.6.22.2 review 33/84] splice: fix double page unlock Greg KH
2007-08-07 20:45   ` [2.6.22.2 review 34/84] drm/i915: Fix i965 secured batchbuffer usage (CVE-2007-3851) Greg KH
2007-08-07 20:45   ` [2.6.22.2 review 35/84] Fix leak on /proc/lockdep_stats Greg KH
2007-08-07 20:45   ` Greg KH
2007-08-07 20:45   ` [2.6.22.2 review 36/84] CPU online file permission Greg KH
2007-08-07 20:45   ` [2.6.22.2 review 37/84] Fix user struct leakage with locked IPC shem segment Greg KH
2007-08-07 20:46   ` [2.6.22.2 review 38/84] md: handle writes to broken raid10 arrays gracefully Greg KH
2007-08-07 20:46   ` [2.6.22.2 review 39/84] md: raid10: fix use-after-free of bio Greg KH
2007-08-07 20:46   ` [2.6.22.2 review 40/84] pcmcia: give socket time to power down Greg KH
2007-08-07 20:46   ` [2.6.22.2 review 41/84] Fix leaks on /proc/{*/sched, sched_debug, timer_list, timer_stats} Greg KH
2007-08-07 20:46   ` [2.6.22.2 review 42/84] futex: pass nr_wake2 to futex_wake_op Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 43/84] "ext4_ext_put_in_cache" uses __u32 to receive physical block number Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 44/84] Include serial_reg.h with userspace headers Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 45/84] dm io: fix panic on large request Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 46/84] i386: HPET, check if the counter works Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 47/84] fw-ohci: fix "scheduling while atomic" Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 48/84] firewire: fix memory leak of fw_request instances Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 49/84] softmac: Fix ESSID problem Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 50/84] eCryptfs: ecryptfs_setattr() bugfix Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 51/84] nfsd: fix possible read-ahead cache and export table corruption Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 52/84] readahead: MIN_RA_PAGES/MAX_RA_PAGES macros Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 53/84] fs: 9p/conv.c error path fix Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 54/84] forcedeth bug fix: cicada phy Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 55/84] forcedeth bug fix: vitesse phy Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 56/84] forcedeth bug fix: realtek phy Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 57/84] acpi-cpufreq: Proper ReadModifyWrite of PERF_CTL MSR Greg KH
2007-08-07 20:47   ` [2.6.22.2 review 58/84] jbd commit: fix transaction dropping Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 59/84] jbd2 " Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 60/84] hugetlb: fix race in alloc_fresh_huge_page() Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 61/84] do not limit locked memory when RLIMIT_MEMLOCK is RLIM_INFINITY Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 62/84] uml: limit request size on COWed devices Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 63/84] sony-laptop: fix bug in event handling Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 64/84] destroy_workqueue() can livelock Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 65/84] drivers/video/macmodes.c:mac_find_mode() mustnt be __devinit Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 66/84] cfq-iosched: fix async queue behaviour Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 67/84] libata: add FUJITSU MHV2080BH to NCQ blacklist Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 68/84] ieee1394: revert "sbp2: enforce 32bit DMA mapping" Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 69/84] nfsd: fix possible oops on re-insertion of rpcsec_gss modules Greg KH
2007-08-07 20:48   ` [2.6.22.2 review 70/84] dm raid1: fix status Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 71/84] dm io: fix another panic on large request Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 72/84] dm snapshot: permit invalid activation Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 73/84] dm: disable barriers Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 74/84] cr_backlight_probe() allocates too little storage for struct cr_panel Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 75/84] ACPI: dock: fix opps after dock driver fails to initialize Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 76/84] Hangup TTY before releasing rfcomm_dev Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 77/84] Keep rfcomm_dev on the list until it is freed Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 78/84] nf_conntrack: dont track locally generated special ICMP error Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 79/84] IPV6: /proc/net/anycast6 unbalanced inet6_dev refcnt Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 80/84] sysfs: release mutex when kmalloc() failed in sysfs_open_file() Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 81/84] Netfilter: Fix logging regression Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 82/84] USB: fix for ftdi_sio quirk handling Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 83/84] sx: switch subven and subid values Greg KH
2007-08-07 20:49   ` [2.6.22.2 review 84/84] UML: exports for hostfs Greg KH
2007-08-07 21:11   ` [2.6.22.2 review 00/84] 2.6.22.2 -stable review 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=20070807204253.GF23028@kroah.com \
    --to=gregkh@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=bunk@stusta.de \
    --cc=cavokz@gmail.com \
    --cc=cebbert@redhat.com \
    --cc=chuckw@quantumlinux.com \
    --cc=davej@redhat.com \
    --cc=davem@davemloft.net \
    --cc=jmforbes@linuxtx.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mkrufky@linuxtv.org \
    --cc=rdunlap@xenotime.net \
    --cc=reviews@ml.cw.f00f.org \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=tytso@mit.edu \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).