* SeongJae Park <sj@xxxxxxxxxx> [250206 01:15]: > Optimize redundant mmap lock operations from process_madvise() by > directly doing the mmap locking first, and then the remaining works for > all ranges in the loop. > > Reviewed-by: Shakeel Butt <shakeel.butt@xxxxxxxxx> > Signed-off-by: SeongJae Park <sj@xxxxxxxxxx> It might be worth calling out the drop/reacquire in the change log as well as the comment like Lorenzo said. Reviewed-by: Liam R. Howlett <howlett@xxxxxxxxx> > --- > mm/madvise.c | 26 ++++++++++++++++++++++++-- > 1 file changed, 24 insertions(+), 2 deletions(-) > > diff --git a/mm/madvise.c b/mm/madvise.c > index 31e5df75b926..5a0a1fc99d27 100644 > --- a/mm/madvise.c > +++ b/mm/madvise.c > @@ -1754,9 +1754,26 @@ static ssize_t vector_madvise(struct mm_struct *mm, struct iov_iter *iter, > > total_len = iov_iter_count(iter); > > + ret = madvise_lock(mm, behavior); > + if (ret) > + return ret; > + > while (iov_iter_count(iter)) { > - ret = do_madvise(mm, (unsigned long)iter_iov_addr(iter), > - iter_iov_len(iter), behavior); > + unsigned long start = (unsigned long)iter_iov_addr(iter); > + size_t len_in = iter_iov_len(iter); > + size_t len; > + > + if (!is_valid_madvise(start, len_in, behavior)) { > + ret = -EINVAL; > + break; > + } > + > + len = PAGE_ALIGN(len_in); > + if (start + len == start) > + ret = 0; > + else > + ret = madvise_do_behavior(mm, start, len_in, len, > + behavior); > /* > * An madvise operation is attempting to restart the syscall, > * but we cannot proceed as it would not be correct to repeat > @@ -1772,12 +1789,17 @@ static ssize_t vector_madvise(struct mm_struct *mm, struct iov_iter *iter, > ret = -EINTR; > break; > } > + > + /* Drop and reacquire lock to unwind race. */ > + madvise_unlock(mm, behavior); > + madvise_lock(mm, behavior); > continue; > } > if (ret < 0) > break; > iov_iter_advance(iter, iter_iov_len(iter)); > } > + madvise_unlock(mm, behavior); > > ret = (total_len - iov_iter_count(iter)) ? : ret; > > -- > 2.39.5