From e7b94f88bb4da4f086393381580273235db1940b Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Tue, 29 Jul 2014 01:30:15 +0000 Subject: [PATCH] [s390,s390x] 3215: fix hanging console issue (Closes: #747922) svn path=/dists/sid/linux/; revision=21640 --- debian/changelog | 1 + .../s390-3215-fix-hanging-console-issue.patch | 69 +++++++++++++++++++ debian/patches/series | 1 + 3 files changed, 71 insertions(+) create mode 100644 debian/patches/bugfix/s390/s390-3215-fix-hanging-console-issue.patch diff --git a/debian/changelog b/debian/changelog index 9ca5e1abe..4d5aa5968 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,6 +12,7 @@ linux (3.14.13-3) UNRELEASED; urgency=medium * [amd64] Make x32 syscall support conditional on a kernel parameter * [amd64] Enable X86_X32 (Closes: #708070) and X86_X32_DISABLED. Use the kernel parameter "syscall.x32=y" to enable support for x32. + * [s390,s390x] 3215: fix hanging console issue (Closes: #747922) -- Aurelien Jarno Fri, 25 Jul 2014 23:02:24 +0200 diff --git a/debian/patches/bugfix/s390/s390-3215-fix-hanging-console-issue.patch b/debian/patches/bugfix/s390/s390-3215-fix-hanging-console-issue.patch new file mode 100644 index 000000000..b9e7f5435 --- /dev/null +++ b/debian/patches/bugfix/s390/s390-3215-fix-hanging-console-issue.patch @@ -0,0 +1,69 @@ +From: Martin Schwidefsky +Date: Tue, 15 Jul 2014 17:53:12 +0200 +Subject: s390/3215: fix hanging console issue +Origin: https://git.kernel.org/cgit/linux/kernel/git/s390/linux.git/commit?id=26d766c60f4ea08cd14f0f3435a6db3d6cc2ae96 +Bug-Debian: https://bugs.debian.org/747922 + +The ccw_device_start in raw3215_start_io can fail. raw3215_try_io +does not check if the request could be started and removes any +pending timer. This can leave the system in a hanging state. +Check for pending request after raw3215_start_io and start a +timer if necessary. + +Signed-off-by: Martin Schwidefsky +--- + drivers/s390/char/con3215.c | 32 +++++++++++++++++--------------- + 1 file changed, 17 insertions(+), 15 deletions(-) + +diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c +index 5af7f0b..a6d47e5 100644 +--- a/drivers/s390/char/con3215.c ++++ b/drivers/s390/char/con3215.c +@@ -288,12 +288,16 @@ static void raw3215_timeout(unsigned long __data) + unsigned long flags; + + spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags); +- if (raw->flags & RAW3215_TIMER_RUNS) { +- del_timer(&raw->timer); +- raw->flags &= ~RAW3215_TIMER_RUNS; +- if (!(raw->port.flags & ASYNC_SUSPENDED)) { +- raw3215_mk_write_req(raw); +- raw3215_start_io(raw); ++ raw->flags &= ~RAW3215_TIMER_RUNS; ++ if (!(raw->port.flags & ASYNC_SUSPENDED)) { ++ raw3215_mk_write_req(raw); ++ raw3215_start_io(raw); ++ if ((raw->queued_read || raw->queued_write) && ++ !(raw->flags & RAW3215_WORKING) && ++ !(raw->flags & RAW3215_TIMER_RUNS)) { ++ raw->timer.expires = RAW3215_TIMEOUT + jiffies; ++ add_timer(&raw->timer); ++ raw->flags |= RAW3215_TIMER_RUNS; + } + } + spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags); +@@ -317,17 +321,15 @@ static inline void raw3215_try_io(struct raw3215_info *raw) + (raw->flags & RAW3215_FLUSHING)) { + /* execute write requests bigger than minimum size */ + raw3215_start_io(raw); +- if (raw->flags & RAW3215_TIMER_RUNS) { +- del_timer(&raw->timer); +- raw->flags &= ~RAW3215_TIMER_RUNS; +- } +- } else if (!(raw->flags & RAW3215_TIMER_RUNS)) { +- /* delay small writes */ +- raw->timer.expires = RAW3215_TIMEOUT + jiffies; +- add_timer(&raw->timer); +- raw->flags |= RAW3215_TIMER_RUNS; + } + } ++ if ((raw->queued_read || raw->queued_write) && ++ !(raw->flags & RAW3215_WORKING) && ++ !(raw->flags & RAW3215_TIMER_RUNS)) { ++ raw->timer.expires = RAW3215_TIMEOUT + jiffies; ++ add_timer(&raw->timer); ++ raw->flags |= RAW3215_TIMER_RUNS; ++ } + } + + /* diff --git a/debian/patches/series b/debian/patches/series index 8b1768c71..2851d5d44 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -112,3 +112,4 @@ features/mips/MIPS-Malta-support-powering-down.patch features/mips/MIPS-Loongson-3-Add-Loongson-LS3A-RS780E-1-way-machi.patch bugfix/x86/x86-reject-x32-executables-if-x32-abi-not-supported.patch features/x86/x86-make-x32-syscall-support-conditional.patch +bugfix/s390/s390-3215-fix-hanging-console-issue.patch