Commit 71dda1c
mm/page_alloc: fix race condition in unaccepted memory handling
commit fefc075 upstream.
The page allocator tracks the number of zones that have unaccepted memory
using static_branch_enc/dec() and uses that static branch in hot paths to
determine if it needs to deal with unaccepted memory.
Borislav and Thomas pointed out that the tracking is racy: operations on
static_branch are not serialized against adding/removing unaccepted pages
to/from the zone.
Sanity checks inside static_branch machinery detects it:
WARNING: CPU: 0 PID: 10 at kernel/jump_label.c:276 __static_key_slow_dec_cpuslocked+0x8e/0xa0
The comment around the WARN() explains the problem:
/*
* Warn about the '-1' case though; since that means a
* decrement is concurrent with a first (0->1) increment. IOW
* people are trying to disable something that wasn't yet fully
* enabled. This suggests an ordering problem on the user side.
*/
The effect of this static_branch optimization is only visible on
microbenchmark.
Instead of adding more complexity around it, remove it altogether.
Link: https://lkml.kernel.org/r/20250506133207.1009676-1-kirill.shutemov@linux.intel.com
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Fixes: dcdfdd4 ("mm: Add support for unaccepted memory")
Link: https://lore.kernel.org/all/20250506092445.GBaBnVXXyvnazly6iF@fat_crate.local
Reported-by: Borislav Petkov <bp@alien8.de>
Tested-by: Borislav Petkov (AMD) <bp@alien8.de>
Reported-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Brendan Jackman <jackmanb@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: <stable@vger.kernel.org> [6.5+]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>1 parent 361b4cc commit 71dda1c
1 file changed
Lines changed: 0 additions & 23 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6951 | 6951 | | |
6952 | 6952 | | |
6953 | 6953 | | |
6954 | | - | |
6955 | | - | |
6956 | | - | |
6957 | 6954 | | |
6958 | 6955 | | |
6959 | 6956 | | |
| |||
6980 | 6977 | | |
6981 | 6978 | | |
6982 | 6979 | | |
6983 | | - | |
6984 | | - | |
6985 | 6980 | | |
6986 | | - | |
6987 | | - | |
6988 | 6981 | | |
6989 | 6982 | | |
6990 | 6983 | | |
| |||
6993 | 6986 | | |
6994 | 6987 | | |
6995 | 6988 | | |
6996 | | - | |
6997 | | - | |
6998 | | - | |
6999 | 6989 | | |
7000 | 6990 | | |
7001 | 6991 | | |
| |||
7032 | 7022 | | |
7033 | 7023 | | |
7034 | 7024 | | |
7035 | | - | |
7036 | | - | |
7037 | | - | |
7038 | | - | |
7039 | | - | |
7040 | 7025 | | |
7041 | 7026 | | |
7042 | 7027 | | |
7043 | 7028 | | |
7044 | 7029 | | |
7045 | | - | |
7046 | | - | |
7047 | | - | |
7048 | 7030 | | |
7049 | 7031 | | |
7050 | 7032 | | |
| |||
7078 | 7060 | | |
7079 | 7061 | | |
7080 | 7062 | | |
7081 | | - | |
7082 | 7063 | | |
7083 | 7064 | | |
7084 | 7065 | | |
7085 | 7066 | | |
7086 | 7067 | | |
7087 | | - | |
7088 | 7068 | | |
7089 | 7069 | | |
7090 | 7070 | | |
7091 | 7071 | | |
7092 | 7072 | | |
7093 | 7073 | | |
7094 | | - | |
7095 | | - | |
7096 | | - | |
7097 | 7074 | | |
7098 | 7075 | | |
7099 | 7076 | | |
| |||
0 commit comments