FAILED: patch "[PATCH] ftrace: Fix possible warning on checking all pages used in" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-4.19.y
git checkout FETCH_HEAD
git cherry-pick -x 26efd79c4624294e553aeaa3439c646729bad084
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023072116-hatless-spoiler-566e@gregkh' --subject-prefix 'PATCH 4.19.y' HEAD^..
Possible dependencies:
26efd79c4624 ("ftrace: Fix possible warning on checking all pages used in ftrace_process_locs()") db42523b4f3e ("ftrace: Store the order of pages allocated in ftrace_page") 59300b36f85f ("ftrace: Check if pages were allocated before calling free_pages()") da537f0aef13 ("ftrace: Add information on number of page groups allocated")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 26efd79c4624294e553aeaa3439c646729bad084 Mon Sep 17 00:00:00 2001
From: Zheng Yejian <[email protected]>
Date: Wed, 12 Jul 2023 14:04:52 +0800
Subject: [PATCH] ftrace: Fix possible warning on checking all pages used in
ftrace_process_locs()
As comments in ftrace_process_locs(), there may be NULL pointers in mcount_loc section:
Quoted 4 lines
Some architecture linkers will pad between the different
mcount_locsections of different object files to satisfy alignments. Skip any NULL pointers.
After commit 20e5227e9f55 ("ftrace: allow NULL pointers in mcount_loc"), NULL pointers will be accounted when allocating ftrace pages but skipped before adding into ftrace pages, this may result in some pages not being used. Then after commit 706c81f87f84 ("ftrace: Remove extra helper functions"), warning may occur at:
WARN_ON(pg->next);
To fix it, only warn for case that no pointers skipped but pages not used up, then free those unused pages after releasing ftrace_lock.
kernel/trace/ftrace.c +31 -14
@@ -3305,6 +3305,22 @@ static int ftrace_allocate_records(struct ftrace_page *pg, int count)return cnt; } +static void ftrace_free_pages (struct ftrace_page *pages) +{ +struct ftrace_page *pg = pages; + +while (pg) { +if (pg->records) { +free_pages ((unsigned long )pg->records, pg->order); + ftrace_number_of_pages -=1 << pg->order; + } + pages = pg->next; +kfree (pg); + pg = pages; + ftrace_number_of_groups--; + } +} +static struct ftrace_page *ftrace_allocate_pages (unsigned long num_to_init) {
@@ -3343,17 +3359,7 @@ ftrace_allocate_pages(unsigned long num_to_init)return start_pg; free_pages: - pg = start_pg; -while (pg) { -if (pg->records) { -free_pages ((unsigned long )pg->records, pg->order); - ftrace_number_of_pages -=1 << pg->order; - } - start_pg = pg->next; -kfree (pg); - pg = start_pg; - ftrace_number_of_groups--; - } +ftrace_free_pages (start_pg);pr_info ("ftrace: FAILED to allocate memory for functions\n" );return NULL ; }
@@ -6471,9 +6477,11 @@ static int ftrace_process_locs(struct module *mod,unsigned long *start, unsigned long *end) { + struct ftrace_page *pg_unuse = NULL;struct ftrace_page *start_pg;struct ftrace_page *pg;struct dyn_ftrace *rec; +unsigned long skipped =0 ;unsigned long count;unsigned long *p;unsigned long addr;
@@ -6536,8 +6544,10 @@ static int ftrace_process_locs(struct module *mod,* object files to satisfy alignments. * Skip any NULL pointers. */ -if (!addr) +if (!addr) { + skipped++;continue ; + } end_offset = (pg->index+1 ) *sizeof (pg->records[0 ]);if (end_offset >PAGE_SIZE << pg->order) {
@@ -6551,8 +6561,10 @@ static int ftrace_process_locs(struct module *mod, rec->ip = addr; } -/* We should have used all pages */ -WARN_ON (pg->next); +if (pg->next) { + pg_unuse = pg->next; + pg->next =NULL ; + }/* Assign the last page to ftrace_pages */ ftrace_pages = pg;
@@ -6574,6 +6586,11 @@ static int ftrace_process_locs(struct module *mod, out:mutex_unlock (&ftrace_lock); +/* We should have used all pages unless we skipped some */ +if (pg_unuse) { +WARN_ON (!skipped); +ftrace_free_pages (pg_unuse); + }return ret; }