* SeongJae Park <sj@xxxxxxxxxx> [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@xxxxxxxxx> > Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> > Reviewed-by: Davidlohr Bueso <dave@xxxxxxxxxxxx> > Signed-off-by: SeongJae Park <sj@xxxxxxxxxx> Reviewed-by: Liam R. Howlett <howlett@xxxxxxxxx> > --- > 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