linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Randy Dunlap <rdunlap@infradead.org>
To: linux-kernel@vger.kernel.org
Cc: "Randy Dunlap" <rdunlap@infradead.org>,
	"Jens Axboe" <axboe@kernel.dk>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Toralf Förster" <toralf.foerster@gmx.de>,
	linux-mm@kvack.org
Subject: [RFC PATCH 2/2] mm: readahead: handle LARGE input to get_init_ra_size()
Date: Sun, 20 Dec 2020 13:10:51 -0800	[thread overview]
Message-ID: <20201220211051.1416-1-rdunlap@infradead.org> (raw)

Add a test to detect if the input ra request size has its high order
bit set (is negative when tested as a signed long). This would be a
really Huge readahead.

If so, WARN() with the value and a stack trace so that we can see
where this is happening and then make further corrections later.
Then adjust the size value so that it is not so Huge (although
this may not be needed).

Also correct a comment: the return value is not squared for
small size.

Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Toralf Förster <toralf.foerster@gmx.de>
Cc: linux-mm@kvack.org
---
Notes:
- Look for "WARNING:.*get_init_ra_size"
- If panic_on_warn is set, this will cause a kernel panic().

 mm/readahead.c |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

--- linux-5.10.1.orig/mm/readahead.c
+++ linux-5.10.1/mm/readahead.c
@@ -14,6 +14,7 @@
 #include <linux/export.h>
 #include <linux/blkdev.h>
 #include <linux/backing-dev.h>
+#include <linux/bug.h>
 #include <linux/task_io_accounting_ops.h>
 #include <linux/pagevec.h>
 #include <linux/pagemap.h>
@@ -303,14 +304,21 @@ void force_page_cache_ra(struct readahea
 }
 
 /*
- * Set the initial window size, round to next power of 2 and square
+ * Set the initial window size, round to next power of 2
  * for small size, x 4 for medium, and x 2 for large
  * for 128k (32 page) max ra
  * 1-8 page = 32k initial, > 8 page = 128k initial
  */
 static unsigned long get_init_ra_size(unsigned long size, unsigned long max)
 {
-	unsigned long newsize = roundup_pow_of_two(size);
+	unsigned long newsize;
+
+	if ((signed long)size < 0) { /* high bit is set: ultra-large ra req */
+		WARN_ONCE(1, "%s: size=0x%lx\n", __func__, size);
+		size = -size;	/* really only need to flip the high/sign bit */
+	}
+
+	newsize = roundup_pow_of_two(size);
 
 	if (newsize <= max / 32)
 		newsize = newsize * 4;

             reply	other threads:[~2020-12-20 21:39 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-20 21:10 Randy Dunlap [this message]
2020-12-23  1:35 ` Andrew Morton
2020-12-23  1:50   ` Randy Dunlap
2020-12-29 18:01     ` Toralf Förster
2020-12-29 18:11       ` Randy Dunlap
2020-12-29 20:00         ` Randy Dunlap
2020-12-29 20:46           ` Toralf Förster

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=20201220211051.1416-1-rdunlap@infradead.org \
    --to=rdunlap@infradead.org \
    --cc=akpm@linux-foundation.org \
    --cc=axboe@kernel.dk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=toralf.foerster@gmx.de \
    --subject='Re: [RFC PATCH 2/2] mm: readahead: handle LARGE input to get_init_ra_size()' \
    /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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).