All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Jeffy Chen <jeffy.chen@rock-chips.com>,
	AL Yu-Chen Cho <acho@suse.com>,
	Rohit Vaswani <rvaswani@nvidia.com>,
	Marcel Holtmann <marcel@holtmann.org>,
	Jiri Slaby <jslaby@suse.cz>
Subject: [PATCH 4.4 35/53] Bluetooth: hidp: fix possible might sleep error in hidp_session_thread
Date: Mon, 28 Aug 2017 10:05:40 +0200	[thread overview]
Message-ID: <20170828080519.231393037@linuxfoundation.org> (raw)
In-Reply-To: <20170828080517.599193891@linuxfoundation.org>

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

------------------

From: Jeffy Chen <jeffy.chen@rock-chips.com>

commit 5da8e47d849d3d37b14129f038782a095b9ad049 upstream.

It looks like hidp_session_thread has same pattern as the issue reported in
old rfcomm:

	while (1) {
		set_current_state(TASK_INTERRUPTIBLE);
		if (condition)
			break;
		// may call might_sleep here
		schedule();
	}
	__set_current_state(TASK_RUNNING);

Which fixed at:
	dfb2fae Bluetooth: Fix nested sleeps

So let's fix it at the same way, also follow the suggestion of:
https://lwn.net/Articles/628628/

Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Tested-by: AL Yu-Chen Cho <acho@suse.com>
Tested-by: Rohit Vaswani <rvaswani@nvidia.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Cc: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 net/bluetooth/hidp/core.c |   33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

--- a/net/bluetooth/hidp/core.c
+++ b/net/bluetooth/hidp/core.c
@@ -36,6 +36,7 @@
 #define VERSION "1.2"
 
 static DECLARE_RWSEM(hidp_session_sem);
