linux/drivers/gpu/drm
Linus Torvalds c03098d4b9 gfs2: Fix mmap + page fault deadlocks
Functions gfs2_file_read_iter and gfs2_file_write_iter are both
 accessing the user buffer to write to or read from while holding the
 inode glock.  In the most basic scenario, that buffer will not be
 resident and it will be mapped to the same file.  Accessing the buffer
 will trigger a page fault, and gfs2 will deadlock trying to take the
 same inode glock again while trying to handle that fault.
 
 Fix that and similar, more complex scenarios by disabling page faults
 while accessing user buffers.  To make this work, introduce a small
 amount of new infrastructure and fix some bugs that didn't trigger so
 far, with page faults enabled.
 -----BEGIN PGP SIGNATURE-----
 
 iQJIBAABCAAyFiEEJZs3krPW0xkhLMTc1b+f6wMTZToFAmGBPisUHGFncnVlbmJh
 QHJlZGhhdC5jb20ACgkQ1b+f6wMTZTpE6A/7BezUnGuNJxJrR8pC+vcLYA7xAgUU
 6STQ6IN7w5UHRlSkNzZxZ2XPxW4uVQ4SxSEeaLqBsHZihepjcLNFZ/8MhQ6UPSD0
 8noHOi7CoIcp6IuWQtCpxRM/xjjm2SlMt2XbVJZaiJcdzCV9gB6TU9EkBRq7Zm/X
 9WFBbv1xZF0skn9ISCJvNtiiI+VyWKgMDUKxJUiTQjmJcklyyqHcVGmQi9BjqPz4
 4s3F+WH6CoGbDKlmNk/6Y9wZ/2+sbvGswVscUxPwJVPoZWsR1xBBUdAeAmEMD1P4
 BgE/Y1J8JXyVPYtyvZKq70XUhKdQkxB7RfX87YasOk9mY4Kjd5rIIGEykh+o2vC9
 kDhCHvf2Mnw5I6Rum3B7UXyB1vemY+fECIHsXhgBnS+ztabRtcAdpCuWoqb43ymw
 yEX1KwXyU4FpRYbrRvdZT42Fmh6ty8TW+N4swg8S2TrffirvgAi5yrcHZ4mPupYv
 lyzvsCW7Wv8hPXn/twNObX+okRgJnsxcCdBXARdCnRXfA8tH23xmu88u8RA1Vdxh
 nzTvv6Dx2EowwojuDWMx29Mw3fA2IqIfbOV+4FaRU7NZ2ZKtknL8yGl27qQUsMoJ
 vYsHTmagasjQr+NDJ3vQRLCw+JQ6B1hENpdkmixFD9moo7X1ZFW3HBi/UL973Bv6
 5CmgeXto8FRUFjI=
 =WeNd
 -----END PGP SIGNATURE-----

Merge tag 'gfs2-v5.15-rc5-mmap-fault' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2

Pull gfs2 mmap + page fault deadlocks fixes from Andreas Gruenbacher:
 "Functions gfs2_file_read_iter and gfs2_file_write_iter are both
  accessing the user buffer to write to or read from while holding the
  inode glock.

  In the most basic deadlock scenario, that buffer will not be resident
  and it will be mapped to the same file. Accessing the buffer will
  trigger a page fault, and gfs2 will deadlock trying to take the same
  inode glock again while trying to handle that fault.

  Fix that and similar, more complex scenarios by disabling page faults
  while accessing user buffers. To make this work, introduce a small
  amount of new infrastructure and fix some bugs that didn't trigger so
  far, with page faults enabled"

* tag 'gfs2-v5.15-rc5-mmap-fault' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2:
  gfs2: Fix mmap + page fault deadlocks for direct I/O
  iov_iter: Introduce nofault flag to disable page faults
  gup: Introduce FOLL_NOFAULT flag to disable page faults
  iomap: Add done_before argument to iomap_dio_rw
  iomap: Support partial direct I/O on user copy failures
  iomap: Fix iomap_dio_rw return value for user copies
  gfs2: Fix mmap + page fault deadlocks for buffered I/O
  gfs2: Eliminate ip->i_gh
  gfs2: Move the inode glock locking to gfs2_file_buffered_write
  gfs2: Introduce flag for glock holder auto-demotion
  gfs2: Clean up function may_grant
  gfs2: Add wrapper for iomap_file_buffered_write
  iov_iter: Introduce fault_in_iov_iter_writeable
  iov_iter: Turn iov_iter_fault_in_readable into fault_in_iov_iter_readable
  gup: Turn fault_in_pages_{readable,writeable} into fault_in_{readable,writeable}
  powerpc/kvm: Fix kvm_use_magic_page
  iov_iter: Fix iov_iter_get_pages{,_alloc} page fault return value
