Message ID | 20250206061517.2958-4-sj@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/madvise: remove redundant mmap_lock operations from process_madvise() | expand |
* SeongJae Park <sj@kernel.org> [250206 01:15]: > Split out the madvise behavior applying logic from do_madvise() to make > it easier to reuse from the following change. > > Reviewed-by: Shakeel Butt <shakeel.butt@linux.dev> > Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > Signed-off-by: SeongJae Park <sj@kernel.org> Reviewed-by: Liam R. Howlett <howlett@gmail.com> > --- > mm/madvise.c | 53 +++++++++++++++++++++++++++++----------------------- > 1 file changed, 30 insertions(+), 23 deletions(-) > > diff --git a/mm/madvise.c b/mm/madvise.c > index efab2878be7c..31e5df75b926 100644 > --- a/mm/madvise.c > +++ b/mm/madvise.c > @@ -1615,6 +1615,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. > * > @@ -1692,7 +1721,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; > @@ -1706,28 +1734,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; > -- > 2.39.5
diff --git a/mm/madvise.c b/mm/madvise.c index efab2878be7c..31e5df75b926 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -1615,6 +1615,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. * @@ -1692,7 +1721,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; @@ -1706,28 +1734,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;