include/linux/mm.h | 2 +- include/vdso/page.h | 2 ++ lib/string.c | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-)
offset_in_page() is a small page-arithmetic helper that has been around
for 20+ years. However, page-offset calculations are still open-coded in
many places and in different ways:
(unsigned long)p & ~PAGE_MASK
(unsigned long)p & (PAGE_SIZE - 1)
(long)p & (PAGE_SIZE - 1)
...
Some of these open-coded instances may be due to offset_in_page() being
buried 3000+ lines into linux/mm.h; others may have avoided including
linux/mm.h, which is a large header that pulls in many others.
Patch 1 moves offset_in_page() from linux/mm.h to vdso/page.h, which
keeps the helper with other low-level page definitions and allows users
that only need offset_in_page() to avoid including linux/mm.h.
Patch 2 shows a concrete example where including vdso/page.h is
sufficient and including the large linux/mm.h would be unnecessary.
Existing users of offset_in_page() do not need to change because patch 1
also includes vdso/page.h from linux/mm.h.
This series is based on akpm/mm.git mm-nonmm-unstable commit
d067a83c8063 ("string: use min in sized_strscpy"), which is also in
linux-next.
Changes in v2:
- Add a cover letter and drop the bytes_to_page_end() helper
- Move offset_in_page() to vdso/page.h as suggested by David and Lorenzo
- Use offset_in_page() in lib/string.c as an example since
bitmap_print_to_pagebuf() in lib/bitmap-str.c is being removed [1]
- v1: https://lore.kernel.org/lkml/20260517123428.1181981-4-thorsten.blum@linux.dev/
[1] https://lore.kernel.org/lkml/20260519163058.953690-3-ynorov@nvidia.com/
---
Thorsten Blum (2):
vdso: move offset_in_page() from linux/mm.h to vdso/page.h
string: use offset_in_page() in sized_strscpy()
include/linux/mm.h | 2 +-
include/vdso/page.h | 2 ++
lib/string.c | 3 ++-
3 files changed, 5 insertions(+), 2 deletions(-)
base-commit: d067a83c8063d1bdcbd9af8e1326d846f85138b8
On Thu, May 21, 2026 at 11:06:56AM +0200, Thorsten Blum wrote:
> offset_in_page() is a small page-arithmetic helper that has been around
> for 20+ years. However, page-offset calculations are still open-coded in
> many places and in different ways:
>
> (unsigned long)p & ~PAGE_MASK
> (unsigned long)p & (PAGE_SIZE - 1)
> (long)p & (PAGE_SIZE - 1)
> ...
>
> Some of these open-coded instances may be due to offset_in_page() being
> buried 3000+ lines into linux/mm.h; others may have avoided including
> linux/mm.h, which is a large header that pulls in many others.
>
> Patch 1 moves offset_in_page() from linux/mm.h to vdso/page.h, which
> keeps the helper with other low-level page definitions and allows users
> that only need offset_in_page() to avoid including linux/mm.h.
>
> Patch 2 shows a concrete example where including vdso/page.h is
> sufficient and including the large linux/mm.h would be unnecessary.
mm.h is already included there indirectly, otherwise it would be a
compile error, isn't?
--
Example for who? Are you expecting somebody to pick it up from you and
cleanup the whole kernel?
I'm not interested in 'example', I'm interested in a broad picture and
an estimate of how realistically would it be to switch kernel to
consistently use the helper.
So this is the broad picture for you:
- 660 uses of offset_in_page()
- 570 uses of & ~PAGE_MASK
- 176 uses of & (PAGE_SIZE - 1)
- 135 high-confidence candidates
Those 135 candidates are found with:
$ git grep -n -E \
'\b(offset|off|ofs|poff|pg_off|pg_ofs|page_offset|page_offs|start_offset|dest_off|src_off|from|to|remainder)\b[^=]*= [^;]*&[[:space:]]*(~PAGE_MASK|\(?PAGE_SIZE[[:space:]]*-[[:space:]]*1\)?)' \
-- ':(exclude)drivers/gpu/drm/amd/include/asic_reg/**' \
':(exclude)include/trace/events/**'
If you want to go ahead and convert at least those good candidates -
it would be about a couple dozens of patches. And it would look like a
meaningful commitment.
If you want to move the macro out of linux/mm.h and drop the header
from some inclusion paths - it would be another meaningful commitment.
In this series you move the macro to a questionable vdso header, and
convert just one user, which leads to *adding* another dependency,
instead of removing some. This doesn't look like a valuable commitment,
sorry.
Thanks,
Yury
> Existing users of offset_in_page() do not need to change because patch 1
> also includes vdso/page.h from linux/mm.h.
>
> This series is based on akpm/mm.git mm-nonmm-unstable commit
> d067a83c8063 ("string: use min in sized_strscpy"), which is also in
> linux-next.
>
> Changes in v2:
> - Add a cover letter and drop the bytes_to_page_end() helper
> - Move offset_in_page() to vdso/page.h as suggested by David and Lorenzo
> - Use offset_in_page() in lib/string.c as an example since
> bitmap_print_to_pagebuf() in lib/bitmap-str.c is being removed [1]
> - v1: https://lore.kernel.org/lkml/20260517123428.1181981-4-thorsten.blum@linux.dev/
>
> [1] https://lore.kernel.org/lkml/20260519163058.953690-3-ynorov@nvidia.com/
> ---
> Thorsten Blum (2):
> vdso: move offset_in_page() from linux/mm.h to vdso/page.h
> string: use offset_in_page() in sized_strscpy()
>
> include/linux/mm.h | 2 +-
> include/vdso/page.h | 2 ++
> lib/string.c | 3 ++-
> 3 files changed, 5 insertions(+), 2 deletions(-)
>
>
> base-commit: d067a83c8063d1bdcbd9af8e1326d846f85138b8
On Thu, May 21, 2026 at 11:06:56AM +0200, Thorsten Blum wrote:
> offset_in_page() is a small page-arithmetic helper that has been around
> for 20+ years. However, page-offset calculations are still open-coded in
> many places and in different ways:
>
> (unsigned long)p & ~PAGE_MASK
> (unsigned long)p & (PAGE_SIZE - 1)
> (long)p & (PAGE_SIZE - 1)
> ...
>
> Some of these open-coded instances may be due to offset_in_page() being
> buried 3000+ lines into linux/mm.h; others may have avoided including
> linux/mm.h, which is a large header that pulls in many others.
This is good but I think you're still missing the 'why' here (as to why files
don't import mm.h, and thus what this series addreses), which presumably, is
compile time.
>
> Patch 1 moves offset_in_page() from linux/mm.h to vdso/page.h, which
> keeps the helper with other low-level page definitions and allows users
> that only need offset_in_page() to avoid including linux/mm.h.
>
> Patch 2 shows a concrete example where including vdso/page.h is
> sufficient and including the large linux/mm.h would be unnecessary.
>
> Existing users of offset_in_page() do not need to change because patch 1
> also includes vdso/page.h from linux/mm.h.
>
> This series is based on akpm/mm.git mm-nonmm-unstable commit
> d067a83c8063 ("string: use min in sized_strscpy"), which is also in
> linux-next.
>
> Changes in v2:
> - Add a cover letter and drop the bytes_to_page_end() helper
> - Move offset_in_page() to vdso/page.h as suggested by David and Lorenzo
> - Use offset_in_page() in lib/string.c as an example since
> bitmap_print_to_pagebuf() in lib/bitmap-str.c is being removed [1]
> - v1: https://lore.kernel.org/lkml/20260517123428.1181981-4-thorsten.blum@linux.dev/
>
> [1] https://lore.kernel.org/lkml/20260519163058.953690-3-ynorov@nvidia.com/
> ---
> Thorsten Blum (2):
> vdso: move offset_in_page() from linux/mm.h to vdso/page.h
> string: use offset_in_page() in sized_strscpy()
>
> include/linux/mm.h | 2 +-
> include/vdso/page.h | 2 ++
> lib/string.c | 3 ++-
> 3 files changed, 5 insertions(+), 2 deletions(-)
>
>
> base-commit: d067a83c8063d1bdcbd9af8e1326d846f85138b8
© 2016 - 2026 Red Hat, Inc.