linux/drivers/misc
Wupeng Ma 00ddc7dad5 VMCI: fix race between vmci_host_setup_notify and vmci_ctx_unset_notify
commit 1bd6406fb5 upstream.

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 PREEMPT(undef)
  RIP: 0010:try_grab_folio+0x106/0x130
  Call Trace:
   <TASK>
   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_fast
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 = 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: a1d88436d5 ("VMCI: Fix two UVA mapping bugs")
Cc: stable <stable@kernel.org>
Closes: https://lore.kernel.org/all/e91da589-ad57-3969-d979-879bbd10dddd@huawei.com/
Signed-off-by: Wupeng Ma <mawupeng1@huawei.com>
Link: https://lore.kernel.org/r/20250510033040.901582-1-mawupeng1@huawei.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-06-19 15:32:34 +02:00
..
altera-stapl move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
bcm-vk move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
c2port c2port: replace deprecated strncpy with strscpy 2023-10-05 13:34:05 +02:00
cardreader Revert "drivers/card_reader/rtsx_usb: Restore interrupt based detection" 2025-03-13 13:02:10 +01:00
cb710 cb710: avoid NULL pointer subtraction 2021-10-05 15:50:05 +02:00
cxl cxl: Constify struct kobj_type 2024-09-11 16:02:50 +02:00
echo char: Replace HTTP links with HTTPS ones 2020-07-23 09:44:15 +02:00
eeprom eeprom: ee1004: Check chip before probing 2025-05-29 11:02:43 +02:00
genwqe mm, treewide: rename MAX_ORDER to MAX_PAGE_ORDER 2024-01-08 15:27:15 -08:00
ibmasm ibmasm: convert to new timestamp accessors 2023-10-18 13:26:16 +02:00
keba misc: keba: Fix sysfs group creation 2024-09-03 12:37:29 +02:00
lis3lv02d [tree-wide] finally take no_llseek out 2024-09-27 08:18:43 -07:00
lkdtm objtool, lkdtm: Obfuscate the do_nothing() pointer 2025-05-02 07:59:20 +02:00
mchp_pci1xxxx misc: microchip: pci1xxxx: Fix incorrect IRQ status handling during ack 2025-05-02 07:59:10 +02:00
mei mei: vsc: Cast tx_buf to (__be32 *) when passed to cpu_to_be32_array() 2025-06-19 15:32:13 +02:00
ocxl ocxl: Remove the unused declarations in headr file 2024-09-11 16:03:20 +02:00
pvpanic Linux 6.9-rc7 2024-05-08 19:21:51 +01:00
sgi-gru misc: sgi-gru: Don't disable preemption in GRU driver 2024-10-09 12:47:01 -07:00
sgi-xp sysctl-6.7-rc1 2023-11-01 20:51:41 -10:00
ti-st misc: ti-st: st_kim: use 'time_left' variable with wait_for_completion_interruptible_timeout() 2024-07-03 16:40:18 +02:00
uacce uacce: make uacce_class constant 2023-10-27 08:51:00 +02:00
vmw_vmci VMCI: fix race between vmci_host_setup_notify and vmci_ctx_unset_notify 2025-06-19 15:32:34 +02:00
ad525x_dpot-i2c.c misc: Switch i2c drivers back to use .probe() 2023-05-29 15:04:52 +01:00
ad525x_dpot-spi.c spi: make remove callback a void function 2022-02-09 13:00:45 +00:00
ad525x_dpot.c misc: ad525x_dpot: Make ad_dpot_remove() return void 2021-10-13 14:35:37 +02:00
ad525x_dpot.h misc: ad525x_dpot: Make ad_dpot_remove() return void 2021-10-13 14:35:37 +02:00
apds990x.c misc: apds990x: Fix missing pm_runtime_disable() 2024-12-05 14:02:36 +01:00
apds9802als.c misc: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-07-03 16:41:00 +02:00
atmel-ssc.c misc: atmel-ssc: Convert to platform remove callback returning void 2024-03-05 14:28:51 +00:00
bh1770glc.c misc: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-07-03 16:41:00 +02:00
cs5535-mfgpt.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 206 2019-05-30 11:29:53 -07:00
ds1682.c misc: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-07-03 16:41:00 +02:00
dummy-irq.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
dw-xdata-pcie.c dw-xdata: Remove usage of the deprecated ida_simple_*() API 2023-12-31 11:09:26 +00:00
enclosure.c drivers: remove struct module * setting from struct class 2023-03-17 15:16:27 +01:00
fastrpc.c misc: fastrpc: Fix copy buffer page size 2025-02-17 10:05:41 +01:00
gehc-achc.c misc: gehc-achc: Follow renaming of SPI "master" to "controller" 2024-02-08 11:54:43 +00:00
hi6421v600-irq.c misc: hi6421-spmi-pmic: Remove unused of_gpio.h 2024-03-05 14:28:41 +00:00
hisi_hikey_usb.c misc: hisi_hikey_usb: Convert to platform remove callback returning void 2024-03-05 14:28:52 +00:00
hmc6352.c misc: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-07-03 16:41:00 +02:00
hpilo.c misc: hpilo: rename device creation loop variable 2024-01-30 16:19:43 -08:00
hpilo.h misc: hpilo: map iLO shared memory by PCI revision id 2021-06-04 15:28:23 +02:00
ibmvmc.c Char/Misc and other driver changes for 6.7-rc1 2023-11-03 14:51:08 -10:00
ibmvmc.h misc: Use the correct style for SPDX License Identifier 2019-10-10 15:34:40 +02:00
ics932s401.c misc: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-07-03 16:41:00 +02:00
isl29003.c misc: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-07-03 16:41:00 +02:00
isl29020.c misc: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-07-03 16:41:00 +02:00
Kconfig rpmb: add Replay Protected Memory Block (RPMB) subsystem 2024-08-26 13:16:20 +02:00
kgdbts.c kgdbts: fix hw_access_break_test 2024-08-13 11:27:38 +02:00
lattice-ecp3-config.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
Makefile rpmb: add Replay Protected Memory Block (RPMB) subsystem 2024-08-26 13:16:20 +02:00
mrvl_cn10k_dpi.c misc: mrvl-cn10k-dpi: add Octeon CN10K DPI administrative driver 2024-07-10 14:58:29 +02:00
nsm.c misc: nsm: drop owner assignment 2024-05-22 08:31:17 -04:00
ntsync.c [tree-wide] finally take no_llseek out 2024-09-27 08:18:43 -07:00
open-dice.c misc: open-dice: add missing MODULE_DESCRIPTION() macro 2024-06-04 17:40:20 +02:00
pch_phub.c misc: pch_phub: Remove superfluous descriptions to non-existent args 'offset_address' 2020-07-01 15:05:37 +02:00
pci_endpoint_test.c misc: pci_endpoint_test: Give disabled BARs a distinct error code 2025-05-29 11:02:25 +02:00
phantom.c [tree-wide] finally take no_llseek out 2024-09-27 08:18:43 -07:00
qcom-coincell.c misc: Explicitly include correct DT includes 2023-08-04 15:39:04 +02:00
rpmb-core.c rpmb: fix error path in rpmb_dev_register() 2024-09-04 15:04:57 +02:00
smpro-errmon.c misc: smpro-errmon: Remove the unneeded include <linux/i2c.h> 2023-05-31 19:00:10 +01:00
smpro-misc.c misc: smpro-misc: Add Ampere's Altra SMpro misc driver 2022-11-10 19:03:03 +01:00
sram-exec.c mm: Introduce set_memory_rox() 2022-12-15 10:37:26 -08:00
sram.c misc: sram: Convert to platform remove callback returning void 2024-03-05 14:28:52 +00:00
sram.h misc: sram: Improve and simplify clk handling 2023-03-09 17:31:53 +01:00
tifm_7xx1.c misc: tifm: use 'time_left' variable with wait_for_completion_timeout() 2024-07-03 16:40:18 +02:00
tifm_core.c driver core: have match() callback in struct bus_type take a const * 2024-07-03 15:16:54 +02:00
tps6594-esm.c Merge 6.5-rc6 into char-misc-next 2023-08-13 22:14:51 +02:00
tps6594-pfsm.c misc: tps6594-pfsm: Add TI TPS65224 PMIC PFSM 2024-05-03 10:07:07 +01:00
tsl2550.c misc: tsl2550: replace simple_strtoul to kstrtoul 2024-09-03 12:34:31 +02:00
vcpu_stall_detector.c misc: Register a PPI for the vcpu stall detection virtual device 2024-07-04 12:31:22 +02:00
vmw_balloon.c vmw_balloon: dynamically allocate the vmw-balloon shrinker 2023-10-04 10:32:25 -07:00
xilinx_sdfec.c misc: xilinx_sdfec: Convert to platform remove callback returning void 2024-03-05 14:28:52 +00:00
xilinx_tmr_inject.c fault-inject: improve build for CONFIG_FAULT_INJECTION=n 2024-09-01 20:43:33 -07:00
xilinx_tmr_manager.c misc: Explicitly include correct DT includes 2023-08-04 15:39:04 +02:00