From nobody Wed Dec 17 08:59:26 2025 Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 741C242AB4 for ; Sat, 10 May 2025 03:32:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.191 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746847927; cv=none; b=FsAZKG6EdfwlDHe+TrbnZZgP6F8W8s6nMLnhtmUTmZ2uUNoFrCqKS25HG1RG5+YKFk52nkrtXdzX/Wx835sHW68GyG+pXHCP1BHjFpkS0ynC8JPgJfuDdPKQEysz0SM5eh2yrLamB3tv/ycinZYp6jR7xPA3OE31Qk34W+6/KvQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746847927; c=relaxed/simple; bh=WDgm1rnjA6iM8ibp1cxEAvd6TWSmBc8LRAKzag92bIo=; h=From:To:CC:Subject:Date:Message-ID:MIME-Version:Content-Type; b=e+h5gr6NSsV/bg40hsbP469Wrfv2PEQ9pY7R/IAJhpF2laVNm/QjQkMgne3GtqFzOyFNsec48pnt9Yysh9FMkFgp0CIcCvTKZnu2Qv5kaVaJYNb+2xlK9RE2Nw7O7KaS6iUqqD53OJ9+PfJPHT+DrYdkmkj5ubbaSSDQGqd1vcE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.191 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.163.44]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4ZvWZn0pZzz1R7Xb; Sat, 10 May 2025 11:29:53 +0800 (CST) Received: from kwepemg100017.china.huawei.com (unknown [7.202.181.58]) by mail.maildlp.com (Postfix) with ESMTPS id 4A5F1140293; Sat, 10 May 2025 11:32:00 +0800 (CST) Received: from huawei.com (10.175.124.71) by kwepemg100017.china.huawei.com (7.202.181.58) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Sat, 10 May 2025 11:31:59 +0800 From: Wupeng Ma To: , , , , , CC: , , , , Subject: [PATCH] VMCI: fix race between vmci_host_setup_notify and vmci_ctx_unset_notify Date: Sat, 10 May 2025 11:30:40 +0800 Message-ID: <20250510033040.901582-1-mawupeng1@huawei.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To kwepemg100017.china.huawei.com (7.202.181.58) Content-Type: text/plain; charset="utf-8" During our test, it is found that a warning can be trigger in try_grab_folio as follow: ------------[ cut here ]------------ WARNING: CPU: 0 PID: 1678 at mm/gup.c:147 try_grab_folio+0x106/0x130 Modules linked in: CPU: 0 UID: 0 PID: 1678 Comm: syz.3.31 Not tainted 6.15.0-rc5 #163 PREEMP= T(undef) RIP: 0010:try_grab_folio+0x106/0x130 Call Trace: follow_huge_pmd+0x240/0x8e0 follow_pmd_mask.constprop.0.isra.0+0x40b/0x5c0 follow_pud_mask.constprop.0.isra.0+0x14a/0x170 follow_page_mask+0x1c2/0x1f0 __get_user_pages+0x176/0x950 __gup_longterm_locked+0x15b/0x1060 ? gup_fast+0x120/0x1f0 gup_fast_fallback+0x17e/0x230 get_user_pages_fast+0x5f/0x80 vmci_host_unlocked_ioctl+0x21c/0xf80 RIP: 0033:0x54d2cd ---[ end trace 0000000000000000 ]--- Digging into the source, context->notify_page may init by get_user_pages_fa= st and can be seen in vmci_ctx_unset_notify which will try to put_page. However get_user_pages_fast is not finished here and lead to following try_grab_folio warning. The race condition is shown as follow: cpu0 cpu1 vmci_host_do_set_notify vmci_host_setup_notify get_user_pages_fast(uva, 1, FOLL_WRITE, &context->notify_page); lockless_pages_from_mm gup_pgd_range gup_huge_pmd // update &context->notify_page vmci_host_do_set_notify vmci_ctx_unset_notify notify_page =3D context->notify_page; if (notify_page) put_page(notify_page); // page is freed __gup_longterm_locked __get_user_pages follow_trans_huge_pmd try_grab_folio // warn here To slove this, use local variable page to make notify_page can be seen after finish get_user_pages_fast. Fixes: a1d88436d53a ("VMCI: Fix two UVA mapping bugs") Closes: https://lore.kernel.org/all/e91da589-ad57-3969-d979-879bbd10dddd@hu= awei.com/ Signed-off-by: Wupeng Ma --- drivers/misc/vmw_vmci/vmci_host.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/misc/vmw_vmci/vmci_host.c b/drivers/misc/vmw_vmci/vmci= _host.c index abe79f6fd2a7..b64944367ac5 100644 --- a/drivers/misc/vmw_vmci/vmci_host.c +++ b/drivers/misc/vmw_vmci/vmci_host.c @@ -227,6 +227,7 @@ static int drv_cp_harray_to_user(void __user *user_buf_= uva, static int vmci_host_setup_notify(struct vmci_ctx *context, unsigned long uva) { + struct page *page; int retval; =20 if (context->notify_page) { @@ -243,13 +244,11 @@ static int vmci_host_setup_notify(struct vmci_ctx *co= ntext, /* * Lock physical page backing a given user VA. */ - retval =3D get_user_pages_fast(uva, 1, FOLL_WRITE, &context->notify_page); - if (retval !=3D 1) { - context->notify_page =3D NULL; + retval =3D get_user_pages_fast(uva, 1, FOLL_WRITE, &page); + if (retval !=3D 1) return VMCI_ERROR_GENERIC; - } - if (context->notify_page =3D=3D NULL) - return VMCI_ERROR_UNAVAILABLE; + + context->notify_page =3D page; =20 /* * Map the locked page and set up notify pointer. --=20 2.43.0