From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CC34A250BF2 for ; Fri, 8 May 2026 18:12:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778263975; cv=none; b=j2DxkK1itV4w+/8krqzK5bormDPHEMeZBrH8E/dhyR5eSZ45/UpU4CcSyHGa6aldspNc8Qyln96TpVAsh1LLBrArdjHYRNplAV4qByP8NTy+Cv6yUI4uldy6vgu7zoH9fL+8hBtLVCnuy65i5fHC6nDdh+8xhFZhOv7Jhpo+oyo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778263975; c=relaxed/simple; bh=LC5XXTxDfGbmu5cYp7Av/M44Iq8J0sO6eFtx44JJjXY=; h=Date:Mime-Version:Message-ID:Subject:From:Cc:Content-Type; b=s5y0ObrpbrnGBFVdF2CBl/Er067pKq7qNGdYCByyCnpOvumwxLYwjgywCIWh1iXTgrqDYCPbL5Kqk9ToW/kvKj4yb9Hp58ByKzW6WY2DA30hGtN641AW74khtcPsQ61Qq1aob394AVmfdY7uNgTKk4BbtGJIVwp7zEgRXHzDtLM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--fmayle.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=mdeO6SLo; arc=none smtp.client-ip=74.125.82.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--fmayle.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="mdeO6SLo" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-1325c685526so4259549c88.0 for ; Fri, 08 May 2026 11:12:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1778263972; x=1778868772; darn=vger.kernel.org; h=cc:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=UyKGCYrU63Aq4NGiL04wV7gIZx0hsmStPfmXdP8BRuQ=; b=mdeO6SLo8ToclB67XHN+K4uH/Roqx+vU8ftchmmH512mHSnPARw8FhdsaZR5SsI/cz md1eEsTLw5/ixs4agpggZLbVJPCvi5PgeJQEb9+gYbsca7r0PHp2oZa9c7FuNP/M9bct YFQNqBx6uRbO+CGx0zPEzdpyiu7OJ1Q1VxXL9PEr2yaULO/WDR9ijDc28g7b6xdase69 MdGuHI5runnU4ME4ficdPN2vPU4TSCqxxnaNt/3y8z346VPKS9Hi2ZHuJ3ieinuFRfJt Z0Lh9Zv+B5PdtGKqD7se+y+CMU3uT7ZMOaV9r1PXgtb5wr02tkv3zNJ7mNHtM1ypE0hw 06zw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778263972; x=1778868772; h=cc:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=UyKGCYrU63Aq4NGiL04wV7gIZx0hsmStPfmXdP8BRuQ=; b=jzmEyFS5hrjwgVALagjLuT5W76B/dDQxgMVrqGlRfN7gyShS6YpZW/xGPyAKVE44Ef y0UHdywOIkbRtdkvXDU9SAOPje3gLmdwAMCTzIpYcJ813p//80C4nEPTplBdo7lfzj7n ieL8QJjmC5BzFT2TNYJ8i+7UJZWF8WS8Mad7iJLKlwQw306TsRJAawjyWGdddLUjYsS7 AY9kNU5dLX0PzsfM85lAsSVZy4x9w1uei3/T/Wz/urETTV+GG7hQ2JRj1r+oUfnrvv1K FwqbsdKNTU5ixQdDaWgQRa9C7HxLSQdSl9b+8IbRACnrPDeB7SRMMJRKY4WjJJjAixD3 8hnA== X-Forwarded-Encrypted: i=1; AFNElJ8vWWUoyGANVgEyN9du6KC9BbYFhLWqSaAyiVuDf1BukcZsfwk0bLrBNa1qnol02zV4cw3JG6HAgQHSvqg=@vger.kernel.org X-Gm-Message-State: AOJu0YycyqYaEfCHEkGa4OackPbNwhoeQ9zAHFwqaZ32g+ZiQinnYXtP TiSxgarvuVj5yRzqGJKt3EalDxYZ6Mx4rWgaTPKxg9784ZvAuSsxC/HWt7ePfjobKMYXvHl2NuP uU6c3Pw== X-Received: from dlbcj32.prod.google.com ([2002:a05:7022:69a0:b0:12c:b3eb:b31e]) (user=fmayle job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:1e10:b0:12b:ec67:3523 with SMTP id a92af1059eb24-1317d89653emr7226915c88.9.1778263971653; Fri, 08 May 2026 11:12:51 -0700 (PDT) Date: Fri, 8 May 2026 11:12:31 -0700 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-Mailer: git-send-email 2.54.0.563.g4f69b47b94-goog Message-ID: <20260508181237.670645-1-fmayle@google.com> Subject: [PATCH] mm/readahead: no PG_readahead on EOF From: Frederick Mayle Cc: android-mm@google.com, kernel-team@android.com, Frederick Mayle , Kalesh Singh , Suren Baghdasaryan , "Matthew Wilcox (Oracle)" , Jan Kara , Andrew Morton , linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" When readahead pulls in all the remaining pages for a file, setting the readahead bit is counter productive. The async readahead it would trigger would almost certainly be a no-op. Additionally, for mmap'd file IO, the readahead bit limits the fault around [0], causing an extra minor fault when the page is accessed. This was discovered when looking at /sys/kernel/tracing/events/readahead traces for a simple program. With the patch applied, fewer page_cache_ra_unbounded calls are observed. [1] do_fault_around calls filemap_map_pages, which finds eligible pages by calling next_uptodate_folio [2]. next_uptodate_folio skips pages with PG_readahead set [3]. Link: https://github.com/torvalds/linux/blob/v7.0/mm/filemap.c#L3921-L3939 [2] Link: https://github.com/torvalds/linux/blob/v7.0/mm/filemap.c#L3721-L3722 [3] Cc: Kalesh Singh Cc: Suren Baghdasaryan Signed-off-by: Frederick Mayle --- mm/readahead.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/mm/readahead.c b/mm/readahead.c index 8c12b63ccd4a..784a3bde82be 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -329,8 +329,11 @@ static void do_page_cache_ra(struct readahead_control *ractl, if (index > end_index) return; /* Don't read past the page containing the last byte of the file */ - if (nr_to_read > end_index - index) + if (nr_to_read > end_index - index) { nr_to_read = end_index - index + 1; + /* We've reached the end, so don't set a readahead marker. */ + lookahead_size = 0; + } filemap_invalidate_lock_shared(mapping); page_cache_ra_unbounded(ractl, nr_to_read, lookahead_size); @@ -474,7 +477,7 @@ void page_cache_ra_order(struct readahead_control *ractl, pgoff_t index = start; unsigned int min_order = mapping_min_folio_order(mapping); pgoff_t limit; - pgoff_t mark = index + ra->size - ra->async_size; + pgoff_t mark; unsigned int nofs; int err = 0; gfp_t gfp = readahead_gfp_mask(mapping); @@ -488,7 +491,13 @@ void page_cache_ra_order(struct readahead_control *ractl, limit = (i_size_read(mapping->host) - 1) >> PAGE_SHIFT; limit = min(limit, ractl->_max_index); - limit = min(limit, index + ra->size - 1); + if (limit > index + ra->size - 1) { + limit = index + ra->size - 1; + mark = index + ra->size - ra->async_size; + } else { + /* We've reached the end, so don't set a readahead marker. */ + mark = ULONG_MAX; + } new_order = min(mapping_max_folio_order(mapping), new_order); new_order = min_t(unsigned int, new_order, ilog2(ra->size)); base-commit: 2d565cbaafd43b10b75da56e43e5db9852a56afd -- 2.54.0.563.g4f69b47b94-goog