On 2026-05-02 00:36, Mike Rapoport wrote:
On Fri, May 01, 2026 at 03:30:18PM -0400, Luiz Capitulino wrote:
On 2026-05-01 11:25, Mike Rapoport wrote:
        return mode == 1 || mode == 3;
    }
+#define HUGETLB_MAX_NR_PAGESIZES 10
+struct hugetlb_settings {
+       unsigned long free_hugepages[HUGETLB_MAX_NR_PAGESIZES];

It looks like we don't actually use this in the API or maybe I'm missing
something?

Yes, it's used only in later patches.

I don't see it, the patch below builds fine (again, sorry in advance if
I'm missing something obvious):

You are right, I misunderstood you comment and I thought you referred to
entire API being unused in this patch.

free_hugepages is not used and it should not be a part of the saved state.

Thanks, I'll try to be more specific next time.

diff --git a/tools/testing/selftests/mm/hugepage_settings.c 
b/tools/testing/selftests/mm/hugepage_settings.c
index 097ba085f423..a023cfeb69c5 100644
--- a/tools/testing/selftests/mm/hugepage_settings.c
+++ b/tools/testing/selftests/mm/hugepage_settings.c
@@ -341,7 +341,6 @@ bool thp_is_enabled(void)
  #define HUGETLB_MAX_NR_PAGESIZES 10
  struct hugetlb_settings {
-       unsigned long free_hugepages[HUGETLB_MAX_NR_PAGESIZES];
        unsigned long nr_hugepages[HUGETLB_MAX_NR_PAGESIZES];
        unsigned long sizes[HUGETLB_MAX_NR_PAGESIZES];
        unsigned long default_size;
@@ -509,7 +508,6 @@ static void __hugetlb_save_settings(void)
                if (!sz)
                        continue;
-               settings->free_hugepages[i] = hugetlb_free_pages(sz);
                settings->nr_hugepages[i] = hugetlb_nr_pages(sz);
        }

I felt it would be too churny to add users in this patch.
Otherwise, the API looks great to me. But if you allow me to bikeshed :)

I think I'd do:

struct hugetlb_state {
        unsigned long nr_hugepages;
        unsigned long size;
};

struct hugetlb_settings {
        struct hugetlb_state hstate[HUGETLB_MAX_PAGESIZES];
        unsigned long default_size;
        int nr_sizes;
};

It might be slightly nicer abstraction but ...
+static void __hugetlb_save_settings(void)
+{
+       struct hugetlb_settings *settings = &hugetlb_saved_settings;
+       int nr_sizes;
+
+       settings->default_size = default_huge_page_size();
+       if (!settings->default_size)
+               return;
+
+       nr_sizes = detect_hugetlb_page_sizes(settings->sizes,
+                                            HUGETLB_MAX_NR_PAGESIZES);

... this immediately becomes more complex.

+       if (!nr_sizes) {
+               settings->default_size = 0;
+               return;
+       }
+
+       for (int i = 0; i < nr_sizes; i++) {
+               unsigned long sz = settings->sizes[i];
+
+               if (!sz)
+                       continue;
+
+               settings->free_hugepages[i] = hugetlb_free_pages(sz);
+               settings->nr_hugepages[i] = hugetlb_nr_pages(sz);

And this as well.

We'd need a little more code to handle those cases, may or may not be
worth it. But enough bikesheding from my side :) the series is great as
is.





Reply via email to