From: Rafael J. Wysocki Remove PF_NOFREEZE from the bluetooth threads, adding try_to_freeze() calls as required. Signed-off-by: Rafael J. Wysocki Acked-by: Pavel Machek Signed-off-by: Marcel Holtmann Cc: Oleg Nesterov Cc: Aneesh Kumar Cc: "Paul E. McKenney" Cc: Srivatsa Vaddagiri Cc: Gautham R Shenoy Signed-off-by: Andrew Morton --- net/bluetooth/bnep/core.c | 4 +++- net/bluetooth/cmtp/core.c | 4 +++- net/bluetooth/hidp/core.c | 4 +++- net/bluetooth/rfcomm/core.c | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff -puN net/bluetooth/bnep/core.c~freezer-remove-pf_nofreeze-from-bluetooth-threads net/bluetooth/bnep/core.c --- a/net/bluetooth/bnep/core.c~freezer-remove-pf_nofreeze-from-bluetooth-threads +++ a/net/bluetooth/bnep/core.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -474,11 +475,12 @@ static int bnep_session(void *arg) daemonize("kbnepd %s", dev->name); set_user_nice(current, -15); - current->flags |= PF_NOFREEZE; init_waitqueue_entry(&wait, current); add_wait_queue(sk->sk_sleep, &wait); while (!atomic_read(&s->killed)) { + try_to_freeze(); + set_current_state(TASK_INTERRUPTIBLE); // RX diff -puN net/bluetooth/cmtp/core.c~freezer-remove-pf_nofreeze-from-bluetooth-threads net/bluetooth/cmtp/core.c --- a/net/bluetooth/cmtp/core.c~freezer-remove-pf_nofreeze-from-bluetooth-threads +++ a/net/bluetooth/cmtp/core.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -287,11 +288,12 @@ static int cmtp_session(void *arg) daemonize("kcmtpd_ctr_%d", session->num); set_user_nice(current, -15); - current->flags |= PF_NOFREEZE; init_waitqueue_entry(&wait, current); add_wait_queue(sk->sk_sleep, &wait); while (!atomic_read(&session->terminate)) { + try_to_freeze(); + set_current_state(TASK_INTERRUPTIBLE); if (sk->sk_state != BT_CONNECTED) diff -puN net/bluetooth/hidp/core.c~freezer-remove-pf_nofreeze-from-bluetooth-threads net/bluetooth/hidp/core.c --- a/net/bluetooth/hidp/core.c~freezer-remove-pf_nofreeze-from-bluetooth-threads +++ a/net/bluetooth/hidp/core.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -547,13 +548,14 @@ static int hidp_session(void *arg) daemonize("khidpd_%04x%04x", vendor, product); set_user_nice(current, -15); - current->flags |= PF_NOFREEZE; init_waitqueue_entry(&ctrl_wait, current); init_waitqueue_entry(&intr_wait, current); add_wait_queue(ctrl_sk->sk_sleep, &ctrl_wait); add_wait_queue(intr_sk->sk_sleep, &intr_wait); while (!atomic_read(&session->terminate)) { + try_to_freeze(); + set_current_state(TASK_INTERRUPTIBLE); if (ctrl_sk->sk_state != BT_CONNECTED || intr_sk->sk_state != BT_CONNECTED) diff -puN net/bluetooth/rfcomm/core.c~freezer-remove-pf_nofreeze-from-bluetooth-threads net/bluetooth/rfcomm/core.c --- a/net/bluetooth/rfcomm/core.c~freezer-remove-pf_nofreeze-from-bluetooth-threads +++ a/net/bluetooth/rfcomm/core.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -1851,6 +1852,8 @@ static void rfcomm_worker(void) BT_DBG(""); while (!atomic_read(&terminate)) { + try_to_freeze(); + if (!test_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event)) { /* No pending events. Let's sleep. * Incoming connections and data will wake us up. */ @@ -1937,7 +1940,6 @@ static int rfcomm_run(void *unused) daemonize("krfcommd"); set_user_nice(current, -10); - current->flags |= PF_NOFREEZE; BT_DBG(""); _