2021-11-02 12:25:03 -07:00
..
amd Add an interface called cc_platform_has() which is supposed to be used 2021-11-01 15:16:52 -07:00
arm drm/arm/hdlcd: Convert to Linux IRQ interfaces 2021-08-10 20:00:51 +02:00
armada gup: Turn fault_in_pages_{readable,writeable} into fault_in_{readable,writeable} 2021-10-18 16:33:03 +02:00
aspeed drm/tiny: drm_gem_simple_display_pipe_prepare_fb is the default 2021-06-24 15:40:11 +02:00
ast Revert "drm/ast: Add detect function support" 2021-10-22 05:52:12 +10:00
atmel-hlcdc drm/atmel-hlcdc: Convert to Linux IRQ interfaces 2021-08-10 20:00:58 +02:00
bridge drm/bridge: ti-sn65dsi86: Avoid creating multiple connectors 2021-08-12 09:56:09 -07:00
etnaviv drm/etnaviv: add missing MMU context put when reaping MMU mapping 2021-09-16 10:35:37 +02:00
exynos drm/exynos: Make use of the helper function devm_platform_ioremap_resource() 2021-09-16 14:05:07 +09:00
fsl-dcu drm/fsl-dcu: Convert to Linux IRQ interfaces 2021-08-10 20:13:25 +02:00
gma500 drm/gma500: Convert to Linux IRQ interfaces 2021-08-10 20:13:32 +02:00
gud drm/gud: Get offset-adjusted mapping from drm_gem_fb_vmap() 2021-08-08 20:27:24 +02:00
hisilicon drm-misc-next for v5.15: 2021-07-30 14:52:00 +10:00
hyperv drm/hyperv: Fix double mouse pointers 2021-10-15 15:04:44 +10:00
i2c
i810 drm: IRQ midlayer is now legacy 2021-08-10 20:14:01 +02:00
i915 ARM: 2021-11-02 11:24:14 -07:00
imx drm for v5.15-rc1 2021-09-01 11:26:46 -07:00
ingenic drm/ingenic: Use standard drm_atomic_helper_commit_tail 2021-08-11 15:49:15 +02:00
kmb drm/kmb: Enable ADV bridge after modeset 2021-10-21 11:08:09 +02:00
lib
lima drm-misc-next for v5.15: 2021-07-21 11:58:28 +10:00
mcde drm-misc-next for v5.15: 2021-07-30 14:52:00 +10:00
mediatek Revert "drm/mediatek: Use mailbox rx_callback instead of cmdq_task_cb" 2021-10-12 08:02:27 +08:00
meson drm for v5.15-rc1 2021-09-01 11:26:46 -07:00
mga drm/mga/mga_ioc32: Use struct_group() for memcpy() region 2021-09-25 08:20:48 -07:00
mgag200 drm/mgag200: Fix uninitialized variable delta 2021-08-18 20:47:59 +02:00
msm Merge tag 'drm-msm-fixes-2021-10-18' of https://gitlab.freedesktop.org/drm/msm into drm-fixes 2021-10-22 05:22:15 +10:00
mxsfb drm: mxsfb: Fix NULL pointer dereference crash on unload 2021-10-21 11:08:08 +02:00
nouveau Various hardening fixes and cleanups for 5.16-rc1 2021-11-01 17:29:10 -07:00
omapdrm drm/bridge: Centralize error message when bridge attach fails 2021-07-28 16:33:12 +03:00
panel drm/panel: ilitek-ili9881c: Fix sync for Feixin K101-IM2BYL02 panel 2021-10-21 11:08:08 +02:00
panfrost drm/panfrost: Clamp lock region to Bifrost minimum 2021-08-25 15:40:19 +01:00
pl111 drm/pl111: Remove unused including <linux/version.h> 2021-07-31 20:52:01 +02:00
qxl drm-misc-next for v5.15: 2021-07-21 11:58:28 +10:00
r128 drm/r128: fix build for UML 2021-10-15 15:05:10 +10:00
radeon drm/radeon: pass drm dev radeon_agp_head_init directly 2021-09-16 09:56:24 -04:00
rcar-du drm: rcar-du: Don't create encoder for unconnected LVDS outputs 2021-10-13 07:44:04 +10:00
rockchip drm/rockchip: Update crtc fixup to account for fractional clk change 2021-10-06 11:05:45 +02:00
savage drm/savage: Remove references to struct drm_device.pdev 2021-05-03 19:48:30 +02:00
scheduler drm/sched: Allow using a dedicated workqueue for the timeout/fault tdr 2021-07-01 08:53:25 +02:00
selftests drm/i915/selftests: Properly reset mock object propers for each test 2021-10-22 11:09:45 +02:00
shmobile drm/shmobile: Convert to Linux IRQ interfaces 2021-07-25 11:01:12 +02:00
sis drm/sis: Remove references to struct drm_device.pdev 2021-05-03 19:48:33 +02:00
sti drm/bridge: Centralize error message when bridge attach fails 2021-07-28 16:33:12 +03:00
stm drm/stm: dsi: compute the transition time from LP to HS and back 2021-07-19 15:35:55 +02:00
sun4i drm/sun4i: dw-hdmi: Fix HDMI PHY clock setup 2021-10-06 11:05:44 +02:00
tdfx
tegra drm/tegra: uapi: Fix wrong mapping end address in case of disabled IOMMU 2021-09-16 18:06:51 +02:00
tidss drm/tidss: Convert to Linux IRQ interfaces 2021-08-10 20:13:49 +02:00
tilcdc drm/tilcdc: Convert to Linux IRQ interfaces 2021-08-10 20:13:53 +02:00
tiny drm/simpledrm: Use offset-adjusted shadow-plane mapping 2021-08-08 20:27:40 +02:00
ttm drm/ttm: fix memleak in ttm_transfered_destroy 2021-10-21 15:27:21 +02:00
tve200 drm/tiny: drm_gem_simple_display_pipe_prepare_fb is the default 2021-06-24 15:40:11 +02:00
udl drm/udl: Use offset-adjusted shadow-plane mapping 2021-08-08 20:27:44 +02:00
v3d drm/v3d: Expose performance counters to userspace 2021-07-21 00:19:59 +01:00
vboxvideo drm/vbox: Use offset-adjusted shadow-plane mappings 2021-08-08 20:27:49 +02:00
vc4 drm/vc4: hdmi: Remove unused struct 2021-10-06 11:05:44 +02:00
vgem Revert "drm/vgem: Implement mmap as GEM object function" 2021-07-13 13:15:52 +02:00
via drm: IRQ midlayer is now legacy 2021-08-10 20:14:01 +02:00
virtio drm/virtio: set non-cross device blob uuid_state 2021-08-12 14:58:31 +02:00
vkms drm/vkms: Use offset-adjusted shadow-plane mappings and output 2021-08-08 20:27:52 +02:00
vmwgfx treewide: Replace the use of mem_encrypt_active() with cc_platform_has() 2021-10-04 11:47:24 +02:00
xen drm/tiny: drm_gem_simple_display_pipe_prepare_fb is the default 2021-06-24 15:40:11 +02:00
xlnx drm/xlnx/zynqmp_disp: Fix incorrectly named enum 'zynqmp_disp_layer_id' 2021-08-09 02:28:05 +03:00
zte drm/zte: Don't set struct drm_device.irq_enabled 2021-06-29 15:40:53 +02:00
Kconfig drm: amdgpu: remove obsolete reference to config CHASH 2021-08-18 18:26:10 -04:00
Makefile drm/bochs: Move to tiny/ 2021-07-05 08:54:44 +02:00
drm_agpsupport.c drm: Include <asm/agp.h> iff CONFIG_AGP is set 2021-05-11 14:13:33 +02:00
drm_aperture.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_atomic.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_atomic_helper.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_atomic_state_helper.c
drm_atomic_uapi.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_auth.c drm: add lockdep assert to drm_is_current_master_locked 2021-08-05 12:08:15 +02:00
drm_blend.c drm: drm_blend.c: Use tabs for code indents 2021-04-22 10:46:35 +02:00
drm_bridge.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_bridge_connector.c
drm_bufs.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_cache.c treewide: Replace the use of mem_encrypt_active() with cc_platform_has() 2021-10-04 11:47:24 +02:00
drm_client.c
drm_client_modeset.c
drm_color_mgmt.c
drm_connector.c drm: avoid circular locks in drm_mode_getconnector 2021-07-20 20:13:56 +02:00
drm_context.c drm: correct function name drm_legacy_ctxbitmap_flush() 2021-05-16 22:01:14 +02:00
drm_crtc.c
drm_crtc_helper.c
drm_crtc_helper_internal.h
drm_crtc_internal.h Backmerge remote-tracking branch 'drm/drm-next' into drm-misc-next 2021-07-27 12:48:17 +02:00
drm_damage_helper.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_debugfs.c drm: avoid blocking in drm_clients_info's rcu section 2021-07-20 20:14:42 +02:00
drm_debugfs_crc.c drm/doc: document how userspace should find out CRTC index 2021-06-10 19:14:47 +02:00
drm_displayid.c
drm_dma.c drm: remove usage of drm_pci_alloc/free 2021-04-26 18:19:15 +02:00
drm_dp_aux_bus.c Bus: Make remove callback return void tag 2021-08-11 08:47:08 +10:00
drm_dp_aux_dev.c drm/dp: Add backpointer to drm_device in drm_dp_aux 2021-04-27 18:43:42 -04:00
drm_dp_cec.c
drm_dp_dual_mode_helper.c drm/dp_dual_mode: Convert drm_dp_dual_mode_helper.c to using drm_err/drm_dbg_kms() 2021-04-27 18:43:45 -04:00
drm_dp_helper.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_dp_mst_topology.c drm/dp_mst: Fix return code on sideband message failure 2021-07-27 18:58:28 -04:00
drm_dp_mst_topology_internal.h
drm_drv.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_dsc.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_dumb_buffers.c
drm_edid.c drm/edid: In connector_bad_edid() cap num_of_ext by num_blocks read 2021-10-15 15:03:57 +10:00
drm_edid_load.c
drm_encoder.c
drm_encoder_slave.c
drm_fb_cma_helper.c drm: Add and export function drm_fb_cma_sync_non_coherent 2021-05-25 11:42:09 +01:00
drm_fb_helper.c drm/fbdev: Clamp fbdev surface size if too large 2021-10-15 15:04:05 +10:00
drm_file.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_flip_work.c
drm_format_helper.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_fourcc.c Merge tag 'amd-drm-next-5.14-2021-06-02' of https://gitlab.freedesktop.org/agd5f/linux into drm-next 2021-06-04 06:13:57 +10:00
drm_framebuffer.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_gem.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_gem_atomic_helper.c drm/gem: Provide offset-adjusted framebuffer BO mappings 2021-08-08 20:26:16 +02:00
drm_gem_cma_helper.c drm: Fix misleading documentation of drm_gem_cma_create() 2021-06-01 17:27:20 +01:00
drm_gem_framebuffer_helper.c drm/gem: Provide offset-adjusted framebuffer BO mappings 2021-08-08 20:26:16 +02:00
drm_gem_shmem_helper.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_gem_ttm_helper.c drm/ttm: rename bo->mem and make it a pointer 2021-06-02 11:07:25 +02:00
drm_gem_vram_helper.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_hashtab.c
drm_hdcp.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_internal.h drm: Mark IRQ_BUSID ioctl as legacy 2021-05-17 21:19:48 +02:00
drm_ioc32.c drm: Copy drm_wait_vblank to user before returning 2021-08-17 13:56:03 -04:00
drm_ioctl.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_irq.c drm: IRQ midlayer is now legacy 2021-08-10 20:14:01 +02:00
drm_kms_helper_common.c
drm_lease.c drm: clean up unused kerneldoc in drm_lease.c 2021-07-30 11:55:41 +02:00
drm_legacy.h drm: Mark IRQ_BUSID ioctl as legacy 2021-05-17 21:19:48 +02:00
drm_legacy_misc.c drm: IRQ midlayer is now legacy 2021-08-10 20:14:01 +02:00
drm_lock.c
drm_managed.c
drm_memory.c drm: Mark AGP implementation and ioctls as legacy 2021-05-10 15:46:58 +02:00
drm_mipi_dbi.c drm/mipi-dbi: Use framebuffer dma-buf helpers 2021-07-23 20:17:59 +02:00
drm_mipi_dsi.c
drm_mm.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_mode_config.c
drm_mode_object.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_modes.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_modeset_helper.c
drm_modeset_lock.c kernel/locking: Add context to ww_mutex_trylock() 2021-09-17 15:08:41 +02:00
drm_of.c drm/of: free the iterator object on failure 2021-07-15 10:54:04 +01:00
drm_panel.c drm/dp: Move panel DP AUX backlight support to drm_dp_helper 2021-07-13 06:38:37 -07:00
drm_panel_orientation_quirks.c drm: panel-orientation-quirks: Add quirk for GPD Win3 2021-10-26 20:57:10 +02:00
drm_pci.c drm: Mark IRQ_BUSID ioctl as legacy 2021-05-17 21:19:48 +02:00
drm_plane.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_plane_helper.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_prime.c RDMA v5.15 merge window Pull Request 2021-09-02 14:47:21 -07:00
drm_print.c isystem: ship and use stdarg.h 2021-08-19 09:02:55 +09:00
drm_probe_helper.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_property.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_rect.c
drm_scatter.c
drm_scdc_helper.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_self_refresh_helper.c
drm_simple_kms_helper.c drm/simple-kms: Support custom CRTC state 2021-08-08 20:14:08 +02:00
drm_syncobj.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_sysfs.c
drm_trace.h
drm_trace_points.c
drm_vblank.c drm: IRQ midlayer is now legacy 2021-08-10 20:14:01 +02:00
drm_vblank_work.c
drm_vm.c drm: Mark AGP implementation and ioctls as legacy 2021-05-10 15:46:58 +02:00
drm_vma_manager.c drm: Fix typo in comments 2021-08-02 10:19:43 +02:00
drm_writeback.c