summaryrefslogtreecommitdiff
path: root/mm/madvise.c
diff options
context:
space:
mode:
authorSeongJae Park <sj@kernel.org>2025-02-05 22:15:16 -0800
committerAndrew Morton <akpm@linux-foundation.org>2025-03-16 22:06:04 -0700
commit457753da6462024ad821bcb4df2d828cf2ef18be (patch)
treea77820b86d7259ae443657d6ecfec58d7cf61aa5 /mm/madvise.c
parentdbb0020bbc2c9f563d68564b36d6e8d32f82008b (diff)
mm/madvise: split out madvise() behavior execution
Split out the madvise behavior applying logic from do_madvise() to make it easier to reuse from the following change. Link: https://lkml.kernel.org/r/20250206061517.2958-4-sj@kernel.org Signed-off-by: SeongJae Park <sj@kernel.org> Reviewed-by: Shakeel Butt <shakeel.butt@linux.dev> Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Reviewed-by: Liam R. Howlett <howlett@gmail.com> Cc: David Hildenbrand <david@redhat.com> Cc: Davidlohr Bueso <dave@stgolabs.net> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'mm/madvise.c')
-rw-r--r--mm/madvise.c53
1 files changed, 30 insertions, 23 deletions
diff --git a/mm/madvise.c b/mm/madvise.c
index ca858b8a837b..6e31e3202d71 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -1639,6 +1639,35 @@ static bool is_valid_madvise(unsigned long start, size_t len_in, int behavior)
return true;
}
+static int madvise_do_behavior(struct mm_struct *mm,
+ unsigned long start, size_t len_in, size_t len, int behavior)
+{
+ struct blk_plug plug;
+ unsigned long end;
+ int error;
+
+#ifdef CONFIG_MEMORY_FAILURE
+ if (behavior == MADV_HWPOISON || behavior == MADV_SOFT_OFFLINE)
+ return madvise_inject_error(behavior, start, start + len_in);
+#endif
+ start = untagged_addr_remote(mm, start);
+ end = start + len;
+
+ blk_start_plug(&plug);
+ switch (behavior) {
+ case MADV_POPULATE_READ:
+ case MADV_POPULATE_WRITE:
+ error = madvise_populate(mm, start, end, behavior);
+ break;
+ default:
+ error = madvise_walk_vmas(mm, start, end, behavior,
+ madvise_vma_behavior);
+ break;
+ }
+ blk_finish_plug(&plug);
+ return error;
+}
+
/*
* The madvise(2) system call.
*
@@ -1716,7 +1745,6 @@ int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int beh
unsigned long end;
int error;
size_t len;
- struct blk_plug plug;
if (!is_valid_madvise(start, len_in, behavior))
return -EINVAL;
@@ -1730,28 +1758,7 @@ int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int beh
error = madvise_lock(mm, behavior);
if (error)
return error;
-
-#ifdef CONFIG_MEMORY_FAILURE
- if (behavior == MADV_HWPOISON || behavior == MADV_SOFT_OFFLINE)
- return madvise_inject_error(behavior, start, start + len_in);
-#endif
-
- start = untagged_addr_remote(mm, start);
- end = start + len;
-
- blk_start_plug(&plug);
- switch (behavior) {
- case MADV_POPULATE_READ:
- case MADV_POPULATE_WRITE:
- error = madvise_populate(mm, start, end, behavior);
- break;
- default:
- error = madvise_walk_vmas(mm, start, end, behavior,
- madvise_vma_behavior);
- break;
- }
- blk_finish_plug(&plug);
-
+ error = madvise_do_behavior(mm, start, len_in, len, behavior);
madvise_unlock(mm, behavior);
return error;