diff --git a/kernel/hung_task.c b/kernel/hung_task.c index cff3ae8c818f..adc2c2ac9d94 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c @@ -204,8 +204,21 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout) } unlock: rcu_read_unlock(); - if (hung_task_show_lock) - debug_show_all_locks(); + if (hung_task_show_lock) { + pr_warn("\nShowing all threads with locks held in the system:\n"); + rcu_read_lock(); + for_each_process_thread(g, t) { + if (t->lockdep_depth && t != current) { + sched_show_task(t); + debug_show_held_locks(t); + touch_nmi_watchdog(); + touch_all_softlockup_watchdogs(); + } + } + rcu_read_unlock(); + pr_warn("\n"); + pr_warn("=============================================\n\n"); + } if (hung_task_show_all_bt) { hung_task_show_all_bt = false; diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 15a73b7fdd75..1a9ada411879 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -377,9 +377,8 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do bool cancel_scan; struct cfg80211_nan_func *func; - spin_lock_bh(&local->fq.lock); clear_bit(SDATA_STATE_RUNNING, &sdata->state); - spin_unlock_bh(&local->fq.lock); + synchronize_rcu(); /* flush _ieee80211_wake_txqs() */ cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; if (cancel_scan)