All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vernon Yang <vernon2gm@gmail.com>
To: Liam Howlett <liam.howlett@oracle.com>
Cc: "maple-tree@lists.infradead.org" <maple-tree@lists.infradead.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH v2 06/44] mm/mmap: convert brk to use vma iterator
Date: Mon, 9 Jan 2023 23:10:00 +0800	[thread overview]
Message-ID: <Y7wsE3wiD2FBJoaz@vernon-pc> (raw)
In-Reply-To: <20230105191517.3099082-7-Liam.Howlett@oracle.com>

Hello Liam,

On Thu, Jan 05, 2023 at 07:15:54PM +0000, Liam Howlett wrote:
> From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
>
> Use the vma iterator API for the brk() system call.  This will provide
> type safety at compile time.
>
> Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
> ---
>  mm/mmap.c | 47 +++++++++++++++++++++++------------------------
>  1 file changed, 23 insertions(+), 24 deletions(-)
>
> diff --git a/mm/mmap.c b/mm/mmap.c
> index 9318f2ac8a6e..4a6f42ab3560 100644
> --- a/mm/mmap.c
> +++ b/mm/mmap.c
> @@ -239,10 +239,10 @@ static int check_brk_limits(unsigned long addr, unsigned long len)
>
>  	return mlock_future_check(current->mm, current->mm->def_flags, len);
>  }
> -static int do_brk_munmap(struct ma_state *mas, struct vm_area_struct *vma,
> +static int do_brk_munmap(struct vma_iterator *vmi, struct vm_area_struct *vma,
>  			 unsigned long newbrk, unsigned long oldbrk,
>  			 struct list_head *uf);
> -static int do_brk_flags(struct ma_state *mas, struct vm_area_struct *brkvma,
> +static int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *brkvma,
>  		unsigned long addr, unsigned long request, unsigned long flags);
>  SYSCALL_DEFINE1(brk, unsigned long, brk)
>  {
> @@ -253,7 +253,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
>  	bool populate;
>  	bool downgraded = false;
>  	LIST_HEAD(uf);
> -	MA_STATE(mas, &mm->mm_mt, 0, 0);
> +	struct vma_iterator vmi;
>
>  	if (mmap_write_lock_killable(mm))
>  		return -EINTR;
> @@ -301,8 +301,8 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
>  		int ret;
>
>  		/* Search one past newbrk */
> -		mas_set(&mas, newbrk);
> -		brkvma = mas_find(&mas, oldbrk);
> +		vma_iter_init(&vmi, mm, newbrk);
> +		brkvma = vma_find(&vmi, oldbrk);
>  		if (!brkvma || brkvma->vm_start >= oldbrk)
>  			goto out; /* mapping intersects with an existing non-brk vma. */
>  		/*
> @@ -311,7 +311,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
>  		 * before calling do_brk_munmap().
>  		 */
>  		mm->brk = brk;
> -		ret = do_brk_munmap(&mas, brkvma, newbrk, oldbrk, &uf);
> +		ret = do_brk_munmap(&vmi, brkvma, newbrk, oldbrk, &uf);
>  		if (ret == 1)  {
>  			downgraded = true;
>  			goto success;
> @@ -329,14 +329,14 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
>  	 * Only check if the next VMA is within the stack_guard_gap of the
>  	 * expansion area
>  	 */
> -	mas_set(&mas, oldbrk);
> -	next = mas_find(&mas, newbrk - 1 + PAGE_SIZE + stack_guard_gap);
> +	vma_iter_init(&vmi, mm, oldbrk);
> +	next = vma_find(&vmi, newbrk + PAGE_SIZE + stack_guard_gap);
>  	if (next && newbrk + PAGE_SIZE > vm_start_gap(next))
>  		goto out;
>
> -	brkvma = mas_prev(&mas, mm->start_brk);
> +	brkvma = vma_prev_limit(&vmi, mm->start_brk);
>  	/* Ok, looks good - let it rip. */
> -	if (do_brk_flags(&mas, brkvma, oldbrk, newbrk - oldbrk, 0) < 0)
> +	if (do_brk_flags(&vmi, brkvma, oldbrk, newbrk - oldbrk, 0) < 0)
>  		goto out;
>
>  	mm->brk = brk;
> @@ -2963,7 +2963,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
>
>  /*
>   * brk_munmap() - Unmap a parital vma.
> - * @mas: The maple tree state.
> + * @vmi: The vma iterator
>   * @vma: The vma to be modified
>   * @newbrk: the start of the address to unmap
>   * @oldbrk: The end of the address to unmap
> @@ -2973,7 +2973,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
>   * unmaps a partial VMA mapping.  Does not handle alignment, downgrades lock if
>   * possible.
>   */
> -static int do_brk_munmap(struct ma_state *mas, struct vm_area_struct *vma,
> +static int do_brk_munmap(struct vma_iterator *vmi, struct vm_area_struct *vma,
>  			 unsigned long newbrk, unsigned long oldbrk,
>  			 struct list_head *uf)
>  {
> @@ -2981,14 +2981,14 @@ static int do_brk_munmap(struct ma_state *mas, struct vm_area_struct *vma,
>  	int ret;
>
>  	arch_unmap(mm, newbrk, oldbrk);
> -	ret = do_mas_align_munmap(mas, vma, mm, newbrk, oldbrk, uf, true);
> +	ret = do_mas_align_munmap(&vmi->mas, vma, mm, newbrk, oldbrk, uf, true);
>  	validate_mm_mt(mm);
>  	return ret;
>  }
>
>  /*
>   * do_brk_flags() - Increase the brk vma if the flags match.
> - * @mas: The maple tree state.
> + * @vmi: The vma iterator
>   * @addr: The start address
>   * @len: The length of the increase
>   * @vma: The vma,
> @@ -2998,7 +2998,7 @@ static int do_brk_munmap(struct ma_state *mas, struct vm_area_struct *vma,
>   * do not match then create a new anonymous VMA.  Eventually we may be able to
>   * do some brk-specific accounting here.
>   */
> -static int do_brk_flags(struct ma_state *mas, struct vm_area_struct *vma,
> +static int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,
>  		unsigned long addr, unsigned long len, unsigned long flags)
>  {
>  	struct mm_struct *mm = current->mm;
> @@ -3025,8 +3025,7 @@ static int do_brk_flags(struct ma_state *mas, struct vm_area_struct *vma,
>  	if (vma && vma->vm_end == addr && !vma_policy(vma) &&
>  	    can_vma_merge_after(vma, flags, NULL, NULL,
>  				addr >> PAGE_SHIFT, NULL_VM_UFFD_CTX, NULL)) {
> -		mas_set_range(mas, vma->vm_start, addr + len - 1);

Why was mas_set_range() removed here, but below [1] it’s left?

> -		if (mas_preallocate(mas, vma, GFP_KERNEL))
> +		if (vma_iter_prealloc(vmi, vma))
>  			goto unacct_fail;
>
>  		vma_adjust_trans_huge(vma, vma->vm_start, addr + len, 0);
> @@ -3036,7 +3035,7 @@ static int do_brk_flags(struct ma_state *mas, struct vm_area_struct *vma,
>  		}
>  		vma->vm_end = addr + len;
>  		vma->vm_flags |= VM_SOFTDIRTY;
> -		mas_store_prealloc(mas, vma);
> +		vma_iter_store(vmi, vma);
>
>  		if (vma->anon_vma) {
>  			anon_vma_interval_tree_post_update_vma(vma);
> @@ -3057,8 +3056,8 @@ static int do_brk_flags(struct ma_state *mas, struct vm_area_struct *vma,
>  	vma->vm_pgoff = addr >> PAGE_SHIFT;
>  	vma->vm_flags = flags;
>  	vma->vm_page_prot = vm_get_page_prot(flags);
> -	mas_set_range(mas, vma->vm_start, addr + len - 1);
> -	if (mas_store_gfp(mas, vma, GFP_KERNEL))
> +	mas_set_range(&vmi->mas, vma->vm_start, vma->vm_end - 1);

[1]. the mas_set_range() here has been reserved.

> +	if (vma_iter_store_gfp(vmi, vma, GFP_KERNEL))
>  		goto mas_store_fail;
>
>  	mm->map_count++;
> @@ -3087,7 +3086,7 @@ int vm_brk_flags(unsigned long addr, unsigned long request, unsigned long flags)
>  	int ret;
>  	bool populate;
>  	LIST_HEAD(uf);
> -	MA_STATE(mas, &mm->mm_mt, addr, addr);
> +	VMA_ITERATOR(vmi, mm, addr);
>
>  	len = PAGE_ALIGN(request);
>  	if (len < request)
> @@ -3106,12 +3105,12 @@ int vm_brk_flags(unsigned long addr, unsigned long request, unsigned long flags)
>  	if (ret)
>  		goto limits_failed;
>
> -	ret = do_mas_munmap(&mas, mm, addr, len, &uf, 0);
> +	ret = do_mas_munmap(&vmi.mas, mm, addr, len, &uf, 0);
>  	if (ret)
>  		goto munmap_failed;
>
> -	vma = mas_prev(&mas, 0);
> -	ret = do_brk_flags(&mas, vma, addr, len, flags);
> +	vma = vma_prev(&vmi);
> +	ret = do_brk_flags(&vmi, vma, addr, len, flags);
>  	populate = ((mm->def_flags & VM_LOCKED) != 0);
>  	mmap_write_unlock(mm);
>  	userfaultfd_unmap_complete(mm, &uf);
> --
> 2.35.1
>


  reply	other threads:[~2023-01-09 15:10 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-05 19:15 [PATCH v2 00/44] VMA tree type safety and remove __vma_adjust() Liam Howlett
2023-01-05 19:15 ` [PATCH v2 02/44] maple_tree: Fix potential rcu issue Liam Howlett
2023-01-05 19:15 ` [PATCH v2 01/44] maple_tree: Add mas_init() function Liam Howlett
2023-01-05 19:15 ` [PATCH v2 05/44] mm: Expand vma iterator interface Liam Howlett
2023-01-05 19:15 ` [PATCH v2 04/44] test_maple_tree: Test modifications while iterating Liam Howlett
2023-01-05 19:15 ` [PATCH v2 03/44] maple_tree: Reduce user error potential Liam Howlett
2023-01-05 19:15 ` [PATCH v2 07/44] kernel/fork: Convert forking to using the vmi iterator Liam Howlett
2023-01-05 19:15 ` [PATCH v2 06/44] mm/mmap: convert brk to use vma iterator Liam Howlett
2023-01-09 15:10   ` Vernon Yang [this message]
2023-01-09 16:38     ` Liam Howlett
2023-01-05 19:15 ` [PATCH v2 08/44] mmap: Convert vma_link() " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 09/44] mm/mmap: Remove preallocation from do_mas_align_munmap() Liam Howlett
2023-01-05 19:15 ` [PATCH v2 10/44] mmap: Change do_mas_munmap and do_mas_aligned_munmap() to use vma iterator Liam Howlett
2023-01-10 14:53   ` Sven Schnelle
2023-01-10 17:26     ` Liam Howlett
2023-01-11  6:55       ` Sven Schnelle
2023-01-05 19:15 ` [PATCH v2 11/44] mmap: Convert vma_expand() " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 12/44] mm: Add temporary vma iterator versions of vma_merge(), split_vma(), and __split_vma() Liam Howlett
2023-01-05 19:15 ` [PATCH v2 14/44] userfaultfd: Use vma iterator Liam Howlett
2023-01-05 19:15 ` [PATCH v2 13/44] ipc/shm: Use the vma iterator for munmap calls Liam Howlett
2023-01-05 19:15 ` [PATCH v2 15/44] mm: Change mprotect_fixup to vma iterator Liam Howlett
2023-01-05 19:15 ` [PATCH v2 18/44] mempolicy: Convert " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 16/44] mlock: Convert mlock " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 17/44] coredump: Convert " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 21/44] madvise: Use vmi iterator for __split_vma() and vma_merge() Liam Howlett
2023-01-05 19:15 ` [PATCH v2 20/44] sched: Convert to vma iterator Liam Howlett
2023-01-05 19:15 ` [PATCH v2 19/44] task_mmu: " Liam Howlett
2023-01-05 19:15 ` [PATCH v2 22/44] mmap: Pass through vmi iterator to __split_vma() Liam Howlett
2023-01-07  2:01   ` SeongJae Park
2023-01-07  2:39     ` SeongJae Park
2023-01-09 16:45       ` Liam Howlett
2023-01-09 19:28         ` SeongJae Park
2023-01-09 20:30           ` Liam Howlett
2023-01-09 23:07             ` SeongJae Park
2023-01-05 19:15 ` [PATCH v2 24/44] mm/mremap: Use vmi version of vma_merge() Liam Howlett
2023-01-05 19:15 ` [PATCH v2 25/44] mm: Switch vma_merge(), split_vma(), and __split_vma to vma iterator Liam Howlett
2023-01-06 17:23   ` SeongJae Park
2023-01-06 19:20     ` Liam Howlett
2023-01-05 19:15 ` [PATCH v2 23/44] mmap: Use vmi version of vma_merge() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 27/44] mmap: Convert __vma_adjust() to use vma iterator Liam Howlett
2023-01-05 19:16 ` [PATCH v2 26/44] mm/damon: Stop using vma_mas_store() for maple tree store Liam Howlett
2023-01-05 19:32   ` SeongJae Park
2023-01-05 19:52     ` Liam Howlett
2023-01-05 20:16       ` SeongJae Park
2023-01-05 19:16 ` [PATCH v2 29/44] madvise: Use split_vma() instead of __split_vma() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 28/44] mm: Pass through vma iterator to __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 30/44] mm: Remove unnecessary write to vma iterator in __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 32/44] mm: Add vma iterator to vma_adjust() arguments Liam Howlett
2023-01-05 19:16 ` [PATCH v2 33/44] mmap: Clean up mmap_region() unrolling Liam Howlett
2023-01-05 19:16 ` [PATCH v2 31/44] mm: Pass vma iterator through to __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 34/44] mm: Change munmap splitting order and move_vma() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 37/44] mm/mmap: Use vma_prepare() and vma_complete() in vma_expand() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 35/44] mm/mmap: move anon_vma setting in __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 36/44] mm/mmap: Refactor locking out of __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 39/44] mm: Don't use __vma_adjust() in __split_vma() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 38/44] mm/mmap: Introduce init_vma_prep() and init_multi_vma_prep() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 40/44] mm/mmap: Don't use __vma_adjust() in shift_arg_pages() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 42/44] mm/mmap: Convert do_brk_flags() to use vma_prepare() and vma_complete() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 43/44] mm/mmap: Remove __vma_adjust() Liam Howlett
2023-01-05 19:16 ` [PATCH v2 41/44] mm/mmap: Introduce dup_vma_anon() helper Liam Howlett
2023-01-05 19:16 ` [PATCH v2 44/44] vma_merge: Set vma iterator to correct position Liam Howlett
2023-01-10 22:51 ` [PATCH v2 00/44] VMA tree type safety and remove __vma_adjust() Mark Brown
2023-01-11  2:22   ` Liam Howlett

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Y7wsE3wiD2FBJoaz@vernon-pc \
    --to=vernon2gm@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=liam.howlett@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=maple-tree@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.