From patchwork Sat Nov 30 06:15:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerry X-Patchwork-Id: 13922013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 693ACE7716D for ; Thu, 5 Dec 2024 15:31:32 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id F2AE16B00B5; Thu, 5 Dec 2024 10:19:28 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id A8AF86B013B; Thu, 5 Dec 2024 10:19:24 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D6C136B0139; Thu, 5 Dec 2024 10:19:14 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 90E5C6B0082 for ; Sat, 30 Nov 2024 01:32:42 -0500 (EST) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 1E00CA05C2 for ; Sat, 30 Nov 2024 06:32:42 +0000 (UTC) X-FDA: 82841792838.28.AA47887 Received: from m16.mail.163.com (m16.mail.163.com [117.135.210.3]) by imf22.hostedemail.com (Postfix) with ESMTP id 4F699C0002 for ; Sat, 30 Nov 2024 06:32:27 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=163.com header.s=s110527 header.b="QvD1k/+Y"; dmarc=pass (policy=none) header.from=163.com; spf=pass (imf22.hostedemail.com: domain of jerrydeng079@163.com designates 117.135.210.3 as permitted sender) smtp.mailfrom=jerrydeng079@163.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1732948351; a=rsa-sha256; cv=none; b=rjIfVzM9x/odjLDlI9uxvEhWt+o8qncySQsKp9CPvmf26Rm+rp0tkQHat1nENrxi023Wp0 2nxe7yGRCu31coZ46h5n5Hxs578X856sDo5tP+g3J+UetUeReeS2TsFvJ6/JCHFBWlnlsZ F/ISCa20AMJ9YAbZLKOS3TeNODGiMVQ= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=163.com header.s=s110527 header.b="QvD1k/+Y"; dmarc=pass (policy=none) header.from=163.com; spf=pass (imf22.hostedemail.com: domain of jerrydeng079@163.com designates 117.135.210.3 as permitted sender) smtp.mailfrom=jerrydeng079@163.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1732948351; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:references:dkim-signature; bh=OsyGnki5o6g212ZSCtqYRDaMbguZhKpJrnZFCLHi8p8=; b=H1ZJIx23pNbnglsqvyaZ8PyewPHtYPp2ALOsggN5XEatwH67F21IyoOVj8MsV+Y+KOw7px fUf5/xVK3UkQ/qWsLuOd5wVFGrPK9NHS4RhqccJokyizrtcqFptyV9QRQ1dgyQEnsQvCCq D3gxCdS/kGT4E6y+pFQXN4QVlXNaLgY= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-ID:MIME-Version; bh=OsyGn ki5o6g212ZSCtqYRDaMbguZhKpJrnZFCLHi8p8=; b=QvD1k/+Y2m+ebnDPeZnt2 0ikqIm/CJiR/MDYvDAeGr6NdTCdyeEyz/jDD1FMIco5CRksiSUFRDFr5vdecirr7 Ylj22BAgHz26iffppNuYmB9vtThCNNelL6L6iX2L1LNTkhG9sQY1nlw2WvwS7j1Q mLXeSda6sFcDvo20LruxXg= Received: from Jerry-PC.. (unknown [115.204.198.71]) by gzga-smtp-mtada-g0-1 (Coremail) with SMTP id _____wDnDxSbrUpnaUe5CA--.19233S2; Sat, 30 Nov 2024 14:16:12 +0800 (CST) From: Jerry To: akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Jerry Subject: Date: Sat, 30 Nov 2024 14:15:52 +0800 Message-ID: <20241130061552.78630-1-jerrydeng079@163.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-CM-TRANSID: _____wDnDxSbrUpnaUe5CA--.19233S2 X-Coremail-Antispam: 1Uf129KBjvJXoWxCw4fur1DZw4UJFy3GFW3Jrb_yoW7JF1kpF Wayw1FyrW8JFy7WrZ3CayUZF4a93yIkFW7Ary7Ga9IyrsxKF1jkFyavFy0yr10krZ8GrWa vr45trW7Gr48Cr7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07UhVy3UUUUU= X-Originating-IP: [115.204.198.71] X-CM-SenderInfo: xmhu25pghqwiixz6il2tof0z/1tbiNgOn22dKoZHLGAAAsH X-Stat-Signature: yawqknhxrisjw81ksiw41oinrqfck4cd X-Rspam-User: X-Rspamd-Queue-Id: 4F699C0002 X-Rspamd-Server: rspam08 X-HE-Tag: 1732948347-889480 X-HE-Meta: U2FsdGVkX19ErEX5lxWrytWmv0QddnGiCjvnBUC7kNK155i7CT9T4TRrisEjFuBolxahBEdA3guombbg7cx7hh7zOsC7tNDP4u+Jg4COBPtf+9j3GFQ4M2n7JaPN2QC1GulNoXpmNcT8n3NImyigyIdpuOI1rP9rEP7Xvf9ECZyeJe+DOwW40TpO891wBxDswhoFH7/w/EcNl+GmjULsTdEVBzSk9WNe5R6O6YvXVQUGcIk5yx4pXh78D6eSP/3j+pr/Vv4pG+5bfzdsQa8zIEOW9KNVjypFxIejfMlA4uaLZ7iD+qZgb2+f9vMA9JKGRSq29y7d8SOXl+2W0xImjMoRFIbIfSU2sP3JB6hXixUtWN9dpusRyjcj8y7QkAvinXlqszn5LSHpPZDPKl/rX54O3+AuDWTzI76zEA0vuSLKcR2BZosbb6PxLVbGOvmD6d2Hna/XveICkChaGPWOcD3W9gmDE4GWuDWgLPvKXoI+MY6DF1yGkEIl4VJpnj25y/BdFWJSuzj9E+X1YbUd90Mxyw501372qkLV2ZXE3+CZ5QRHneJiBKXpc5c+qkeS+qE3MjLCHJ0qMvYH4PbKedfC3jgqKqb3GG8WSn3dvwdvwB5KaNF8P4Q3i62jdBOlv0KD3wEBp+ZHgnMxOWjmNPxbPPSVKlSUiNdj5XhMLlMsqVlOp7xgxE9ClYCprcIocH+evFYVttBUSN/mLn4yA8KPAocU/veZZSl/GOqQGIGPrTONHyZg1Wp1XcDdLo33q9dMEA8ILgsfDRq/84bVEYGSBuWSlXXR8jp6rwSBbTnOuQpnzMWoC8RBgg+lDTyzHdDbOy8Hs/9ulV8f1lN8i2c6rtrdW/qXVih4nv9yli1+Yb/qw9JUMUf2SLOpnnwEimvUW2Snbgv1ROenGdOWzMtgScwdKDbqa+EluvsosxlTYrzQF+CpU1WSoRz+xKNX9WEoZhO8eqBzSXUVG60 kwYhyzwG uqJ6gw6cg82x6gF82De4sf7yyioNNCj5ccuTxMZ9ZYpahDRFn6O9xr8N9ylUy8T23qZPHQCITSxpzJH/rnPW4e7cUkySXvj5eerz9A+WSMtR4igK/6b+nMxFcZ5HpvgbWtRMWJ6DcH+5b2O3XvwOW0lhCFEpDSzKovQn1pctLt6glZZTS5SbHE9a4ihfrW3scwyBFXn0hJSiMHJnVRVBqJy9elcGQVSmrI7zI6K8Lzb4a3gW/D8KlcxgS5g7Ie/42fbSt3szP5iqfUfYWiy1LqTsntKsNxd1RGLBdgYareCLCMJRcaNB7pypynoF5KQWLYewwaJsA1pUmKd3cQJWLbe6q0y14YMJUNa4mZufzWGj9e+t+FigUV87lpMT9xDS7wgJkpU88tyfcd2Eq3BAivbvBlgeua/W0VzCAm8mrg4DqPGvG3TLFEY8kfuRIRoqwPSvjlysGYbyGW5NlCvRPdhZWgNu/6p4PER8qnfoD5coJV8CtCzfVdGX74uhXk8lkjXcYlFYkR2pC1XbxeZfKpzP/dXx2uDyH5CV+W2dNrh5OK4E= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Signed-off-by: Jerry --- mm/backing-dev.c | 1 + mm/filemap.c | 6 ++++- mm/page-writeback.c | 61 +++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/mm/backing-dev.c b/mm/backing-dev.c index dd08ab928..0b86bd980 100755 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -878,6 +878,7 @@ void bdi_unregister(struct backing_dev_info *bdi) /* make sure nobody finds us on the bdi_list anymore */ bdi_remove_from_list(bdi); wb_shutdown(&bdi->wb); + wake_up(&(bdi->wb_waitq)); cgwb_bdi_unregister(bdi); /* diff --git a/mm/filemap.c b/mm/filemap.c index 3b0d8c6dd..3282840f0 100755 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -3300,6 +3300,7 @@ ssize_t generic_perform_write(struct file *file, long status = 0; ssize_t written = 0; unsigned int flags = 0; + errseq_t err = 0; do { struct page *page; @@ -3368,8 +3369,11 @@ ssize_t generic_perform_write(struct file *file, } pos += copied; written += copied; - balance_dirty_pages_ratelimited(mapping); + err = errseq_check(&mapping->wb_err, 0); + if (err) + return err; + } while (iov_iter_count(i)); return written ? written : status; diff --git a/mm/page-writeback.c b/mm/page-writeback.c index b2c916474..e013a6d01 100755 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -146,6 +146,16 @@ struct dirty_throttle_control { unsigned long pos_ratio; }; + + +struct bdi_wq_callback_entry { + + struct task_struct *tsk; + struct wait_queue_entry wq_entry; + int bdi_unregister; +}; + + /* * Length of period for aging writeout fractions of bdis. This is an * arbitrarily chosen number. The longer the period, the slower fractions will @@ -1567,6 +1577,22 @@ static inline void wb_dirty_limits(struct dirty_throttle_control *dtc) } } + +static int wake_up_bdi_waitq(wait_queue_entry_t *wait, unsigned int mode, + int sync, void *key) +{ + + struct bdi_wq_callback_entry *bwce = + container_of(wait, struct bdi_wq_callback_entry, wq_entry); + + bwce->bdi_unregister = 1; + if (bwce->tsk) + wake_up_process(bwce->tsk); + + return 0; +} + + /* * balance_dirty_pages() must be called by processes which are generating dirty * data. It looks at the number of dirty pages in the machine and will force @@ -1574,7 +1600,7 @@ static inline void wb_dirty_limits(struct dirty_throttle_control *dtc) * If we're over `background_thresh' then the writeback threads are woken to * perform some writeout. */ -static void balance_dirty_pages(struct bdi_writeback *wb, +static int balance_dirty_pages(struct bdi_writeback *wb, unsigned long pages_dirtied) { struct dirty_throttle_control gdtc_stor = { GDTC_INIT(wb) }; @@ -1595,6 +1621,16 @@ static void balance_dirty_pages(struct bdi_writeback *wb, struct backing_dev_info *bdi = wb->bdi; bool strictlimit = bdi->capabilities & BDI_CAP_STRICTLIMIT; unsigned long start_time = jiffies; + struct bdi_wq_callback_entry bwce = {NULL}; + int ret = 0; + + + if (!test_bit(WB_registered, &wb->state)) + return -EIO; + + init_waitqueue_func_entry(&(bwce.wq_entry), wake_up_bdi_waitq); + bwce.tsk = current; + add_wait_queue(&(bdi->wb_waitq), &(bwce.wq_entry)); for (;;) { unsigned long now = jiffies; @@ -1816,6 +1852,12 @@ static void balance_dirty_pages(struct bdi_writeback *wb, wb->dirty_sleep = now; io_schedule_timeout(pause); + /* bid is unregister NULL, all bdi memory is illegal */ + if (bwce.bdi_unregister) { + ret = -EIO; + break; + } + current->dirty_paused_when = now + pause; current->nr_dirtied = 0; current->nr_dirtied_pause = nr_dirtied_pause; @@ -1843,12 +1885,15 @@ static void balance_dirty_pages(struct bdi_writeback *wb, if (fatal_signal_pending(current)) break; } + + if (bwce.bdi_unregister == 0) + remove_wait_queue(&(bdi->wb_waitq), &(bwce.wq_entry)); if (!dirty_exceeded && wb->dirty_exceeded) wb->dirty_exceeded = 0; if (writeback_in_progress(wb)) - return; + return ret; /* * In laptop mode, we wait until hitting the higher threshold before @@ -1859,10 +1904,12 @@ static void balance_dirty_pages(struct bdi_writeback *wb, * background_thresh, to keep the amount of dirty memory low. */ if (laptop_mode) - return; + return ret; if (nr_reclaimable > gdtc->bg_thresh) wb_start_background_writeback(wb); + + return ret; } static DEFINE_PER_CPU(int, bdp_ratelimits); @@ -1944,8 +1991,12 @@ void balance_dirty_pages_ratelimited(struct address_space *mapping) } preempt_enable(); - if (unlikely(current->nr_dirtied >= ratelimit)) - balance_dirty_pages(wb, current->nr_dirtied); + if (unlikely(current->nr_dirtied >= ratelimit)) { + + if (balance_dirty_pages(wb, current->nr_dirtied) < 0) + errseq_set(&(mapping->wb_err), -EIO); + + } wb_put(wb); }