Message ID | 20250206061517.2958-3-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 parameters validation logic from do_madvise(), for > easy reuse of the logic from a future change. > > Reviewed-by: Shakeel Butt <shakeel.butt@linux.dev> > Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > Reviewed-by: Davidlohr Bueso <dave@stgolabs.net> > Signed-off-by: SeongJae Park <sj@kernel.org> Reviewed-by: Liam R. Howlett <howlett@gmail.com> > --- > mm/madvise.c | 32 ++++++++++++++++++++++---------- > 1 file changed, 22 insertions(+), 10 deletions(-) > > diff --git a/mm/madvise.c b/mm/madvise.c > index df5a87a1846a..efab2878be7c 100644 > --- a/mm/madvise.c > +++ b/mm/madvise.c > @@ -1594,6 +1594,27 @@ static void madvise_unlock(struct mm_struct *mm, int behavior) > mmap_read_unlock(mm); > } > > +static bool is_valid_madvise(unsigned long start, size_t len_in, int behavior) > +{ > + size_t len; > + > + if (!madvise_behavior_valid(behavior)) > + return false; > + > + if (!PAGE_ALIGNED(start)) > + return false; > + len = PAGE_ALIGN(len_in); > + > + /* Check to see whether len was rounded up from small -ve to zero */ > + if (len_in && !len) > + return false; > + > + if (start + len < start) > + return false; > + > + return true; > +} > + > /* > * The madvise(2) system call. > * > @@ -1673,20 +1694,11 @@ int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int beh > size_t len; > struct blk_plug plug; > > - if (!madvise_behavior_valid(behavior)) > + if (!is_valid_madvise(start, len_in, behavior)) > return -EINVAL; > > - if (!PAGE_ALIGNED(start)) > - return -EINVAL; > len = PAGE_ALIGN(len_in); > - > - /* Check to see whether len was rounded up from small -ve to zero */ > - if (len_in && !len) > - return -EINVAL; > - > end = start + len; > - if (end < start) > - return -EINVAL; > > if (end == start) > return 0; > -- > 2.39.5
diff --git a/mm/madvise.c b/mm/madvise.c index df5a87a1846a..efab2878be7c 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -1594,6 +1594,27 @@ static void madvise_unlock(struct mm_struct *mm, int behavior) mmap_read_unlock(mm); } +static bool is_valid_madvise(unsigned long start, size_t len_in, int behavior) +{ + size_t len; + + if (!madvise_behavior_valid(behavior)) + return false; + + if (!PAGE_ALIGNED(start)) + return false; + len = PAGE_ALIGN(len_in); + + /* Check to see whether len was rounded up from small -ve to zero */ + if (len_in && !len) + return false; + + if (start + len < start) + return false; + + return true; +} + /* * The madvise(2) system call. * @@ -1673,20 +1694,11 @@ int do_madvise(struct mm_struct *mm, unsigned long start, size_t len_in, int beh size_t len; struct blk_plug plug; - if (!madvise_behavior_valid(behavior)) + if (!is_valid_madvise(start, len_in, behavior)) return -EINVAL; - if (!PAGE_ALIGNED(start)) - return -EINVAL; len = PAGE_ALIGN(len_in); - - /* Check to see whether len was rounded up from small -ve to zero */ - if (len_in && !len) - return -EINVAL; - end = start + len; - if (end < start) - return -EINVAL; if (end == start) return 0;