mm/madvise: use is_memory_failure() from madvise_do_behavior()

Patch series "mm/madvise: cleanup requests validations and classifications".

Cleanup madvise entry level code for cleaner request validations and
classifications.


This patch (of 4):

To reduce redundant open-coded checks of CONFIG_MEMORY_FAILURE and
MADV_{HWPOISON,SOFT_OFFLINE} in madvise_[un]lock(), is_memory_failure() is
introduced.  madvise_do_behavior() is still doing the same open-coded
check, though.  Use is_memory_failure() instead.

To avoid build failure on !CONFIG_MEMORY_FAILURE case, implement an empty
madvise_inject_error() under the config.  Also move the definition of
is_memory_failure() inside #ifdef CONFIG_MEMORY_FAILURE clause for
madvise_inject_error() definition, to reduce duplicated ifdef clauses.

Link: https://lkml.kernel.org/r/20250312164750.59215-1-sj@kernel.org
Link: https://lkml.kernel.org/r/20250312164750.59215-2-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Reviewed-by: Shakeel Butt <shakeel.butt@linux.dev>
Cc: David Hildenbrand <david@redhat.com>
Cc: Liam R. Howlett <howlett@gmail.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
SeongJae Park
2025-03-12 09:47:47 -07:00
committed by Andrew Morton
parent 15766485e4
commit 9ecd2f839b

View File

@@ -1392,7 +1392,32 @@ static int madvise_inject_error(int behavior,
return 0;
}
#endif
static bool is_memory_failure(int behavior)
{
switch (behavior) {
case MADV_HWPOISON:
case MADV_SOFT_OFFLINE:
return true;
default:
return false;
}
}
#else
static int madvise_inject_error(int behavior,
unsigned long start, unsigned long end)
{
return 0;
}
static bool is_memory_failure(int behavior)
{
return false;
}
#endif /* CONFIG_MEMORY_FAILURE */
static bool
madvise_behavior_valid(int behavior)
@@ -1569,24 +1594,6 @@ int madvise_set_anon_name(struct mm_struct *mm, unsigned long start,
}
#endif /* CONFIG_ANON_VMA_NAME */
#ifdef CONFIG_MEMORY_FAILURE
static bool is_memory_failure(int behavior)
{
switch (behavior) {
case MADV_HWPOISON:
case MADV_SOFT_OFFLINE:
return true;
default:
return false;
}
}
#else
static bool is_memory_failure(int behavior)
{
return false;
}
#endif
static int madvise_lock(struct mm_struct *mm, int behavior)
{
if (is_memory_failure(behavior))
@@ -1640,10 +1647,8 @@ static int madvise_do_behavior(struct mm_struct *mm,
unsigned long end;
int error;
#ifdef CONFIG_MEMORY_FAILURE
if (behavior == MADV_HWPOISON || behavior == MADV_SOFT_OFFLINE)
if (is_memory_failure(behavior))
return madvise_inject_error(behavior, start, start + len_in);
#endif
start = untagged_addr_remote(mm, start);
end = start + len;