+static DECLARE_WAIT_QUEUE_HEAD(hidp_session_wq);
 static LIST_HEAD(hidp_session_list);
 
 static unsigned char hidp_keycode[256] = {
@@ -1068,12 +1069,12 @@ static int hidp_session_start_sync(struc
  * Wake up session thread and notify it to stop. This is asynchronous and
  * returns immediately. Call this whenever a runtime error occurs and you want
  * the session to stop.
- * Note: wake_up_process() performs any necessary memory-barriers for us.
+ * Note: wake_up_interruptible() performs any necessary memory-barriers for us.
  */
 static void hidp_session_terminate(struct hidp_session *session)
 {
 	atomic_inc(&session->terminate);
-	wake_up_process(session->task);
+	wake_up_interruptible(&hidp_session_wq);
 }
 
 /*
@@ -1180,7 +1181,9 @@ static void hidp_session_run(struct hidp
 	struct sock *ctrl_sk = session->ctrl_sock->sk;
 	struct sock *intr_sk = session->intr_sock->sk;
 	struct sk_buff *skb;
+	DEFINE_WAIT_FUNC(wait, woken_wake_function);
 
+	add_wait_queue(&hidp_session_wq, &wait);
 	for (;;) {
 		/*
 		 * This thread can be woken up two ways:
@@ -1188,12 +1191,10 @@ static void hidp_session_run(struct hidp
 		 *    session->terminate flag and wakes this thread up.
 		 *  - Via modifying the socket state of ctrl/intr_sock. This
 		 *    thread is woken up by ->sk_state_changed().
-		 *
-		 * Note: set_current_state() performs any necessary
-		 * memory-barriers for us.
 		 */
-		set_current_state(TASK_INTERRUPTIBLE);
 
+		/* Ensure session->terminate is updated */
+		smp_mb__before_atomic();
 		if (atomic_read(&session->terminate))
 			break;
 
@@ -1227,11 +1228,22 @@ static void hidp_session_run(struct hidp
 		hidp_process_transmit(session, &session->ctrl_transmit,
 				      session->ctrl_sock);
 
-		schedule();
+		wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
 	}
+	remove_wait_queue(&hidp_session_wq, &wait);
 
 	atomic_inc(&session->terminate);
-	set_current_state(TASK_RUNNING);
+
+	/* Ensure session->terminate is updated */
+	smp_mb__after_atomic();
+}
+
+static int hidp_session_wake_function(wait_queue_t *wait,
+				      unsigned int mode,
+				      int sync, void *key)
+{
+	wake_up_interruptible(&hidp_session_wq);
+	return false;
 }
 
 /*
@@ -1244,7 +1256,8 @@ static void hidp_session_run(struct hidp
 static int hidp_session_thread(void *arg)
 {
 	struct hidp_session *session = arg;
-	wait_queue_t ctrl_wait, intr_wait;
+	DEFINE_WAIT_FUNC(ctrl_wait, hidp_session_wake_function);
+	DEFINE_WAIT_FUNC(intr_wait, hidp_session_wake_function);
 
 	BT_DBG("session %p", session);
 
@@ -1254,8 +1267,6 @@ static int hidp_session_thread(void *arg
 	set_user_nice(current, -15);
 	hidp_set_timer(session);
 
-	init_waitqueue_entry(&ctrl_wait, current);
-	init_waitqueue_entry(&intr_wait, current);
 	add_wait_queue(sk_sleep(session->ctrl_sock->sk), &ctrl_wait);
 	add_wait_queue(sk_sleep(session->intr_sock->sk), &intr_wait);
 	/* This memory barrier is paired with wq_has_sleeper(). See

  parent reply	other threads:[~2017-08-28  8:15 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-28  8:05 [PATCH 4.4 00/53] 4.4.85-stable review Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 01/53] af_key: do not use GFP_KERNEL in atomic contexts Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 02/53] dccp: purge write queue in dccp_destroy_sock() Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 03/53] dccp: defer ccid_hc_tx_delete() at dismantle time Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 04/53] ipv4: fix NULL dereference in free_fib_info_rcu() Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 05/53] net_sched/sfq: update hierarchical backlog when drop packet Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 06/53] ipv4: better IP_MAX_MTU enforcement Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 07/53] sctp: fully initialize the IPv6 address in sctp_v6_to_addr() Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 08/53] tipc: fix use-after-free Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 09/53] ipv6: reset fn->rr_ptr when replacing route Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 10/53] ipv6: repair fib6 tree in failure case Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 11/53] tcp: when rearming RTO, if RTO time is in past then fire RTO ASAP Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 12/53] irda: do not leak initialized list.dev to userspace Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 13/53] net: sched: fix NULL pointer dereference when action calls some targets Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 14/53] net_sched: fix order of queue length updates in qdisc_replace() Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 15/53] mei: me: add broxton pci device ids Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 16/53] mei: me: add lewisburg " Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 17/53] Input: trackpoint - add new trackpoint firmware ID Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 18/53] Input: elan_i2c - add ELAN0602 ACPI ID to support Lenovo Yoga310 Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 19/53] ALSA: core: Fix unexpected error at replacing user TLV Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 20/53] ALSA: hda - Add stereo mic quirk for Lenovo G50-70 (17aa:3978) Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 21/53] ARCv2: PAE40: Explicitly set MSB counterpart of SLC region ops addresses Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 22/53] i2c: designware: Fix system suspend Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 24/53] drm/atomic: If the atomic check fails, return its value first Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 25/53] drm: rcar-du: lvds: Fix PLL frequency-related configuration Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 26/53] drm: rcar-du: lvds: Rename PLLEN bit to PLLON Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 27/53] drm: rcar-du: Fix crash in encoder failure error path Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 28/53] drm: rcar-du: Fix display timing controller parameter Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 29/53] drm: rcar-du: Fix H/V sync signal polarity configuration Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 30/53] tracing: Fix freeing of filter in create_filter() when set_str is false Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 31/53] cifs: Fix df output for users with quota limits Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 32/53] cifs: return ENAMETOOLONG for overlong names in cifs_open()/cifs_lookup() Greg Kroah-Hartman
2017-10-11 19:24   ` Ben Hutchings
2017-08-28  8:05 ` [PATCH 4.4 33/53] nfsd: Limit end of page list when decoding NFSv4 WRITE Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 34/53] perf/core: Fix group {cpu,task} validation Greg Kroah-Hartman
2017-08-28  8:05 ` Greg Kroah-Hartman [this message]
2017-09-26 15:32   ` [PATCH 4.4 35/53] Bluetooth: hidp: fix possible might sleep error in hidp_session_thread Ben Hutchings
2017-08-28  8:05 ` [PATCH 4.4 36/53] Bluetooth: cmtp: fix possible might sleep error in cmtp_session Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 37/53] Bluetooth: bnep: fix possible might sleep error in bnep_session Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 38/53] binder: use group leader instead of open thread Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 39/53] binder: Use wake up hint for synchronous transactions Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 40/53] ANDROID: binder: fix proc->tsk check Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 41/53] iio: imu: adis16480: Fix acceleration scale factor for adis16480 Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 42/53] iio: hid-sensor-trigger: Fix the race with user space powering up sensors Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 43/53] staging: rtl8188eu: add RNX-N150NUB support Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 44/53] ASoC: simple-card: dont fail if sysclk setting is not supported Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 45/53] ASoC: rsnd: disable SRC.out only when stop timing Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 46/53] ASoC: rsnd: avoid pointless loop in rsnd_mod_interrupt() Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 47/53] ASoC: rsnd: Add missing initialization of ADG req_rate Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 48/53] ASoC: rsnd: ssi: 24bit data needs right-aligned settings Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 49/53] ASoC: rsnd: dont call update callback if it was NULL Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 50/53] ntb_transport: fix qp count bug Greg Kroah-Hartman
2017-09-26 16:32   ` Ben Hutchings
2017-09-26 17:35     ` Logan Gunthorpe
2017-09-27  8:40       ` Greg Kroah-Hartman
2017-09-27 15:57         ` Logan Gunthorpe
2017-09-28  8:14           ` Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 51/53] ntb_transport: fix bug calculating num_qps_mw Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 52/53] ACPI: ioapic: Clear on-stack resource before using it Greg Kroah-Hartman
2017-08-28  8:05 ` [PATCH 4.4 53/53] ACPI / APEI: Add missing synchronize_rcu() on NOTIFY_SCI removal Greg Kroah-Hartman
2017-08-28 19:39 ` [PATCH 4.4 00/53] 4.4.85-stable review Shuah Khan
2017-08-29  0:09 ` Guenter Roeck

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=20170828080519.231393037@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=acho@suse.com \
    --cc=jeffy.chen@rock-chips.com \
    --cc=jslaby@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marcel@holtmann.org \
    --cc=rvaswani@nvidia.com \
    --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 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.