mbox series

[v1,0/2] mm/highmem: don't track highmem pages manually

Message ID 20240607083711.62833-1-david@redhat.com (mailing list archive)
Headers show
Series mm/highmem: don't track highmem pages manually | expand

Message

David Hildenbrand June 7, 2024, 8:37 a.m. UTC
Let's remove highmem special-casing from adjust_managed_page_count(),
to result in less confusion why memblock manually adjusts
totalram_pages, and __free_pages_core() only adjusts the zone's
managed pages -- what about the highmem pages that
adjust_managed_page_count() updates?

Now, we only maintain totalram_pages and a zone's managed pages
independent of highmem support. We can derive the number of highmem pages
simply by looking at the relevant zone's managed pages. I don't think
there is any particular fast path that needs a maximum-efficient
totalhigh_pages() implementation.

Note that highmem memory is currently initialized using
free_highmem_page()->free_reserved_page(), not __free_pages_core(). In the
future we might want to also use __free_pages_core() to initialize
highmem memory, to make that less special, and consider moving
totalram_pages updates into __free_pages_core() [1], so we can just use
adjust_managed_page_count() in there as well.

Booting a simple kernel in QEMU reveals no highmem accounting change:

Before:
  Memory: 3095448K/3145208K available (14802K kernel code, 2073K rwdata,
  5000K rodata, 740K init, 556K bss, 49760K reserved, 0K cma-reserved,
  2244488K highmem)

After:
  Memory: 3095276K/3145208K available (14802K kernel code, 2073K rwdata,
  5000K rodata, 740K init, 556K bss, 49932K reserved, 0K cma-reserved,
  2244488K highmem)

[1] https://lkml.kernel.org/r/20240601133402.2675-1-richard.weiyang@gmail.com

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Wei Yang <richard.weiyang@gmail.com>

David Hildenbrand (2):
  mm/highmem: reimplement totalhigh_pages() by walking zones
  mm/highmem: make nr_free_highpages() return "unsigned long"

 include/linux/highmem-internal.h | 17 ++++++-----------
 include/linux/highmem.h          |  2 +-
 mm/highmem.c                     | 20 +++++++++++++++-----
 mm/page_alloc.c                  |  4 ----
 4 files changed, 22 insertions(+), 21 deletions(-)


base-commit: 19b8422c5bd56fb5e7085995801c6543a98bda1f

Comments

Wei Yang June 8, 2024, 12:45 a.m. UTC | #1
On Fri, Jun 07, 2024 at 10:37:09AM +0200, David Hildenbrand wrote:
>Let's remove highmem special-casing from adjust_managed_page_count(),
>to result in less confusion why memblock manually adjusts
>totalram_pages, and __free_pages_core() only adjusts the zone's
>managed pages -- what about the highmem pages that
>adjust_managed_page_count() updates?
>

Thanks David

I have looked into this function and willing to get rid of it, but not found a
good way.

Your change really look nice.

>Now, we only maintain totalram_pages and a zone's managed pages
>independent of highmem support. We can derive the number of highmem pages
>simply by looking at the relevant zone's managed pages. I don't think
>there is any particular fast path that needs a maximum-efficient
>totalhigh_pages() implementation.
>
>Note that highmem memory is currently initialized using
>free_highmem_page()->free_reserved_page(), not __free_pages_core(). In the
>future we might want to also use __free_pages_core() to initialize
>highmem memory, to make that less special, and consider moving
>totalram_pages updates into __free_pages_core() [1], so we can just use
>adjust_managed_page_count() in there as well.
>
>Booting a simple kernel in QEMU reveals no highmem accounting change:
>
>Before:
>  Memory: 3095448K/3145208K available (14802K kernel code, 2073K rwdata,
>  5000K rodata, 740K init, 556K bss, 49760K reserved, 0K cma-reserved,
>  2244488K highmem)
>
>After:
>  Memory: 3095276K/3145208K available (14802K kernel code, 2073K rwdata,
>  5000K rodata, 740K init, 556K bss, 49932K reserved, 0K cma-reserved,
>  2244488K highmem)
>
>[1] https://lkml.kernel.org/r/20240601133402.2675-1-richard.weiyang@gmail.com
>
>Cc: Andrew Morton <akpm@linux-foundation.org>
>Cc: Wei Yang <richard.weiyang@gmail.com>
>
>David Hildenbrand (2):
>  mm/highmem: reimplement totalhigh_pages() by walking zones
>  mm/highmem: make nr_free_highpages() return "unsigned long"
>
> include/linux/highmem-internal.h | 17 ++++++-----------
> include/linux/highmem.h          |  2 +-
> mm/highmem.c                     | 20 +++++++++++++++-----
> mm/page_alloc.c                  |  4 ----
> 4 files changed, 22 insertions(+), 21 deletions(-)
>
>
>base-commit: 19b8422c5bd56fb5e7085995801c6543a98bda1f
>-- 
>2.45.1