From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793213906; b=j+qTbtFSM/FfJULt4NSDUN2nEUbJLZLXiT0I+Bwt3TQ0SAskPj4QarwTdvBoYwZqng2w iLSLgzoSqf2VvBhttl32gaQDbztaKlDnAFUw6CNO3vKB1GIH+u7UMAJ51B2OsGPGwKBih il6PAh54LbQdrjbAzwW7KQQ9PedgzBPThSA+OZByBslE2NhV4V41C+64CP/mS0ibbJW/S vxEyCX5ybAEnr0jmdILYc+SG+Si3a8uCZcnmM+jxCYGuGFFKh2NN46bMNfxE+8l6Zjkwk oi75PL+NK18lryREuLmtus+KFnQJMjCXx4IKPu4b9DQBNcZOcFEgHL+N9uQ/NFk/0jg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793213906; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:User-Agent:X-stable:X-Patchwork-Hint: MIME-Version:Content-Transfer-Encoding; bh=lNmGV2hfrotH3u671AUHy55A+9tQNVfaLEyg8VhCf8A=; b=ZntyRFdad3jrTJS0onrOy/zgQn7gaLbaSxzBwEWIRTR16Q+69QTRoKnoURFJSl7bW282 Ihh6ALH+Ulg9/X59a3H0LgeGBOzlgFktBvB+IzTstoa/MeDM+jX2h61Nprm87n/6cdMgN 9KL3WVDSO0UZvAnISFHfYftMNVFRBXvz0DTZggLr5mgH0MmQPzM5s/ypZ4iZ6bKWbMnLG zpvyjZVi8LGdVBNByW2fgcYkySq8xubWWIhCMtPWOCHYfWlr9ObS4mY/wXSD1CzLtA2bh 5XGH8W0TK0QobHVPm2a6ZBn93KN6aVeRl/MedNOqUCmTZlyVUtZpJ6EkHCBNDiC959A== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=linuxfoundation.org header.i=@linuxfoundation.org header.a=rsa-sha256 header.s=korg header.b="hXc/rDkX"; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 24E67606A31C; Wed, 28 Oct 2026 18:58:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key, unprotected) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.a=rsa-sha256 header.s=korg header.b=hXc/rDkX Received: by smtp.kernel.org (Postfix) with ESMTPSA id 549501F01825; Wed, 28 Oct 2026 18:58:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxfoundation.org; s=korg; t=1793213906; bh=lNmGV2hfrotH3u671AUHy55A+9tQNVfaLEyg8VhCf8A=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=hXc/rDkX/H5787Mkao0O3kUloj5ISXSg7fHf7ouIpJb7e9KVd8ND/9WF8ekGLN/PK cuMY1Fd8C00zPtkQlqF4OJyZ62wp2OX1kkQnZb46YGdr1qYHvguHqaF1Vh5FdawFvJ G9EMbxaWBVxec/IvWJRnKbsYFKTfvlOfQw3V21I0= From: Greg Kroah-Hartman To: stable@vger.kernel.org Cc: Greg Kroah-Hartman , patches@lists.linux.dev, Miaohe Lin , Thorvald Natvig , Jane Chu , Christian Brauner , Heiko Carstens , Kent Overstreet , "Liam R. Howlett" , Mateusz Guzik , "Matthew Wilcox (Oracle)" , Muchun Song , Oleg Nesterov , Peng Zhang , Tycho Andersen , Andrew Morton , Sasha Levin Subject: [PATCH 6.1 0628/1887] fork: defer linking file vma until vma is fully initialized Date: Wed, 28 Oct 2026 17:45:24 +0100 Message-ID: <20261028170513.699615076@linuxfoundation.org> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261028170459.200466217@linuxfoundation.org> References: <20261028170459.200466217@linuxfoundation.org> User-Agent: quilt/0.69 X-stable: review X-Patchwork-Hint: ignore X-Mailing-List: patches@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 6.1-stable review patch. If anyone has any objections, please let me know. ------------------ From: Miaohe Lin [ Upstream commit 35e351780fa9d8240dd6f7e4f245f9ea37e96c19 ] Thorvald reported a WARNING [1]. And the root cause is below race: CPU 1 CPU 2 fork hugetlbfs_fallocate dup_mmap hugetlbfs_punch_hole i_mmap_lock_write(mapping); vma_interval_tree_insert_after -- Child vma is visible through i_mmap tree. i_mmap_unlock_write(mapping); hugetlb_dup_vma_private -- Clear vma_lock outside i_mmap_rwsem! i_mmap_lock_write(mapping); hugetlb_vmdelete_list vma_interval_tree_foreach hugetlb_vma_trylock_write -- Vma_lock is cleared. tmp->vm_ops->open -- Alloc new vma_lock outside i_mmap_rwsem! hugetlb_vma_unlock_write -- Vma_lock is assigned!!! i_mmap_unlock_write(mapping); hugetlb_dup_vma_private() and hugetlb_vm_op_open() are called outside i_mmap_rwsem lock while vma lock can be used in the same time. Fix this by deferring linking file vma until vma is fully initialized. Those vmas should be initialized first before they can be used. Link: https://lkml.kernel.org/r/20240410091441.3539905-1-linmiaohe@huawei.com Fixes: 8d9bfb260814 ("hugetlb: add vma based lock for pmd sharing") Signed-off-by: Miaohe Lin Reported-by: Thorvald Natvig Closes: https://lore.kernel.org/linux-mm/20240129161735.6gmjsswx62o4pbja@revolver/T/ [1] Reviewed-by: Jane Chu Cc: Christian Brauner Cc: Heiko Carstens Cc: Kent Overstreet Cc: Liam R. Howlett Cc: Mateusz Guzik Cc: Matthew Wilcox (Oracle) Cc: Miaohe Lin Cc: Muchun Song Cc: Oleg Nesterov Cc: Peng Zhang Cc: Tycho Andersen Cc: Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin --- kernel/fork.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/kernel/fork.c b/kernel/fork.c index 39b8483e07003..1a480f30ca985 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -669,6 +669,24 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, } else if (anon_vma_fork(tmp, mpnt)) goto fail_nomem_anon_vma_fork; tmp->vm_flags &= ~(VM_LOCKED | VM_LOCKONFAULT); + /* + * Copy/update hugetlb private vma information. + */ + if (is_vm_hugetlb_page(tmp)) + hugetlb_dup_vma_private(tmp); + + /* Link the vma into the MT */ + mas.index = tmp->vm_start; + mas.last = tmp->vm_end - 1; + mas_store(&mas, tmp); + if (mas_is_err(&mas)) + goto fail_nomem_mas_store; + + mm->map_count++; + + if (tmp->vm_ops && tmp->vm_ops->open) + tmp->vm_ops->open(tmp); + file = tmp->vm_file; if (file) { struct address_space *mapping = file->f_mapping; @@ -685,26 +703,9 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, i_mmap_unlock_write(mapping); } - /* - * Copy/update hugetlb private vma information. - */ - if (is_vm_hugetlb_page(tmp)) - hugetlb_dup_vma_private(tmp); - - /* Link the vma into the MT */ - mas.index = tmp->vm_start; - mas.last = tmp->vm_end - 1; - mas_store(&mas, tmp); - if (mas_is_err(&mas)) - goto fail_nomem_mas_store; - - mm->map_count++; if (!(tmp->vm_flags & VM_WIPEONFORK)) retval = copy_page_range(tmp, mpnt); - if (tmp->vm_ops && tmp->vm_ops->open) - tmp->vm_ops->open(tmp); - if (retval) goto loop_out; } -- 2.53.0