Thread (14 messages) 14 messages, 4 authors, 2024-01-26

Re: [PATCHv3 1/1] block: introduce content activity based ioprio

From: Matthew Wilcox <willy@infradead.org>
Date: 2024-01-26 09:36:49
Also in: linux-fsdevel, linux-mm, lkml

On Fri, Jan 26, 2024 at 05:28:58PM +0800, Zhaoyang Huang wrote:
On Fri, Jan 26, 2024 at 4:55 PM Matthew Wilcox [off-list ref] wrote:
quoted
On Fri, Jan 26, 2024 at 03:59:48PM +0800, Zhaoyang Huang wrote:
quoted
loop more mm and fs guys for more comments
I agree with everything Damien said.  But also ...
ok, I will find a way to solve this problem.
quoted
quoted
quoted
+bool BIO_ADD_FOLIO(struct bio *bio, struct folio *folio, size_t len,
+               size_t off)
You don't add any users of these functions.  It's hard to assess whether
this is the right API when there are no example users.
Actually, the code has been tested on ext4 and f2fs by patchv2 on a
v6.6 6GB android system where I get the test result posted on the
commit message. These APIs is to keep block layer clean and wrap
things up for fs.
well, where's patch v2?  i don't see it in my inbox.  i'm not going
to go hunting around the email lists for it.  this is not good enough.
quoted
why are BIO_ADD_PAGE and BIO_ADD_FOLIO so very different from each
other?
These two API just repeat the same thing that bio_add_page and
bio_add_folio do.
what?

here's the patch you sent.  these two functions do wildly different
things:

+bool BIO_ADD_FOLIO(struct bio *bio, struct folio *folio, size_t len,
+		size_t off)
+{
+	int class, level, hint, activity;
+
+	if (len > UINT_MAX || off > UINT_MAX)
+		return false;
+
+	class = IOPRIO_PRIO_CLASS(bio->bi_ioprio);
+	level = IOPRIO_PRIO_LEVEL(bio->bi_ioprio);
+	hint = IOPRIO_PRIO_HINT(bio->bi_ioprio);
+	activity = IOPRIO_PRIO_ACTIVITY(bio->bi_ioprio);
+
+	activity += (bio->bi_vcnt + 1 <= IOPRIO_NR_ACTIVITY &&
+			PageWorkingset(&folio->page)) ? 1 : 0;
+	if (activity >= bio->bi_vcnt / 2)
+		class = IOPRIO_CLASS_RT;
+	else if (activity >= bio->bi_vcnt / 4)
+		class = max(IOPRIO_PRIO_CLASS(get_current_ioprio()), IOPRIO_CLASS_BE);
+
+	bio->bi_ioprio = IOPRIO_PRIO_VALUE_ACTIVITY(class, level, hint, activity);
+
+	return bio_add_page(bio, &folio->page, len, off) > 0;
+}
+
+int BIO_ADD_PAGE(struct bio *bio, struct page *page,
+		unsigned int len, unsigned int offset)
+{
+	int class, level, hint, activity;
+
+	if (bio_add_page(bio, page, len, offset) > 0) {
+		class = IOPRIO_PRIO_CLASS(bio->bi_ioprio);
+		level = IOPRIO_PRIO_LEVEL(bio->bi_ioprio);
+		hint = IOPRIO_PRIO_HINT(bio->bi_ioprio);
+		activity = IOPRIO_PRIO_ACTIVITY(bio->bi_ioprio);
+		activity += (bio->bi_vcnt <= IOPRIO_NR_ACTIVITY && PageWorkingset(page)) ? 1 : 0;
+		bio->bi_ioprio = IOPRIO_PRIO_VALUE_ACTIVITY(class, level, hint, activity);
+	}
+
+	return len;
+}

did you change one and forget to change the other?
These white spaces are trimmed by vim, I will change them back in next version.
vim doesn't do that by default.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help