From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Paul Gevers <elbrus@debian.org>,
Ben Hutchings <ben@decadent.org.uk>
Subject: [PATCH 3.4 10/88] Staging: speakup: Move pasting into a work item
Date: Mon, 9 Jun 2014 17:24:20 -0700 [thread overview]
Message-ID: <20140610002424.882040362@linuxfoundation.org> (raw)
In-Reply-To: <20140610002424.500996570@linuxfoundation.org>
3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <ben@decadent.org.uk>
commit d7500135802ca55b3f4e01a16544e8b34082f8c3 upstream.
Input is handled in softirq context, but when pasting we may
need to sleep. speakup_paste_selection() currently tries to
bodge this by busy-waiting if in_atomic(), but that doesn't
help because the ldisc may also sleep.
For bonus breakage, speakup_paste_selection() changes the
state of current, even though it's not running in process
context.
Move it into a work item and make sure to cancel it on exit.
References: https://bugs.debian.org/735202
References: https://bugs.debian.org/744015
Reported-by: Paul Gevers <elbrus@debian.org>
Reported-and-tested-by: Jarek Czekalski <jarekczek@poczta.onet.pl>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/staging/speakup/main.c | 1
drivers/staging/speakup/selection.c | 40 +++++++++++++++++++++++++++++-------
drivers/staging/speakup/speakup.h | 1
3 files changed, 35 insertions(+), 7 deletions(-)
--- a/drivers/staging/speakup/main.c
+++ b/drivers/staging/speakup/main.c
@@ -2219,6 +2219,7 @@ static void __exit speakup_exit(void)
unregister_keyboard_notifier(&keyboard_notifier_block);
unregister_vt_notifier(&vt_notifier_block);
speakup_unregister_devsynth();
+ speakup_cancel_paste();
del_timer(&cursor_timer);
kthread_stop(speakup_task);
speakup_task = NULL;
--- a/drivers/staging/speakup/selection.c
+++ b/drivers/staging/speakup/selection.c
@@ -3,6 +3,8 @@
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/selection.h>
+#include <linux/workqueue.h>
+#include <asm/cmpxchg.h>
#include "speakup.h"
@@ -121,20 +123,24 @@ int speakup_set_selection(struct tty_str
return 0;
}
-/* TODO: move to some helper thread, probably. That'd fix having to check for
- * in_atomic(). */
-int speakup_paste_selection(struct tty_struct *tty)
-{
+struct speakup_paste_work {
+ struct work_struct work;
+ struct tty_struct *tty;
+};
+
+static void __speakup_paste_selection(struct work_struct *work)
+{
+ struct speakup_paste_work *spw =
+ container_of(work, struct speakup_paste_work, work);
+ struct tty_struct *tty = xchg(&spw->tty, NULL);
struct vc_data *vc = (struct vc_data *) tty->driver_data;
int pasted = 0, count;
DECLARE_WAITQUEUE(wait, current);
+
add_wait_queue(&vc->paste_wait, &wait);
while (sel_buffer && sel_buffer_lth > pasted) {
set_current_state(TASK_INTERRUPTIBLE);
if (test_bit(TTY_THROTTLED, &tty->flags)) {
- if (in_atomic())
- /* if we are in an interrupt handler, abort */
- break;
schedule();
continue;
}
@@ -146,6 +152,26 @@ int speakup_paste_selection(struct tty_s
}
remove_wait_queue(&vc->paste_wait, &wait);
current->state = TASK_RUNNING;
+ tty_kref_put(tty);
+}
+
+static struct speakup_paste_work speakup_paste_work = {
+ .work = __WORK_INITIALIZER(speakup_paste_work.work,
+ __speakup_paste_selection)
+};
+
+int speakup_paste_selection(struct tty_struct *tty)
+{
+ if (cmpxchg(&speakup_paste_work.tty, NULL, tty) != NULL)
+ return -EBUSY;
+
+ tty_kref_get(tty);
+ schedule_work_on(WORK_CPU_UNBOUND, &speakup_paste_work.work);
return 0;
}
+void speakup_cancel_paste(void)
+{
+ cancel_work_sync(&speakup_paste_work.work);
+ tty_kref_put(speakup_paste_work.tty);
+}
--- a/drivers/staging/speakup/speakup.h
+++ b/drivers/staging/speakup/speakup.h
@@ -84,6 +84,7 @@ extern void synth_buffer_clear(void);
extern void speakup_clear_selection(void);
extern int speakup_set_selection(struct tty_struct *tty);
extern int speakup_paste_selection(struct tty_struct *tty);
+extern void speakup_cancel_paste(void);
extern void speakup_register_devsynth(void);
extern void speakup_unregister_devsynth(void);
extern void synth_write(const char *buf, size_t count);
next prev parent reply other threads:[~2014-06-10 0:22 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-10 0:24 [PATCH 3.4 00/88] 3.4.93-stable review Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 01/88] sched: Use CPUPRI_NR_PRIORITIES instead of MAX_RT_PRIO in cpupri check Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 02/88] perf: Prevent false warning in perf_swevent_add Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 03/88] perf: Limit perf_event_attr::sample_period to 63 bits Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 04/88] perf: Fix race in removing an event Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 05/88] mm/memory-failure.c: fix memory leak by race between poison and unpoison Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 06/88] ARM: 8051/1: put_user: fix possible data corruption in put_user Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 07/88] sched: Fix hotplug vs. set_cpus_allowed_ptr() Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 08/88] md: always set MD_RECOVERY_INTR when aborting a reshape or other "resync" Greg Kroah-Hartman
2014-06-10 0:24 ` Greg Kroah-Hartman [this message]
2014-06-10 0:24 ` [PATCH 3.4 11/88] ALSA: hda/realtek - Correction of fixup codes for PB V7900 laptop Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 12/88] ALSA: hda/realtek - Fix COEF widget NID for ALC260 replacer fixup Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 13/88] USB: ftdi_sio: add NovaTech OrionLXm product ID Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 14/88] USB: serial: option: add support for Novatel E371 PCIe card Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 15/88] USB: io_ti: fix firmware download on big-endian machines (part 2) Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 16/88] USB: Avoid runtime suspend loops for HCDs that cant handle suspend/resume Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 17/88] mm: rmap: fix use-after-free in __put_anon_vma Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 18/88] Bluetooth: Fix missing length checks for L2CAP signalling PDUs Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 19/88] Bluetooth: Fix invalid length check in l2cap_information_rsp() Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 20/88] Bluetooth: Support AR3011 in Acer Iconia Tab W500 Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 21/88] Bluetooth: add support for atheros 0930:0219 Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 22/88] Bluetooth: add support for atheros 0489:e057 Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 23/88] Bluetooth: Add support for Foxconn/Hon Hai AR5BBU22 0489:E03C Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 24/88] Bluetooth: Add support for Sony Vaio T-Series Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 25/88] Bluetooth: Add USB_VENDOR_AND_INTERFACE_INFO() for Broadcom/Foxconn Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 26/88] Bluetooth: Add support for BCM20702A0 [04ca, 2003] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 27/88] Bluetooth: Add support for BCM20702A0 [0b05, 17b5] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 28/88] Bluetooth: Add support for IMC Networks [13d3:3393] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 29/88] Bluetooth: Add support for GC-WB300D PCIe [04ca:3006] to ath3k Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 30/88] Bluetooth: Add support for Foxconn / Hon Hai [0489:e04e] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 31/88] Bluetooth: Add support for Foxconn / Hon Hai [0489:e056] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 32/88] Bluetooth device 04ca:3008 should use ath3k Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 33/88] Bluetooth: Add support for atheros 04ca:3004 device to ath3k Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 34/88] Bluetooth: Device 0cf3:3008 should map AR 3012 Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 35/88] Bluetooth: Add support for Foxconn/Hon Hai [0489:e04d] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 36/88] Bluetooth: Add support for Mediatek Bluetooth device [0e8d:763f] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 37/88] Bluetooth: ath3k: Add support for Fujitsu Lifebook UH5x2 [04c5:1330] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 38/88] Bluetooth: ath3k: Add support for ID 0x13d3/0x3402 Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 39/88] Bluetooth: Add support for Atheros [0cf3:3121] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 40/88] Bluetooth: Add support for Atheros [0cf3:e003] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 41/88] Bluetooth: Add a new PID/VID 0cf3/e005 for AR3012 Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 42/88] Bluetooth: Add support for BCM20702A0 [0b05, 17cb] Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 43/88] virtio_blk: Drop unused request tracking list Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 44/88] virtio-blk: Fix hot-unplug race in remove method Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 45/88] virtio-blk: Call del_gendisk() before disable guest kick Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 46/88] virtio-blk: Reset device after blk_cleanup_queue() Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 47/88] mm: add kmap_to_page() Greg Kroah-Hartman
2014-06-10 1:15 ` Hugh Dickins
2014-06-10 1:21 ` Ben Hutchings
2014-06-10 8:04 ` Yijing Wang
2014-06-10 20:50 ` Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 48/88] mm: highmem: export kmap_to_page for modules Greg Kroah-Hartman
2014-06-10 0:24 ` [PATCH 3.4 49/88] virtio: 9p: correctly pass physical address to userspace for high pages Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 50/88] virtio-blk: Dont free ida when disk is in use Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 51/88] virtio_console: fix uapi header Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 52/88] virtio: console: rename cvq_lock to c_ivq_lock Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 53/88] virtio: console: add locking around c_ovq operations Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 54/88] nfsd: pass net to nfsd_init_socks() Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 55/88] nfsd: pass net to nfsd_startup() and nfsd_shutdown() Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 56/88] nfsd: pass net to nfsd_create_serv() Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 57/88] nfsd: pass net to nfsd_svc() Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 58/88] nfsd: pass net to nfsd_set_nrthreads() Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 59/88] nfsd: pass net to __write_ports() and down Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 60/88] nfsd: pass proper net to nfsd_destroy() from NFSd kthreads Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 61/88] nfsd: containerize NFSd filesystem Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 62/88] nfsd: check passed sockets net matches NFSd superblocks one Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 63/88] isci: Fix a race condition in the SSP task management path Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 64/88] mpt2sas: Fix for device scan following host reset could get stuck in a infinite loop Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 65/88] mpt2sas: Fix for issue Missing delay not getting set during system bootup Greg Kroah-Hartman
2014-06-10 1:04 ` Ben Hutchings
2014-06-10 0:25 ` [PATCH 3.4 66/88] hpsa: gen8plus Smart Array IDs Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 67/88] iscsi-target: Always send a response before terminating iSCSI connection Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 68/88] target/pscsi: fix return value check Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 69/88] target: Fix MAINTENANCE_IN service action CDB checks to use lower 5 bits Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 70/88] target: use correct sense code for LUN communication failure Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 71/88] target/file: Fix 32-bit highmem breakage for SGL -> iovec mapping Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 72/88] serial: pch_uart: fix tty-kref leak in dma-rx path Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 73/88] serial: pch_uart: fix tty-kref leak in rx-error path Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 74/88] tty: Correct tty buffer flush Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 75/88] Fix 4 port and add support for 8 port Unknown PCI serial port cards Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 76/88] 8250/16?50: Add support for Broadcom TruManage redirected serial port Greg Kroah-Hartman
2014-06-10 1:05 ` Ben Hutchings
2014-06-10 0:25 ` [PATCH 3.4 77/88] tty/serial: Add support for Altera " Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 78/88] xen/p2m: Move code around to allow for better re-usage Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 79/88] xen/p2m: Allow alloc_p2m_middle to call reserve_brk depending on argument Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 80/88] xen/p2m: Collapse early_alloc_p2m_middle redundant checks Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 81/88] xen/p2m: An early bootup variant of set_phys_to_machine Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 82/88] xen/setup: Populate freed MFNs from non-RAM E820 entries and gaps to E820 RAM Greg Kroah-Hartman
2014-06-10 9:07 ` David Vrabel
2014-06-10 9:30 ` Daniel Kiper
2014-06-10 13:18 ` David Vrabel
2014-06-10 18:45 ` Greg Kroah-Hartman
2014-06-10 19:39 ` Daniel Kiper
2014-06-10 20:44 ` Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 83/88] xen/setup: Combine the two hypercall functions - since they are quite similar Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 84/88] xen/setup: update VA mapping when releasing memory during setup Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 85/88] xen/balloon: Subtract from xen_released_pages the count that is populated Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 86/88] xen: populate correct number of pages when across mem boundary (v2) Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 87/88] xen/p2m: Reserve 8MB of _brk space for P2M leafs when populating back Greg Kroah-Hartman
2014-06-10 0:25 ` [PATCH 3.4 88/88] xen/p2m: Reuse existing P2M leafs if they are filled with 1:1 PFNs or INVALID Greg Kroah-Hartman
2014-06-10 15:13 ` [PATCH 3.4 00/88] 3.4.93-stable review Guenter Roeck
2014-06-10 18:45 ` Greg Kroah-Hartman
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=20140610002424.882040362@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=ben@decadent.org.uk \
--cc=elbrus@debian.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
/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