Message ID | 20241111234842.2024180-4-axboe@kernel.dk (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Uncached buffered IO | expand |
On Mon, Nov 11, 2024 at 04:37:30PM -0700, Jens Axboe wrote: > Add a page flag that file IO can use to indicate that the IO being done > is uncached, as in it should not persist in the page cache after the IO > has been completed. I have not found a way to avoid using a new bit. I am unsure if we have enough bits on 32-bit systems with all possible features enabled. In the worst-case scenario, we may need to make the feature 64-bit only. I believe it should be acceptable as long as userspace is prepared for the possibility that RWF_UNCACHED may fail. It is not going to be supported by all filesystems anyway.
On 11/12/24 2:12 AM, Kirill A. Shutemov wrote: > On Mon, Nov 11, 2024 at 04:37:30PM -0700, Jens Axboe wrote: >> Add a page flag that file IO can use to indicate that the IO being done >> is uncached, as in it should not persist in the page cache after the IO >> has been completed. > > I have not found a way to avoid using a new bit. I am unsure if we have > enough bits on 32-bit systems with all possible features enabled. I think it should be OK, at least the kernel test bot reports build success on all the archs it tests, which has a lot of 32-bit archs. I have to say I didn't check on numbering and if the mm subsystem has a BUILD_BUG_ON() for bits exceeding the allowable value for unsigned long on the host, but I'm assuming it does? > In the worst-case scenario, we may need to make the feature 64-bit only. > I believe it should be acceptable as long as userspace is prepared for the > possibility that RWF_UNCACHED may fail. It is not going to be supported by > all filesystems anyway. Right, I would not even see that as a big issue. 32-bit would just see -EOPNOTSUPP for any fs, even ones that support it on 64-bit archs.
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index cc839e4365c1..3c4003495929 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -110,6 +110,7 @@ enum pageflags { PG_reclaim, /* To be reclaimed asap */ PG_swapbacked, /* Page is backed by RAM/swap */ PG_unevictable, /* Page is "unevictable" */ + PG_uncached, /* uncached read/write IO */ #ifdef CONFIG_MMU PG_mlocked, /* Page is vma mlocked */ #endif @@ -562,6 +563,10 @@ PAGEFLAG(Reclaim, reclaim, PF_NO_TAIL) FOLIO_FLAG(readahead, FOLIO_HEAD_PAGE) FOLIO_TEST_CLEAR_FLAG(readahead, FOLIO_HEAD_PAGE) +FOLIO_FLAG(uncached, FOLIO_HEAD_PAGE) + FOLIO_TEST_CLEAR_FLAG(uncached, FOLIO_HEAD_PAGE) + __FOLIO_SET_FLAG(uncached, FOLIO_HEAD_PAGE) + #ifdef CONFIG_HIGHMEM /* * Must use a macro here due to header dependency issues. page_zone() is not diff --git a/include/trace/events/mmflags.h b/include/trace/events/mmflags.h index bb8a59c6caa2..b60057284102 100644 --- a/include/trace/events/mmflags.h +++ b/include/trace/events/mmflags.h @@ -116,7 +116,8 @@ DEF_PAGEFLAG_NAME(head), \ DEF_PAGEFLAG_NAME(reclaim), \ DEF_PAGEFLAG_NAME(swapbacked), \ - DEF_PAGEFLAG_NAME(unevictable) \ + DEF_PAGEFLAG_NAME(unevictable), \ + DEF_PAGEFLAG_NAME(uncached) \ IF_HAVE_PG_MLOCK(mlocked) \ IF_HAVE_PG_HWPOISON(hwpoison) \ IF_HAVE_PG_IDLE(idle) \
Add a page flag that file IO can use to indicate that the IO being done is uncached, as in it should not persist in the page cache after the IO has been completed. Signed-off-by: Jens Axboe <axboe@kernel.dk> --- include/linux/page-flags.h | 5 +++++ include/trace/events/mmflags.h | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-)