From: Greg KH <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Jens Axboe <axboe@kernel.dk>,
Chanho Min <chanho.min@lge.com>,
Namjae Jeon <linkinjeon@gmail.com>, Rabin Vincent <rabin@rab.in>,
Wu Fengguang <fengguang.wu@intel.com>
Subject: [22/28] backing-dev: fix wakeup timer races with bdi_unregister()
Date: Thu, 16 Feb 2012 16:55:56 -0800 [thread overview]
Message-ID: <20120217005537.010035539@linuxfoundation.org> (raw)
In-Reply-To: <20120217005609.GA17081@kroah.com>
3.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rabin Vincent <rabin@rab.in>
commit 2673b4cf5d59c3ee5e0c12f6d734d38770324dc4 upstream.
While 7a401a972df8e18 ("backing-dev: ensure wakeup_timer is deleted")
addressed the problem of the bdi being freed with a queued wakeup
timer, there are other races that could happen if the wakeup timer
expires after/during bdi_unregister(), before bdi_destroy() is called.
wakeup_timer_fn() could attempt to wakeup a task which has already has
been freed, or could access a NULL bdi->dev via the wake_forker_thread
tracepoint.
Cc: Jens Axboe <axboe@kernel.dk>
Reported-by: Chanho Min <chanho.min@lge.com>
Reviewed-by: Namjae Jeon <linkinjeon@gmail.com>
Signed-off-by: Rabin Vincent <rabin@rab.in>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
mm/backing-dev.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -318,7 +318,7 @@ static void wakeup_timer_fn(unsigned lon
if (bdi->wb.task) {
trace_writeback_wake_thread(bdi);
wake_up_process(bdi->wb.task);
- } else {
+ } else if (bdi->dev) {
/*
* When bdi tasks are inactive for long time, they are killed.
* In this case we have to wake-up the forker thread which
@@ -584,6 +584,8 @@ EXPORT_SYMBOL(bdi_register_dev);
*/
static void bdi_wb_shutdown(struct backing_dev_info *bdi)
{
+ struct task_struct *task;
+
if (!bdi_cap_writeback_dirty(bdi))
return;
@@ -604,9 +606,14 @@ static void bdi_wb_shutdown(struct backi
* unfreeze of the thread before calling kthread_stop(), otherwise
* it would never exet if it is currently stuck in the refrigerator.
*/
- if (bdi->wb.task) {
- thaw_process(bdi->wb.task);
- kthread_stop(bdi->wb.task);
+ spin_lock_bh(&bdi->wb_lock);
+ task = bdi->wb.task;
+ bdi->wb.task = NULL;
+ spin_unlock_bh(&bdi->wb_lock);
+
+ if (task) {
+ thaw_process(task);
+ kthread_stop(task);
}
}
@@ -627,7 +634,9 @@ static void bdi_prune_sb(struct backing_
void bdi_unregister(struct backing_dev_info *bdi)
{
- if (bdi->dev) {
+ struct device *dev = bdi->dev;
+
+ if (dev) {
bdi_set_min_ratio(bdi, 0);
trace_writeback_bdi_unregister(bdi);
bdi_prune_sb(bdi);
@@ -636,8 +645,12 @@ void bdi_unregister(struct backing_dev_i
if (!bdi_cap_flush_forker(bdi))
bdi_wb_shutdown(bdi);
bdi_debug_unregister(bdi);
- device_unregister(bdi->dev);
+
+ spin_lock_bh(&bdi->wb_lock);
bdi->dev = NULL;
+ spin_unlock_bh(&bdi->wb_lock);
+
+ device_unregister(dev);
}
}
EXPORT_SYMBOL(bdi_unregister);
next prev parent reply other threads:[~2012-02-17 0:55 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-17 0:56 [00/28] 3.2.7-stable review Greg KH
2012-02-17 0:55 ` [01/28] ixgbe: fix vf lookup Greg KH
2012-02-17 0:55 ` [02/28] igb: " Greg KH
2012-02-17 0:55 ` [03/28] perf evsel: Fix an issue where perf report fails to show the proper percentage Greg KH
2012-02-17 0:55 ` [04/28] perf tools: Fix perf stack to non executable on x86_64 Greg KH
2012-02-17 0:55 ` [05/28] drm/i915: Force explicit bpp selection for intel_dp_link_required Greg KH
2012-02-17 0:55 ` [06/28] drm/i915: no lvds quirk for AOpen MP45 Greg KH
2012-02-17 0:55 ` [07/28] ath9k: Fix kernel panic during driver initilization Greg KH
2012-02-17 0:55 ` [08/28] ath9k: fix a WEP crypto related regression Greg KH
2012-02-17 0:55 ` [09/28] ath9k_hw: fix a RTS/CTS timeout regression Greg KH
2012-02-17 0:55 ` [10/28] hwmon: (f75375s) Fix bit shifting in f75375_write16 Greg KH
2012-02-17 0:55 ` [11/28] net: enable TC35815 for MIPS again Greg KH
2012-02-17 0:55 ` [12/28] lib: proportion: lower PROP_MAX_SHIFT to 32 on 64-bit kernel Greg KH
2012-02-17 0:55 ` [13/28] relay: prevent integer overflow in relay_open() Greg KH
2012-02-17 0:55 ` [14/28] mac80211: timeout a single frame in the rx reorder buffer Greg KH
2012-02-17 0:55 ` [15/28] writeback: fix NULL bdi->dev in trace writeback_single_inode Greg KH
2012-02-17 0:55 ` [16/28] writeback: fix dereferencing NULL bdi->dev on trace_writeback_queue Greg KH
2012-02-17 0:55 ` [17/28] hwmon: (f75375s) Fix automatic pwm mode setting for F75373 & F75375 Greg KH
2012-02-17 0:55 ` [18/28] cifs: request oplock when doing open on lookup Greg KH
2012-02-17 0:55 ` [19/28] cifs: dont return error from standard_receive3 after marking response malformed Greg KH
2012-02-17 0:55 ` [20/28] crypto: sha512 - Use binary and instead of modulus Greg KH
2012-02-17 0:55 ` Greg KH
2012-02-17 0:55 ` [21/28] crypto: sha512 - Avoid stack bloat on i386 Greg KH
2012-02-17 0:55 ` Greg KH
2012-02-17 1:52 ` David Miller
2012-02-17 2:17 ` Greg KH
2012-02-17 2:28 ` Herbert Xu
2012-02-17 2:28 ` Herbert Xu
2012-02-17 2:37 ` Greg KH
2012-02-17 2:37 ` Greg KH
2012-02-17 2:54 ` David Miller
2012-02-17 3:30 ` Greg KH
2012-02-20 20:45 ` Greg KH
2012-02-17 0:55 ` Greg KH [this message]
2012-02-17 0:55 ` [23/28] ALSA: intel8x0: Fix default inaudible sound on Gateway M520 Greg KH
2012-02-17 0:55 ` [24/28] ALSA: hda - Fix initialization of secondary capture source on VT1705 Greg KH
2012-02-17 0:55 ` [25/28] ALSA: hda - Fix silent speaker output on Acer Aspire 6935 Greg KH
2012-02-17 0:56 ` [26/28] mmc: atmel-mci: save and restore sdioirq when soft reset is performed Greg KH
2012-02-17 0:56 ` [27/28] mmc: dw_mmc: Fix PIO mode with support of highmem Greg KH
2012-02-17 0:56 ` [28/28] xen pvhvm: do not remap pirqs onto evtchns if !xen_have_vector_callback Greg KH
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=20120217005537.010035539@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=axboe@kernel.dk \
--cc=chanho.min@lge.com \
--cc=fengguang.wu@intel.com \
--cc=linkinjeon@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rabin@rab.in \
--cc=stable@vger.kernel.org \
--cc=torvalds@linux-foundation.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.