]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tracing: Simplify pages allocation for tracing_map logic
authorRosen Penev <rosenp@gmail.com>
Wed, 20 May 2026 21:50:06 +0000 (14:50 -0700)
committerSteven Rostedt <rostedt@goodmis.org>
Thu, 21 May 2026 22:12:10 +0000 (18:12 -0400)
Change to a flexible array member to allocate together with the array
struct.

Simplifies code slightly by removing no longer correct null checks for
pages and removing kfrees.

Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Kees Cook <kees@kernel.org>
Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Link: https://patch.msgid.link/20260520215006.12008-1-rosenp@gmail.com
Signed-off-by: Rosen Penev <rosenp@gmail.com>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/tracing_map.c
kernel/trace/tracing_map.h

index 0dd7927df22ac492f775d1fa299b3539334afbc4..d7922f40dbe209664242e9a086d5fb2fa2399ad3 100644 (file)
@@ -288,9 +288,6 @@ static void tracing_map_array_clear(struct tracing_map_array *a)
 {
        unsigned int i;
 
-       if (!a->pages)
-               return;
-
        for (i = 0; i < a->n_pages; i++)
                memset(a->pages[i], 0, PAGE_SIZE);
 }
@@ -302,9 +299,6 @@ static void tracing_map_array_free(struct tracing_map_array *a)
        if (!a)
                return;
 
-       if (!a->pages)
-               goto free;
-
        for (i = 0; i < a->n_pages; i++) {
                if (!a->pages[i])
                        break;
@@ -312,9 +306,6 @@ static void tracing_map_array_free(struct tracing_map_array *a)
                free_page((unsigned long)a->pages[i]);
        }
 
-       kfree(a->pages);
-
- free:
        kfree(a);
 }
 
@@ -322,24 +313,25 @@ static struct tracing_map_array *tracing_map_array_alloc(unsigned int n_elts,
                                                  unsigned int entry_size)
 {
        struct tracing_map_array *a;
+       unsigned int entry_size_shift;
+       unsigned int entries_per_page;
+       unsigned int n_pages;
        unsigned int i;
 
-       a = kzalloc_obj(*a);
+       entry_size_shift = fls(roundup_pow_of_two(entry_size) - 1);
+       entries_per_page = PAGE_SIZE / (1 << entry_size_shift);
+       n_pages = max(1, n_elts / entries_per_page);
+
+       a = kzalloc_flex(*a, pages, n_pages);
        if (!a)
                return NULL;
 
-       a->entry_size_shift = fls(roundup_pow_of_two(entry_size) - 1);
-       a->entries_per_page = PAGE_SIZE / (1 << a->entry_size_shift);
-       a->n_pages = n_elts / a->entries_per_page;
-       if (!a->n_pages)
-               a->n_pages = 1;
+       a->entry_size_shift = entry_size_shift;
+       a->entries_per_page = entries_per_page;
+       a->n_pages = n_pages;
        a->entry_shift = fls(a->entries_per_page) - 1;
        a->entry_mask = (1 << a->entry_shift) - 1;
 
-       a->pages = kcalloc(a->n_pages, sizeof(void *), GFP_KERNEL);
-       if (!a->pages)
-               goto free;
-
        for (i = 0; i < a->n_pages; i++) {
                a->pages[i] = (void *)get_zeroed_page(GFP_KERNEL);
                if (!a->pages[i])
index 99c37eeebc161acd1bbcee3f935bd7a5267fc021..18a02959d77b9aaf495c7daa248a6458d53bfcd3 100644 (file)
@@ -167,7 +167,7 @@ struct tracing_map_array {
        unsigned int entry_shift;
        unsigned int entry_mask;
        unsigned int n_pages;
-       void **pages;
+       void *pages[] __counted_by(n_pages);
 };
 
 #define TRACING_MAP_ARRAY_ELT(array, idx)                              \