From patchwork Fri Apr 21 22:12:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 13220742 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 4672AC7618E for ; Fri, 21 Apr 2023 22:13:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BC27D6B0072; Fri, 21 Apr 2023 18:13:25 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B72F36B0074; Fri, 21 Apr 2023 18:13:25 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9EC5A6B0075; Fri, 21 Apr 2023 18:13:25 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 8F4246B0072 for ; Fri, 21 Apr 2023 18:13:25 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 5CB8F1C6785 for ; Fri, 21 Apr 2023 22:13:25 +0000 (UTC) X-FDA: 80706800370.28.F1F4EE8 Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) by imf26.hostedemail.com (Postfix) with ESMTP id 886CD140014 for ; Fri, 21 Apr 2023 22:13:23 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b="gWPYUh/q"; spf=pass (imf26.hostedemail.com: domain of dianders@chromium.org designates 209.85.210.174 as permitted sender) smtp.mailfrom=dianders@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1682115203; 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:in-reply-to:references:references:dkim-signature; bh=u/AkHMm2p+EP+a6U0DbEFYOuvSo1i83VDzuubdv1yU4=; b=OXR7aqaTKMfxJpoECgmc87x7qLecj+eW6YGGmkAlpFHOLoliOipWbl5yp0p/yQs02Moz6C NTdN/BqrmPXD4GIpYT/oSX9+nX+wd7uBoIdIYIJpBfAawlse7dhhErD+mpollUKFHSXOhF hygflRxltR6SAuSe/SLSb17LYX0YARY= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b="gWPYUh/q"; spf=pass (imf26.hostedemail.com: domain of dianders@chromium.org designates 209.85.210.174 as permitted sender) smtp.mailfrom=dianders@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1682115203; a=rsa-sha256; cv=none; b=2i8p+kbVmokgJlqpVXGx4L7UaA9HfUT5lnuzHJX92ys3OUybiIymJFlTACqM1y3568cHVE k/gbQ96JNgW++kY/CtoMJljiDNorl2BPQCtDckBTY4vru8V6bWP2WA6VxUiOnpKXRf9sLQ 8dk+CFzo6v73/rZAjTqLdYxqqbvTnEQ= Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-63b73203e0aso17102409b3a.1 for ; Fri, 21 Apr 2023 15:13:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1682115202; x=1684707202; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=u/AkHMm2p+EP+a6U0DbEFYOuvSo1i83VDzuubdv1yU4=; b=gWPYUh/qJS3hKUZOK+9h4MWoL8QjpqBENZF1/R77mtm+LeEDasMRdSowMwEpPxxS78 EP2q9aDYBJHna1dXO/vRjzhgMH3xXjajRzj+Gem3tqcctYYdBwGqaQ29Kog5RyRfy0yp UjVmuXQ923zKnlvwr5/ZYrwLOML+t858ymiAc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682115202; x=1684707202; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=u/AkHMm2p+EP+a6U0DbEFYOuvSo1i83VDzuubdv1yU4=; b=it2w4HnQ1JWsZGHoAMIFGe2LLRSYuoIaaT7qTcBwVZhrVZZ8zPL/D+kzf+nma6o6MA ueZXrbS/UtCijFXZqLSRGePebo6wrDIojQvf8XqswNrLyl5vOo7q3obImmAOV22daa0g W+zo6jSw4Ol6boFAiABvxy5Pa0/N9ea/CaQADsPCqZhsJg1teQaSCLCon8BpPXN5jYj8 YMDtQBAYV36Oc8xvKahPrl8hnbRgZWwp3hovDV6DxGUNtpBJCSLWzka9VEGOf8nNZ/pl z3F7YUeGLYyKcfdvIO20oZ6UFocCe5ISYPnN9dxflxhNOf2Hu94V4XJVkyekJPp1ZKr3 lW0Q== X-Gm-Message-State: AAQBX9eCKpiLPLJLOwStd0zI0neD6POx5DDeIUm1MZmuWvs9mCohbha8 zgM8eMMtTI2c55H5eSgpcx+BiQ== X-Google-Smtp-Source: AKy350bcHsIIY4k+lLMfZH1OxrXb0oxc9pTN/Ivx+wmbrGQA//e/eiBuiaIqWiD0BPfrEISD1XsY2A== X-Received: by 2002:a05:6a20:8426:b0:f0:8708:2341 with SMTP id c38-20020a056a20842600b000f087082341mr7837599pzd.26.1682115202268; Fri, 21 Apr 2023 15:13:22 -0700 (PDT) Received: from tictac2.mtv.corp.google.com ([2620:15c:9d:2:87cc:9018:e569:4a27]) by smtp.gmail.com with ESMTPSA id y72-20020a62644b000000b006372791d708sm3424715pfb.104.2023.04.21.15.13.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 15:13:21 -0700 (PDT) From: Douglas Anderson To: Andrew Morton , Mel Gorman , Vlastimil Babka , Ying , Alexander Viro , Christian Brauner Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Yu Zhao , linux-fsdevel@vger.kernel.org, Matthew Wilcox , Douglas Anderson Subject: [PATCH v2 1/4] mm/filemap: Add folio_lock_timeout() Date: Fri, 21 Apr 2023 15:12:45 -0700 Message-ID: <20230421151135.v2.1.I2b71e11264c5c214bc59744b9e13e4c353bc5714@changeid> X-Mailer: git-send-email 2.40.0.634.g4ca3ef3211-goog In-Reply-To: <20230421221249.1616168-1-dianders@chromium.org> References: <20230421221249.1616168-1-dianders@chromium.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: 886CD140014 X-Stat-Signature: oee6ocwris8xj631thzrknffanf7wf77 X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1682115203-336291 X-HE-Meta: U2FsdGVkX1+1vh7bszILVlOoMm3jZe/mGvrLIhmoNcYP9tUznXFiC9sW46g4jGSrupFjhAjlmu5zIhJb5VwwzlTwqUU8q6oCmoy77MUZhI0AArEd4WiusEt7xpI5e2e/hP2Z3HFWf1RAehxWDgPkoy5hn/M3tS9XTD2RZefcSq6GQncgvVaHmEb/iSO77WpRhvZLMIYosayy5eqQpn5KghkXj5DV1T2S3SWFJJANU5ksigiXgN/D/yYXssOR1lNGaJB9pF0vhZJiK1/idvHanmnJ0dEilL0D7JA+cRvsnMRhoXEyofBNQnz/T3y2lG9TwOhIash6pkKVmQcKcFhlqYA9V3kwfkAM+mNZrHLHuMrQiYl+xp4hR6PqWLHq0KuoJToDUvWYoJwcKvNlEVrfZcyEw5IhA8DghTXktxGichII4FRVf39kB0TYZLMvIm4DQUWG8zAwBqrvXUr0nJXYE2r6KH8W/ft/iK3cL3uHFv7PQLI1biH2jX12CX4YJGM0XXFVyzDyYjrsVFIpiVoIJFsCJYXWYE4OgDpb40dtt3svF/aRg4uVyoNQrNAaEfYdQWCxHFkkooDWnc36XOtI8TpymHAtg3ZJ64HrGHDlEFL3syWdKAG9KEPWatYnokGe2/loGmtRCR9qUWvQ7hDz1at35wtFZmjYY4y6iohz5Q5Bua+QrKhC+uCkwLau8yiUmVMLVEZDQujbbm6X/IED/l/PJZ/mffig/MlloRszdUKLNecDhpUWb6Z4X362kMdS+M2XQAl6298OZRIEA2x4DOG2oD3ax1upI8CIGJV4F4r3m+Hinc+zdtBi+YfrcE7CoNiM+jGrgw9jT6ycDjDo8EVPq1OPfjWv2bqUAkv69gUNJ7MbqFAkjAuR2szG+g/XxDp5sdp6YWXg/UNdvNWl5QHeveohEaIB5hri46n09vME5bKUUi6JrInNeTIm3Pd8xHiHcOL0CQndkMoyMpg 0DS4BdQL uq0Nsu8cYc7vpX3J8j3iKCOJhLRyZU8CKt272e9Ub7opDxJfuc4Nmez+fy+L4xYVofbzKl150QHsHKJhsVok6j2yOEGGM3gfNGR+cWFI/NRKsyNFZmdclq+91lpCwh97M0PAV4jMiux/LmyJ4dp+Z/271dCMBfw92mF5RA1Xfh7BA1stFb68LEyFaxp38QgvLMU21YISdcyJXxsPOEVvYWou8lVN01kVhlIS+nsuZk7jC/q0FzwchT5jTqzQTRa4wlLRUFAIm57PJlL5LwOWGNPKCYoPAPLEh31JIqB/2GeCFmm3sxkxzd3sudAShtYKd06iJ4OJYqDczu+Z695Mm1x6uvq+wIMr+JbP4NTkum/FIyHkTJ8uzXs83XUA5n97x/Zz5ux3enC+fx79P5C+HsXljYcHNw0OhuwI4tci9JMKnC+ERY4jqC1eO7z9Pp59dReqT2j2HbW3InCQ= 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: Add a variant of folio_lock() that can timeout. This is useful to avoid unbounded waits for the page lock in kcompactd. Signed-off-by: Douglas Anderson --- Changes in v2: - "Add folio_lock_timeout()" new for v2. include/linux/pagemap.h | 16 ++++++++++++++ mm/filemap.c | 47 +++++++++++++++++++++++++++++------------ 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 0acb8e1fb7af..0f3ef9f79300 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -892,6 +892,7 @@ static inline bool wake_page_match(struct wait_page_queue *wait_page, } void __folio_lock(struct folio *folio); +int __folio_lock_timeout(struct folio *folio, long timeout); int __folio_lock_killable(struct folio *folio); bool __folio_lock_or_retry(struct folio *folio, struct mm_struct *mm, unsigned int flags); @@ -952,6 +953,21 @@ static inline void folio_lock(struct folio *folio) __folio_lock(folio); } +/** + * folio_lock_timeout() - Lock this folio, with a timeout. + * @folio: The folio to lock. + * @timeout: The timeout in jiffies; %MAX_SCHEDULE_TIMEOUT means wait forever. + * + * Return: 0 upon success; -ETIMEDOUT upon failure. + */ +static inline int folio_lock_timeout(struct folio *folio, long timeout) +{ + might_sleep(); + if (!folio_trylock(folio)) + return __folio_lock_timeout(folio, timeout); + return 0; +} + /** * lock_page() - Lock the folio containing this page. * @page: The page to lock. diff --git a/mm/filemap.c b/mm/filemap.c index 2723104cc06a..c6056ec41284 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1220,7 +1220,7 @@ static inline bool folio_trylock_flag(struct folio *folio, int bit_nr, int sysctl_page_lock_unfairness = 5; static inline int folio_wait_bit_common(struct folio *folio, int bit_nr, - int state, enum behavior behavior) + int state, enum behavior behavior, long timeout) { wait_queue_head_t *q = folio_waitqueue(folio); int unfairness = sysctl_page_lock_unfairness; @@ -1229,6 +1229,7 @@ static inline int folio_wait_bit_common(struct folio *folio, int bit_nr, bool thrashing = false; unsigned long pflags; bool in_thrashing; + int err; if (bit_nr == PG_locked && !folio_test_uptodate(folio) && folio_test_workingset(folio)) { @@ -1295,10 +1296,13 @@ static inline int folio_wait_bit_common(struct folio *folio, int bit_nr, /* Loop until we've been woken or interrupted */ flags = smp_load_acquire(&wait->flags); if (!(flags & WQ_FLAG_WOKEN)) { + if (!timeout) + break; + if (signal_pending_state(state, current)) break; - io_schedule(); + timeout = io_schedule_timeout(timeout); continue; } @@ -1324,10 +1328,10 @@ static inline int folio_wait_bit_common(struct folio *folio, int bit_nr, } /* - * If a signal happened, this 'finish_wait()' may remove the last - * waiter from the wait-queues, but the folio waiters bit will remain - * set. That's ok. The next wakeup will take care of it, and trying - * to do it here would be difficult and prone to races. + * If a signal/timeout happened, this 'finish_wait()' may remove the + * last waiter from the wait-queues, but the folio waiters bit will + * remain set. That's ok. The next wakeup will take care of it, and + * trying to do it here would be difficult and prone to races. */ finish_wait(q, wait); @@ -1336,6 +1340,13 @@ static inline int folio_wait_bit_common(struct folio *folio, int bit_nr, psi_memstall_leave(&pflags); } + /* + * If we don't meet the success criteria below then we've got an error + * of some sort. Differentiate between the two error cases. If there's + * no time left it must have been a timeout. + */ + err = !timeout ? -ETIMEDOUT : -EINTR; + /* * NOTE! The wait->flags weren't stable until we've done the * 'finish_wait()', and we could have exited the loop above due @@ -1350,9 +1361,9 @@ static inline int folio_wait_bit_common(struct folio *folio, int bit_nr, * waiter, but an exclusive one requires WQ_FLAG_DONE. */ if (behavior == EXCLUSIVE) - return wait->flags & WQ_FLAG_DONE ? 0 : -EINTR; + return wait->flags & WQ_FLAG_DONE ? 0 : err; - return wait->flags & WQ_FLAG_WOKEN ? 0 : -EINTR; + return wait->flags & WQ_FLAG_WOKEN ? 0 : err; } #ifdef CONFIG_MIGRATION @@ -1442,13 +1453,15 @@ void migration_entry_wait_on_locked(swp_entry_t entry, pte_t *ptep, void folio_wait_bit(struct folio *folio, int bit_nr) { - folio_wait_bit_common(folio, bit_nr, TASK_UNINTERRUPTIBLE, SHARED); + folio_wait_bit_common(folio, bit_nr, TASK_UNINTERRUPTIBLE, SHARED, + MAX_SCHEDULE_TIMEOUT); } EXPORT_SYMBOL(folio_wait_bit); int folio_wait_bit_killable(struct folio *folio, int bit_nr) { - return folio_wait_bit_common(folio, bit_nr, TASK_KILLABLE, SHARED); + return folio_wait_bit_common(folio, bit_nr, TASK_KILLABLE, SHARED, + MAX_SCHEDULE_TIMEOUT); } EXPORT_SYMBOL(folio_wait_bit_killable); @@ -1467,7 +1480,8 @@ EXPORT_SYMBOL(folio_wait_bit_killable); */ static int folio_put_wait_locked(struct folio *folio, int state) { - return folio_wait_bit_common(folio, PG_locked, state, DROP); + return folio_wait_bit_common(folio, PG_locked, state, DROP, + MAX_SCHEDULE_TIMEOUT); } /** @@ -1662,17 +1676,24 @@ EXPORT_SYMBOL_GPL(page_endio); void __folio_lock(struct folio *folio) { folio_wait_bit_common(folio, PG_locked, TASK_UNINTERRUPTIBLE, - EXCLUSIVE); + EXCLUSIVE, MAX_SCHEDULE_TIMEOUT); } EXPORT_SYMBOL(__folio_lock); int __folio_lock_killable(struct folio *folio) { return folio_wait_bit_common(folio, PG_locked, TASK_KILLABLE, - EXCLUSIVE); + EXCLUSIVE, MAX_SCHEDULE_TIMEOUT); } EXPORT_SYMBOL_GPL(__folio_lock_killable); +int __folio_lock_timeout(struct folio *folio, long timeout) +{ + return folio_wait_bit_common(folio, PG_locked, TASK_KILLABLE, + EXCLUSIVE, timeout); +} +EXPORT_SYMBOL_GPL(__folio_lock_timeout); + static int __folio_lock_async(struct folio *folio, struct wait_page_queue *wait) { struct wait_queue_head *q = folio_waitqueue(folio); From patchwork Fri Apr 21 22:12:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 13220743 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 D7660C77B7E for ; Fri, 21 Apr 2023 22:13:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 755946B0075; Fri, 21 Apr 2023 18:13:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6DEF06B0078; Fri, 21 Apr 2023 18:13:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 532026B007B; Fri, 21 Apr 2023 18:13:28 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 3D09A6B0075 for ; Fri, 21 Apr 2023 18:13:28 -0400 (EDT) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 10D2A1606BE for ; Fri, 21 Apr 2023 22:13:28 +0000 (UTC) X-FDA: 80706800496.08.F7AFEA3 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) by imf07.hostedemail.com (Postfix) with ESMTP id 42D3F40008 for ; Fri, 21 Apr 2023 22:13:26 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=G4PoB7oj; spf=pass (imf07.hostedemail.com: domain of dianders@chromium.org designates 209.85.210.175 as permitted sender) smtp.mailfrom=dianders@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1682115206; 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:in-reply-to:references:references:dkim-signature; bh=q5AkNpnnC51XtdBu29L1YvEWhYLiet10/hNPEtnlk4k=; b=dTrZg9i55fA6z9jfPAS2ZM66+rZPz5tK1p7as9scwEEg+6jiIqIBsK2bnjQibQE4zjZUFg N8aOqxbOWSNp5TWpc+dB5JAJcedu27FzDvqWQAErKEfwusk1Lx8La3YsIAnfw7UmLxDmG3 bESwyz1V4dntOXn7BJ1mGJd32RcH3tE= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=G4PoB7oj; spf=pass (imf07.hostedemail.com: domain of dianders@chromium.org designates 209.85.210.175 as permitted sender) smtp.mailfrom=dianders@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1682115206; a=rsa-sha256; cv=none; b=Qv1VpwtHPGvOEOfME5xUxtiTS8uoZwvLHDezodc8hiQ9oIRO/eEggec+MoGwjf1gun4I4V pkdjWzKE5Ia+K0/hw7JX4qNxA5EJpLc8pONVVPUEPKBEnw8na+mbB2XiEZzr2lUsAtIvw5 lRIrUW+8fO/6VYS3Wz0J881JS+Yavqg= Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-63b64a32fd2so3665876b3a.2 for ; Fri, 21 Apr 2023 15:13:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1682115205; x=1684707205; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=q5AkNpnnC51XtdBu29L1YvEWhYLiet10/hNPEtnlk4k=; b=G4PoB7ojaq05ZoUvu0bGhZVqKkk7zuFsPAQngKsh3YkvxtolTqu1sE5QemG7mwI9bC +lav55U9fdGkURLbrLnJpkwmFYqt+QPV1H3FtmqsyKCWezQ4MHw4sDrMDuq7BBrcauHj vF1OEuZHKgdoBCROSFAfcnRZzV8U5N65M2Rkk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682115205; x=1684707205; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=q5AkNpnnC51XtdBu29L1YvEWhYLiet10/hNPEtnlk4k=; b=EFhKfmqW/tijQN8uyCwvap2ZqEdpkFs+u0qstn4n1Qq5NP5RdrEl5QXyjYYMLYFUNP 8sIAbqCf333YosqIdX+BsmzkqYH3Gh+hHtnxUtnmxec7cEQoBCiLdYExm6h2IFRPbNng 9miLaRfW7iXkYoMg2f/rSCtdvRBk2VmIUsi/+Vlt16F3TIvlz+pqemAkeSUy7y8VwZ/9 RltZ+KbNo42p3toPcO/1umzvkMtFS/dbR426qy1pPhKQpar0Dbe7ZXj9NMMg3ZbAJO0h 2WRYZJTzaF6+1JpoVvhJH51nfilXjHGinmJJi0wJvq/Nprdgk1p7gliYZGVS9Gm2+Kuo n6kQ== X-Gm-Message-State: AAQBX9fLGFN6n0VPe5V6Lzr1nnkoELOzTu+UJzkfm1AinzSAFKTDmjkQ l2KOGbP0Fir67DiwK4yfQkvMcA== X-Google-Smtp-Source: AKy350Zf5b8NMr8PvbXnnwZSXrydNzrK4lJ4UsMs/fDtsJnXPPkwv+LxUNSlTubSDT1jS6eyThlL9A== X-Received: by 2002:a05:6a00:1393:b0:63f:15cc:9c1a with SMTP id t19-20020a056a00139300b0063f15cc9c1amr6134194pfg.1.1682115205182; Fri, 21 Apr 2023 15:13:25 -0700 (PDT) Received: from tictac2.mtv.corp.google.com ([2620:15c:9d:2:87cc:9018:e569:4a27]) by smtp.gmail.com with ESMTPSA id y72-20020a62644b000000b006372791d708sm3424715pfb.104.2023.04.21.15.13.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 15:13:24 -0700 (PDT) From: Douglas Anderson To: Andrew Morton , Mel Gorman , Vlastimil Babka , Ying , Alexander Viro , Christian Brauner Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Yu Zhao , linux-fsdevel@vger.kernel.org, Matthew Wilcox , Douglas Anderson , Bart Van Assche , Ben Segall , Daniel Bristot de Oliveira , Dietmar Eggemann , Ingo Molnar , Jan Kara , Juri Lelli , Mel Gorman , Mikulas Patocka , Peter Zijlstra , "Ritesh Harjani (IBM)" , Steven Rostedt , Valentin Schneider , Vincent Guittot , Will Deacon , Zhang Yi Subject: [PATCH v2 2/4] buffer: Add lock_buffer_timeout() Date: Fri, 21 Apr 2023 15:12:46 -0700 Message-ID: <20230421151135.v2.2.Ie146eec4d41480ebeb15f0cfdfb3bc9095e4ebd9@changeid> X-Mailer: git-send-email 2.40.0.634.g4ca3ef3211-goog In-Reply-To: <20230421221249.1616168-1-dianders@chromium.org> References: <20230421221249.1616168-1-dianders@chromium.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 42D3F40008 X-Stat-Signature: p5btsaosxhhs3rmpe3diimcoqj9kwke1 X-HE-Tag: 1682115206-926695 X-HE-Meta: U2FsdGVkX19+AVCDyk0SuydCzOjEe42cIJr4nWMQGkr0q+PK0HVrQwt9auVVBde3DoNxKXnqMTWqUVRgHllQAhovGPJyVX4nduYN57FTLqNGSERNdoB1Nr/caTE11QdJJJKKbapn4k9geOEeJDsGPPjG+fNfrUvB/w7pC/qwqgvb0VG/CpMgIG4MYNiSz8VfYXe7hcYWNPTIJLDxOdwaLOHo2OMRMmLVB97QWyXtG+R0eiSdZKEkRgM0HcW3ECR6J6vOjniDO6p6Sk9FFiOmT/cW4NARKiOk5ScXOUWW/pQY1MiOfnqhlBR326gkFPvT7SL+IemLHzWYDkd+FPG/FPesxLX2CqY51Z0cuyK+Y8NfHOiw9DOXC6KXF+PwKuha4uCzqU6521fFjmHdmv6nu7dr2nFOOpLqZDwEorPSyURDtcFxEJawTR2KRJtCVyxvmw8/RRjuaDcZwswJ9bo8LixlddaTAUSWiik8A0CT1cseccMv3dzc3nBF0j/A9wCqaB5ME+EMYcmjwH9XhdQy/RQAPRwxOAQlq8P+9+vnsRnrwSCaQRzI0+JPulGIVpwOHY2sirq0kCN8DpKB3Z/xTqDOFF8NJRGnf0ZcaxiJTsSmIbe4w9X+fNlFuCSPKUUS6r+anNWL1F/zikEY7YIuteP/7GKRzdGC0xTJLqMnpBihseqWv3WXGhKksinqiGXkEkPTpiuOronzFgvJI0hScPQrianL5Kx/OK60Y11Q1Dr1iuKVFdUzLtNlYXsIO/ttt/jYSGnIfMoTrocDWSKDNv94KRZUYXOAxQlbME0cgO1TtqUwzGpd/gbFFNqhGbmC0+223wzc0RNZBuoVvJlAfaY1uyWfFu7oWBBTf3GxRl4xSXGdFF267GeWxV366ao17NH58da5CGXkS8vpTvK298+sSkxeNaHfZK/uai7oxPfSPr2ixGcZ6332sRZfYS2QVNlRlxJ0Gtkj3pLXigv pFU3rYg9 iNaOWxo2ij//2Rn0y6+nvmGFDLa6qxVcvs85jslZwwT2OlV1ru9wUAjvphSAQZ6K0vNQLsVD5xkjjXMFOjN03eDyFA5AvJl12rmuu0hfjL29s6mJikih1jzmYJo4PHThQj7Vd2F8iPzQ+Pp1JrQTfxp+8AKL9DFNw6FCc/zbqocK5mNQDI8F4YDFzKfi5ePtwfMYlB6x3rs5AEgZTOj1tBx9CZ/3dza++25bb/ZYsCmYs7FfsjVkC3i6KWMP3e2EBLSuzAcqYM97WWBwMtoitcsWcW8XDE39DIP94BcTx5FqVEIsVSaZBmzhb7NB94HrnkRYugFkEv5WTB7L81mQaNglpcr0GarF4dFFESFGqtuYaOD46qz1LreelIw0CHAqac49YCm4vPbVusX24WM93M1PJO4sEM8ZeK9EZMTDuyjufLoDWJN/N45ku99ZOcgGj+fHrao430xLXVNvutH8iIg+BTb291xt2ojJyx7PgMueS8vWeVY0HOYMl3i/vY1fTDdpHxO4n04nkfoI/lV38kpfV1A== 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: Add a variant of lock_buffer() that can timeout. This is useful to avoid unbounded waits for the page lock in kcompactd. Signed-off-by: Douglas Anderson --- Changes in v2: - "Add lock_buffer_timeout()" new for v2. fs/buffer.c | 7 +++++++ include/linux/buffer_head.h | 10 ++++++++++ include/linux/wait_bit.h | 24 ++++++++++++++++++++++++ kernel/sched/wait_bit.c | 14 ++++++++++++++ 4 files changed, 55 insertions(+) diff --git a/fs/buffer.c b/fs/buffer.c index 9e1e2add541e..fcd19c270024 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -71,6 +71,13 @@ void __lock_buffer(struct buffer_head *bh) } EXPORT_SYMBOL(__lock_buffer); +int __lock_buffer_timeout(struct buffer_head *bh, unsigned long timeout) +{ + return wait_on_bit_lock_io_timeout(&bh->b_state, BH_Lock, + TASK_UNINTERRUPTIBLE, timeout); +} +EXPORT_SYMBOL(__lock_buffer_timeout); + void unlock_buffer(struct buffer_head *bh) { clear_bit_unlock(BH_Lock, &bh->b_state); diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 8f14dca5fed7..2bae464f89d5 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -237,6 +237,7 @@ struct buffer_head *alloc_buffer_head(gfp_t gfp_flags); void free_buffer_head(struct buffer_head * bh); void unlock_buffer(struct buffer_head *bh); void __lock_buffer(struct buffer_head *bh); +int __lock_buffer_timeout(struct buffer_head *bh, unsigned long timeout); int sync_dirty_buffer(struct buffer_head *bh); int __sync_dirty_buffer(struct buffer_head *bh, blk_opf_t op_flags); void write_dirty_buffer(struct buffer_head *bh, blk_opf_t op_flags); @@ -400,6 +401,15 @@ static inline void lock_buffer(struct buffer_head *bh) __lock_buffer(bh); } +static inline int lock_buffer_timeout(struct buffer_head *bh, + unsigned long timeout) +{ + might_sleep(); + if (!trylock_buffer(bh)) + return __lock_buffer_timeout(bh, timeout); + return 0; +} + static inline struct buffer_head *getblk_unmovable(struct block_device *bdev, sector_t block, unsigned size) diff --git a/include/linux/wait_bit.h b/include/linux/wait_bit.h index 7725b7579b78..33f0f60b1c8c 100644 --- a/include/linux/wait_bit.h +++ b/include/linux/wait_bit.h @@ -30,6 +30,7 @@ void wake_up_bit(void *word, int bit); int out_of_line_wait_on_bit(void *word, int, wait_bit_action_f *action, unsigned int mode); int out_of_line_wait_on_bit_timeout(void *word, int, wait_bit_action_f *action, unsigned int mode, unsigned long timeout); int out_of_line_wait_on_bit_lock(void *word, int, wait_bit_action_f *action, unsigned int mode); +int out_of_line_wait_on_bit_lock_timeout(void *word, int, wait_bit_action_f *action, unsigned int mode, unsigned long timeout); struct wait_queue_head *bit_waitqueue(void *word, int bit); extern void __init wait_bit_init(void); @@ -208,6 +209,29 @@ wait_on_bit_lock_io(unsigned long *word, int bit, unsigned mode) return out_of_line_wait_on_bit_lock(word, bit, bit_wait_io, mode); } +/** + * wait_on_bit_lock_io_timeout - wait_on_bit_lock_io() with a timeout + * @word: the word being waited on, a kernel virtual address + * @bit: the bit of the word being waited on + * @mode: the task state to sleep in + * @timeout: the timeout in jiffies; %MAX_SCHEDULE_TIMEOUT means wait forever + * + * Returns zero if the bit was (eventually) found to be clear and was + * set. Returns non-zero if a timeout happened or a signal was delivered to + * the process and the @mode allows that signal to wake the process. + */ +static inline int +wait_on_bit_lock_io_timeout(unsigned long *word, int bit, unsigned mode, + unsigned long timeout) +{ + might_sleep(); + if (!test_and_set_bit(bit, word)) + return 0; + return out_of_line_wait_on_bit_lock_timeout(word, bit, + bit_wait_io_timeout, + mode, timeout); +} + /** * wait_on_bit_lock_action - wait for a bit to be cleared, when wanting to set it * @word: the word being waited on, a kernel virtual address diff --git a/kernel/sched/wait_bit.c b/kernel/sched/wait_bit.c index 0b1cd985dc27..629acd1c6c79 100644 --- a/kernel/sched/wait_bit.c +++ b/kernel/sched/wait_bit.c @@ -118,6 +118,20 @@ int __sched out_of_line_wait_on_bit_lock(void *word, int bit, } EXPORT_SYMBOL(out_of_line_wait_on_bit_lock); +int __sched out_of_line_wait_on_bit_lock_timeout(void *word, int bit, + wait_bit_action_f *action, + unsigned mode, + unsigned long timeout) +{ + struct wait_queue_head *wq_head = bit_waitqueue(word, bit); + DEFINE_WAIT_BIT(wq_entry, word, bit); + + wq_entry.key.timeout = jiffies + timeout; + + return __wait_on_bit_lock(wq_head, &wq_entry, action, mode); +} +EXPORT_SYMBOL(out_of_line_wait_on_bit_lock_timeout); + void __wake_up_bit(struct wait_queue_head *wq_head, void *word, int bit) { struct wait_bit_key key = __WAIT_BIT_KEY_INITIALIZER(word, bit); From patchwork Fri Apr 21 22:12:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 13220744 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 5F742C7618E for ; Fri, 21 Apr 2023 22:13:32 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id ECFFE6B0078; Fri, 21 Apr 2023 18:13:31 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E80506B007B; Fri, 21 Apr 2023 18:13:31 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D20FE6B007D; Fri, 21 Apr 2023 18:13:31 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id C3BD36B0078 for ; Fri, 21 Apr 2023 18:13:31 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id A3F70120497 for ; Fri, 21 Apr 2023 22:13:31 +0000 (UTC) X-FDA: 80706800622.14.B189F7E Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) by imf25.hostedemail.com (Postfix) with ESMTP id D0371A001F for ; Fri, 21 Apr 2023 22:13:28 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=AkSpP2B6; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf25.hostedemail.com: domain of dianders@chromium.org designates 209.85.210.169 as permitted sender) smtp.mailfrom=dianders@chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1682115208; 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:in-reply-to:references:references:dkim-signature; bh=u93zuMvcW9crJ3xx/ibodoPbhN86+1UwtbTmDpeZKPY=; b=dsxGJ3qPUaARHM3CGHW2Yv/8Rs/Ux1XTBfFvGXaCI9DUramKJHdwBU3adF4r7lJSUpSwzS 3oO0nKWN91ikUlW+QBkczqc5V9ctx0wd4v4eD0J3tTbxKII4RchaLZGgir8yUgTpnTrCdF 26L3dkgppSQzWE3lKkVpFQkfIiQAFxQ= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=AkSpP2B6; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf25.hostedemail.com: domain of dianders@chromium.org designates 209.85.210.169 as permitted sender) smtp.mailfrom=dianders@chromium.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1682115208; a=rsa-sha256; cv=none; b=nUqZnCRrGlqF9yhs5FNuSJ66o9Nc9TBoBeZl/JznSRPf9XQMEjBTTZXh9OMa+UCF3hwBIZ A8cmBSDehm2yfxboxXXNWaECmUB0e9QLM66vied36W0TOB4Mbec0oiqDhbS+qbtrqxhh6C cVBR0AgZTovlkXjloRru9JRZrU4P+d0= Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-63b4a64c72bso2269471b3a.0 for ; Fri, 21 Apr 2023 15:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1682115208; x=1684707208; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=u93zuMvcW9crJ3xx/ibodoPbhN86+1UwtbTmDpeZKPY=; b=AkSpP2B6MEWZUl0frTvsfsvLWFK8V1GAoZ0xgM/K0816fyASmzFYyukMou4sJkPvvQ x8m+0LZ0Kley490iLqLstsoKAwAWY4snWPkkl+IHwzXeFi5Wamq/VJvtD6G0iFq0oHV0 OAD4MLYCsMD/2Dj11rG/SZNFI7U3EbP8CQc1w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682115208; x=1684707208; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=u93zuMvcW9crJ3xx/ibodoPbhN86+1UwtbTmDpeZKPY=; b=LZyIOQQqvPR5CXYYtUjQ+U1NejaiwAf0RXpdcnSQ8W2nndpDF2escQ0l+4sQ/ozJEE Gz1B9w0M8Eolachy7aKujbAEpi+k7f+f+AO8aucVGnUIkDUInVRTxGjNyctP3KKWTQLL m3Q/5D1zFEZC72ex/A8AGCV1oM7TE50KTXYKfigaA9c2t7yGzGMj/LxT0BFWp0Mlottj /Aey4+8JKnb7iuZwICVAdCLhf8aDWDEWTUnMEkVNHpXyMj0jLqmB5WXcTYRgik+mPUCP nTYTIBBJisbW8JHTtBT39bpSy+x6VRS3rH0fz6kN1wK1NW91/S7VdCsb3UZiRXMfQ2aR ndCA== X-Gm-Message-State: AAQBX9c+UVwc5h3JBoFhEQeh9MQSiKjlyN8uAsZrphAINLod5NEZoSvK b90YBeLaWXlXLsQXKshos3RTcw== X-Google-Smtp-Source: AKy350YerkDyIlCdlYz+2bbDYDMPvivuf/02m3z67Um6oKR/8X1Rqic07nKJ4+CvFtUj6ZUAdN+jUw== X-Received: by 2002:a05:6a00:2196:b0:63a:5bcd:e580 with SMTP id h22-20020a056a00219600b0063a5bcde580mr8793160pfi.9.1682115207703; Fri, 21 Apr 2023 15:13:27 -0700 (PDT) Received: from tictac2.mtv.corp.google.com ([2620:15c:9d:2:87cc:9018:e569:4a27]) by smtp.gmail.com with ESMTPSA id y72-20020a62644b000000b006372791d708sm3424715pfb.104.2023.04.21.15.13.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 15:13:26 -0700 (PDT) From: Douglas Anderson To: Andrew Morton , Mel Gorman , Vlastimil Babka , Ying , Alexander Viro , Christian Brauner Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Yu Zhao , linux-fsdevel@vger.kernel.org, Matthew Wilcox , Douglas Anderson Subject: [PATCH v2 3/4] migrate_pages: Don't wait forever locking pages in MIGRATE_SYNC_LIGHT Date: Fri, 21 Apr 2023 15:12:47 -0700 Message-ID: <20230421151135.v2.3.Ia86ccac02a303154a0b8bc60567e7a95d34c96d3@changeid> X-Mailer: git-send-email 2.40.0.634.g4ca3ef3211-goog In-Reply-To: <20230421221249.1616168-1-dianders@chromium.org> References: <20230421221249.1616168-1-dianders@chromium.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: D0371A001F X-Stat-Signature: a3trx3re3f4n6ye8n89imxe7g4tikk9f X-HE-Tag: 1682115208-77729 X-HE-Meta: U2FsdGVkX19c+ymT7LNoUXgT7zj8NdOYFFPImVUWCrUvYOo/GYFdzbTq1HPsT2GSPkAcQYvLRw5Plj4QFD4Fo15G6pmc6Hfij50djG5sQqrtnd0YILW4YtxT1jMKqj2alAh9pNeFuePUTM2gX4iVO9uBg5S4fE5iE9YQzMrbD9taQ9vatc/udCX5bSYyXJrFXmlhyogn0j5S64DX609n/h/ntfwnI7eaw1t1ptUF8M1qlEJYQxouAHrFFqZFsz/OQQBQwAnhS/9lOfHubiGUvN23UCR84n5oZ1sK16f4qeugXyjV2RiZ3Xw1Amx9iaOtckAG7aIXDw2FrFJLBP/9BgAG94VGey8auqa6544yfZPtePqQLl3J7StREMtfBJQXbE4QC3vN41t2c1e2EE6KGZ5YaZR+b5H79wfT4e+rR/ZvBogvqbbgXR81Z77GHCoJg5BYzyp3uX/86E+pZx2fAvpcwck7KQAXKDJJX/12T3kn+jGeRm1xy4W8AZyw3CV7/65onvgDct6bjm9ivipidsloI/Ien2xHIxymxMfV17auzEkDq0hR/ho0ZeMrzdHyrs47j8ESiQzQ2hF78ytsYiIWeVfKLrEVIDfrcDuEaPE6oBfDtPQluRSiQ+qkWDzs9m9L/jmjQ7ypwzQRQc3m47l95xNCmHjtpZgfQSz5DgwEtEuHh8yDDnsU03gQt/uv5XMLr8Eo/JLHB2DYT/vFIYtgSIfI/DQfSWneDYICidU9n7sEtFpjmjPHyb1Zc1EjQQspwsyoPORYVgumuOcSpb+kMecUx1rQT3KLFGy/k82pqTi8QxRIAc01M45THQfNOQRhIcxt9UD6vve0MiPCW8rdH+QncsAb02FQMdnbzIVzYXOWaWaZf6BUM7EJ2ibxbB1ROHx8rL8+duAk+plsVTzSUQ2faeYzOd5PT0SnTmMDGa+esXQpBGx9SBn/N96cx0N+nWtkDdYWiGaHdQR lciIg4lg oBgJx8opkiLsDdIldqaIQUQIgoP4LITJkCaNOjwmkBKp+ZLDExW8fI5ejvKaqJtxicfOuZFxa4tdOCP4kwcigb6VoOcTDDxwv1fEGSvxehbV2Ocs/UAl7vZWW8rxMub6u/BDM1sNRoExg1XD1yo1RTByAU+ppnR08E2U7cAxcgM3hSdWfpD7Sx91RjjgBb1BOUJ+HCfi6G8ul2xYU4LxPoSpZE7Uf4tOtqonmgg8Dq8kAufJ6hcRzNKb0Au2WKOh5Pv+9VdIuACCLLsp311QOEcJ6EBsGKkI2KkJ/HjWbpwBkaUMEjo1R+jXQzYBIQaSFjhfzgUKXcAw6HyDQhp0lvDSj3Aty1dsefXiIyYAr2sd6JB/umMQnm5VP3owds9R5z09ki8q0kl9Toj31zPZyKLRbMzPvxKGKk5sn4ovad6uJRWQ5YgFUXTGL4bbtcvO1I0K4EubGAVLoWxkySMA03S1bydlYOfUDaxHpQB19on7rXGAUobNvtB27KSTx1kbJajCzVjXQwGcTMgs= 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: The MIGRATE_SYNC_LIGHT mode is intended to block for things that will finish quickly but not for things that will take a long time. Exactly how long is too long is not well defined, but waits of tens of milliseconds is likely non-ideal. Waiting on the folio lock in isolate_movable_page() is something that usually is pretty quick, but is not officially bounded. Nothing stops another process from holding a folio lock while doing an expensive operation. Having an unbounded wait like this is not within the design goals of MIGRATE_SYNC_LIGHT. When putting a Chromebook under memory pressure (opening over 90 tabs on a 4GB machine) it was fairly easy to see delays waiting for the lock of > 100 ms. While the laptop wasn't amazingly usable in this state, it was still limping along and this state isn't something artificial. Sometimes we simply end up with a lot of memory pressure. Putting the same Chromebook under memory pressure while it was running Android apps (though not stressing them) showed a much worse result (NOTE: this was on a older kernel but the codepaths here are similar). Android apps on ChromeOS currently run from a 128K-block, zlib-compressed, loopback-mounted squashfs disk. If we get a page fault from something backed by the squashfs filesystem we could end up holding a folio lock while reading enough from disk to decompress 128K (and then decompressing it using the somewhat slow zlib algorithms). That reading goes through the ext4 subsystem (because it's a loopback mount) before eventually ending up in the block subsystem. This extra jaunt adds extra overhead. Without much work I could see cases where we ended up blocked on a folio lock for over a second. With more more extreme memory pressure I could see up to 25 seconds. Let's bound the amount of time we can wait for the folio lock. The SYNC_LIGHT migration mode can already handle failure for things that are slow, so adding this timeout in is fairly straightforward. With this timeout, it can be seen that kcompactd can move on to more productive tasks if it's taking a long time to acquire a lock. NOTE: The reason I stated digging into this isn't because some benchmark had gone awry, but because we've received in-the-field crash reports where we have a hung task waiting on the page lock (which is the equivalent code path on old kernels). While the root cause of those crashes is likely unrelated and won't be fixed by this patch, analyzing those crash reports did point out this unbounded wait and it seemed like something good to fix. ALSO NOTE: the timeout mechanism used here uses "jiffies" and we also will retry up to 7 times. That doesn't give us much accuracy in specifying the timeout. On 1000 Hz machines we'll end up timing out in 7-14 ms. On 100 Hz machines we'll end up in 70-140 ms. Given that we don't have a strong definition of how long "too long" is, this is probably OK. Suggested-by: Mel Gorman Signed-off-by: Douglas Anderson --- Changes in v2: - Keep unbounded delay in "SYNC", delay with a timeout in "SYNC_LIGHT" mm/migrate.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/mm/migrate.c b/mm/migrate.c index db3f154446af..60982df71a93 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -58,6 +58,23 @@ #include "internal.h" +/* Returns the schedule timeout for a non-async mode */ +static long timeout_for_mode(enum migrate_mode mode) +{ + /* + * We'll always return 1 jiffy as the timeout. Since all places using + * this timeout are in a retry loop this means that the maximum time + * we might block is actually NR_MAX_MIGRATE_SYNC_RETRY jiffies. + * If a jiffy is 1 ms that's 7 ms, though with the accuracy of the + * timeouts it often ends up more like 14 ms; if a jiffy is 10 ms + * that's 70-140 ms. + */ + if (mode == MIGRATE_SYNC_LIGHT) + return 1; + + return MAX_SCHEDULE_TIMEOUT; +} + bool isolate_movable_page(struct page *page, isolate_mode_t mode) { struct folio *folio = folio_get_nontail_page(page); @@ -1162,7 +1179,8 @@ static int migrate_folio_unmap(new_page_t get_new_page, free_page_t put_new_page if (current->flags & PF_MEMALLOC) goto out; - folio_lock(src); + if (folio_lock_timeout(src, timeout_for_mode(mode))) + goto out; } locked = true; From patchwork Fri Apr 21 22:12:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 13220745 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 A0DDBC77B76 for ; Fri, 21 Apr 2023 22:13:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 35FCB6B007B; Fri, 21 Apr 2023 18:13:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 30E9E6B007D; Fri, 21 Apr 2023 18:13:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 13A646B007E; Fri, 21 Apr 2023 18:13:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id ED13F6B007B for ; Fri, 21 Apr 2023 18:13:32 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id B785D1C68A9 for ; Fri, 21 Apr 2023 22:13:32 +0000 (UTC) X-FDA: 80706800664.10.02A76EA Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) by imf06.hostedemail.com (Postfix) with ESMTP id F2703180011 for ; Fri, 21 Apr 2023 22:13:30 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=Bj7hb2g1; spf=pass (imf06.hostedemail.com: domain of dianders@chromium.org designates 209.85.210.175 as permitted sender) smtp.mailfrom=dianders@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1682115211; 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:in-reply-to:references:references:dkim-signature; bh=Dc5jbER8wEc7OW3/IotC+kA2A3o7OZfeQaN33ZlBlP4=; b=QxkIpUBZ5ocxcK3I2F3/jRo4PWRnQOE5jz9canlUEPkSAl3ueBPysDu/LeKqHb8qGt8mi9 BVBjQHAHw3phR9lZ82PDkNPaSkmfP8HKABmcsSXfi6m0z7gQig9o/g5EdpCBNyYqcua8bg AmlHZCQn9MbSYDbRnQiKfr8bZnK87SI= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=Bj7hb2g1; spf=pass (imf06.hostedemail.com: domain of dianders@chromium.org designates 209.85.210.175 as permitted sender) smtp.mailfrom=dianders@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1682115211; a=rsa-sha256; cv=none; b=zf9/t3WLqYf/po/X3m96lJnv7Si+yfhhpWcRwE0V1AIdYv0sf3r8YtO5xVMD8MzZJoruUj CQvpF5+APVJcPRn3yVlpoO8pqoVtkuws10cGOesDXIelHMgpWjqNqyjRYFZlSK8mfx+JhH RRKbDPaE1Yo4umFNs4BwSptC8go0ABU= Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-63b733fd00bso2308965b3a.0 for ; Fri, 21 Apr 2023 15:13:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1682115210; x=1684707210; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Dc5jbER8wEc7OW3/IotC+kA2A3o7OZfeQaN33ZlBlP4=; b=Bj7hb2g1Ygk+uI1Xxfx+Lf8COV76humjsOT5sJKw8qFdCUzNXODMPPSgSmVEXfumLP gUzdVnED6ugNaAcG2SKbDhlEqm5/AA1x3lyiaYtvzKe1z+7yY9FeeWZjZ4j8ZGNYMvpT nSEalWU0KsSv7vdtph2qjlryw/U/r62x/nUxA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682115210; x=1684707210; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Dc5jbER8wEc7OW3/IotC+kA2A3o7OZfeQaN33ZlBlP4=; b=jE+K3uanOtII22lOtGqVTTBOq+VdTAJ3P8eAe296NThPEj42QbCHjeA1q5PAlYRNJz GFMOhPfE32GP6iZysKNSKRjthz8ofkZSBxIx3RgK3dsqZMYkmZzfQsSb/U63OiQZE/Iy mJfyjFghmrNJcrVklypaJ7XJnZHpxtFb7qktKFy80qNR7QbS4OlmKLcusCKH7h0JiCh+ VykcEp+KMS6+yf72kacsdtrTA37kegNreTEl7iCttQ58p5mTs45zsdZttfRrjqMpEIq2 bz9vUOqcBQ40IGHaxJL2bwo9xT/JiVcI+mZuEVlq2jP6hTTK5jbp3QjEVXqnUJpDf3in aY0w== X-Gm-Message-State: AAQBX9df2ykAjdeEgGG8HD7RHYLQSHypUtRy3w7kXjdV969JRaxErSZY niFtPzOTKKMSSkqVRPOTh+cGwg== X-Google-Smtp-Source: AKy350aBr9TvmZeKHCBJSqIpG2B/nWcBgQOHXkcvQWceE4r02qrPTXFu3nXc3bs+0O5+8kUMfAUyog== X-Received: by 2002:a05:6a00:1a56:b0:63d:3789:733f with SMTP id h22-20020a056a001a5600b0063d3789733fmr8752575pfv.15.1682115209980; Fri, 21 Apr 2023 15:13:29 -0700 (PDT) Received: from tictac2.mtv.corp.google.com ([2620:15c:9d:2:87cc:9018:e569:4a27]) by smtp.gmail.com with ESMTPSA id y72-20020a62644b000000b006372791d708sm3424715pfb.104.2023.04.21.15.13.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Apr 2023 15:13:29 -0700 (PDT) From: Douglas Anderson To: Andrew Morton , Mel Gorman , Vlastimil Babka , Ying , Alexander Viro , Christian Brauner Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Yu Zhao , linux-fsdevel@vger.kernel.org, Matthew Wilcox , Douglas Anderson Subject: [PATCH v2 4/4] migrate_pages: Don't wait forever locking buffers in MIGRATE_SYNC_LIGHT Date: Fri, 21 Apr 2023 15:12:48 -0700 Message-ID: <20230421151135.v2.4.Ic39f0b16516acf4af1ce5d923150f93ee85a9398@changeid> X-Mailer: git-send-email 2.40.0.634.g4ca3ef3211-goog In-Reply-To: <20230421221249.1616168-1-dianders@chromium.org> References: <20230421221249.1616168-1-dianders@chromium.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: F2703180011 X-Stat-Signature: qe7zczxujbjja8r8n7uqmi85b4uyhtnd X-HE-Tag: 1682115210-655388 X-HE-Meta: U2FsdGVkX19SCwposeMsHNqFmtOBs8zTmvm4CuKmfNqUT6z/oggV/IZWuwal0L4bUMVMXs50lksNQ9c65z2wHnGtDAIIoDvEMk0/Z10xlq9f9VvLib47RqgHK762X6eLKFIRZcNQ1E+5Eo0nxsr3FQRTO61ccqiIRNe30yNC9wvG8pgVRhFnFHt1OihRZ8R4fjS2qWgOp/nJeAM9ECPJAM3P6K2HFjAnP7eQWi5FCA4jIaamgyUpViOkX6fYphetnBZ2XdL9fJnMhwuTuLPm2pUnKlrUWr9tCgL7dr7rvFB3NpsNTPfsLuTghbsdqVkn7o5Maf+z9dL5wbuGaWiw20ljaCpv82piQtV9KOqD86SD8XbX9WAB3GBOUWx0onUWQd2CUOymXPEgMnHU11MzzPAmSWkIKBopz7U1gMuSwvseYN5HH+N5rfTQT5ZGjrUmnuafVJk5koeeCdyrdV23+N4H3I1YZTQnZUcnBE9D8ZjJrs44LepyS65Oc/QtTnsPJc7Trm/VRiLpsraLLeWZkq+z/r9p/h4L7TZhywVEJG+rpYblzjk7290R0iQyFf7m5nsBcmV2P7pnIs0tEkAyEMxIvvY4eOZs2pF9FOA64/fjom3mNsWG5tHXQtsT5mm2+yz5sHL+eYrMhbyh/VQmcG3kpx8FPE72fqsWqRoYZ31oKoxrqn1uh4abNG2LiDU5eMWKOuyUIy41qBn1Ws7rlHPwZ0aYk+MvZtgC3dGyfsCgjJSlpZES+ly0VWDRzg3w7DDuIHMRyOSnwTQZ6dGXbEqJGIXuEFPZamNTHIQ88ehSO9wnz+g84kJzpSGq64KVfFRL5tN0YHDRPhbg1UbPgV59MAA0u57tWDM+9WnIFxLt4qGfZUZRQ5t3ACT+4M4jSWNBmLJl1fxqUzqbSwrW/1HbMnl4ZupBIlWe84dw6GyckUJzN7oNNaq7hcmqfeoZFdDg9GxtNGu5v1UdMHg /dDnGW2y +8fE2Cm7hrFzNmuu28MmsYNwBBsC1mfLnmeulqD6zcA60njHG0+ziqNWKdxLmiNW//FIyHKKH6snivoZZChidBQ1fzPCij42UrwJF4uDcMx+JDWgIDrRiMrrZ4ArGj8AdrwWgpzYHo24iaR9lhJ9W2it8BCHmoI+QBhXRbRC3GoF8qA6N0fGV7OZz312Ivniz+JEo9ecv57KDuenYyhPEZHFo14ofIB+u1p1h0hPAWphqwiniZY2wXJcYgCtp34mH6EuwHXIC3hjLTM+XhshzMNtKjjyB40L+TlT/Zb0ScryqeTFbc/uUtmCqK3Wm/nYsp3KoRJBKgjTyw/F47M2aKwsGCvWXrnvP9q2GdT+HACdvwRpIRab+MDK3dVN0AFkDP4QVe+rBrh6+1leJkB8CMAJSBObQXl9jgmZhDFws26ylFPvGqq6XSubkWqLbjUql3ukA8RDj5JStr+U= 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: Just as talked about in the patch ("migrate_pages: Don't wait forever locking pages in MIGRATE_SYNC_LIGHT"), we don't really want unbounded waits when we're running in MIGRATE_SYNC_LIGHT mode. Waiting on the buffer lock is a second such unbounded wait. Let's put a timeout on it. While measurement didn't show this wait to be quite as bad as the one waiting for the folio lock, it could still be measured to be over a second in some cases. Signed-off-by: Douglas Anderson --- Changes in v2: - "Don't wait forever locking buffers in MIGRATE_SYNC_LIGHT" new for v2. mm/migrate.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/mm/migrate.c b/mm/migrate.c index 60982df71a93..97c93604eb4c 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -715,25 +715,16 @@ static bool buffer_migrate_lock_buffers(struct buffer_head *head, enum migrate_mode mode) { struct buffer_head *bh = head; + bool locked; - /* Simple case, sync compaction */ - if (mode != MIGRATE_ASYNC) { - do { - lock_buffer(bh); - bh = bh->b_this_page; - - } while (bh != head); - - return true; - } - - /* async case, we cannot block on lock_buffer so use trylock_buffer */ do { - if (!trylock_buffer(bh)) { - /* - * We failed to lock the buffer and cannot stall in - * async migration. Release the taken locks - */ + if (mode == MIGRATE_ASYNC) + locked = trylock_buffer(bh); + else + locked = !lock_buffer_timeout(bh, timeout_for_mode(mode)); + + if (!locked) { + /* We failed to lock the buffer. Release the taken locks. */ struct buffer_head *failed_bh = bh; bh = head; while (bh != failed_bh) {