linux/drivers/gpu/drm
Chris Wilson e80e88ef60 drm/i915/userptr: Try to acquire the page lock around set_page_dirty()
commit 2d691aeca4 upstream.

set_page_dirty says:

	For pages with a mapping this should be done under the page lock
	for the benefit of asynchronous memory errors who prefer a
	consistent dirty state. This rule can be broken in some special
	cases, but should be better not to.

Under those rules, it is only safe for us to use the plain set_page_dirty
calls for shmemfs/anonymous memory. Userptr may be used with real
mappings and so needs to use the locked version (set_page_dirty_lock).

However, following a try_to_unmap() we may want to remove the userptr and
so call put_pages(). However, try_to_unmap() acquires the page lock and
so we must avoid recursively locking the pages ourselves -- which means
that we cannot safely acquire the lock around set_page_dirty(). Since we
can't be sure of the lock, we have to risk skip dirtying the page, or
else risk calling set_page_dirty() without a lock and so risk fs
corruption.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=203317
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112012
Fixes: 5cc9ed4b9a ("drm/i915: Introduce mapping of user pages into video memory (userptr) ioctl")
References: cb6d7c7dc7 ("drm/i915/userptr: Acquire the page lock around set_page_dirty()")
References: 505a8ec7e1 ("Revert "drm/i915/userptr: Acquire the page lock around set_page_dirty()"")
References: 6dcc693bc5 ("ext4: warn when page is dirtied without buffers")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: stable@vger.kernel.org
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191111133205.11590-1-chris@chris-wilson.co.uk
(cherry picked from commit 0d4bbe3d40)
Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
(cherry picked from commit cee7fb437e)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-12-01 09:16:12 +01:00
..
amd drm/amd/powerplay: issue no PPSMC_MSG_GetCurrPkgPwr on unsupported ASICs 2019-12-01 09:16:11 +01:00
arc
arm drm/arm/hdlcd: Allow a bit of clock tolerance 2019-06-25 11:35:58 +08:00
armada
ast drm/ast: Fixed reboot test may cause system hanged 2019-09-06 10:21:59 +02:00
atmel-hlcdc
bochs
bridge drm/rockchip: Check for fast link training before enabling psr 2019-10-07 18:56:32 +02:00
cirrus drm/cirrus: Use drm_framebuffer_put to avoid kernel oops in clean-up 2019-04-20 09:16:00 +02:00
etnaviv drm/etnaviv: add missing failure path to destroy suballoc 2019-07-10 09:53:43 +02:00
exynos drm/exynos: fix missing decrement of retry counter 2019-08-25 10:47:57 +02:00
fsl-dcu
gma500 drm/gma500/cdv: Check vbt config bits when detecting lvds panels 2019-06-11 12:20:54 +02:00
hisilicon drm/hisilicon: hibmc: Do not carry error code in HiBMC framebuffer pointer 2018-11-21 09:19:10 +01:00
i2c Merge branch 'drm-tda9950-fixes' of git://git.armlinux.org.uk/~rmk/linux-arm into drm-fixes 2018-10-04 10:32:14 +10:00
i810
i915 drm/i915/userptr: Try to acquire the page lock around set_page_dirty() 2019-12-01 09:16:12 +01:00
imx drm/imx: only send event on crtc disable if kept disabled 2019-07-10 09:53:44 +02:00
lib
mediatek drm/mediatek: mtk_drm_drv.c: Add of_node_put() before goto 2019-09-19 09:09:39 +02:00
meson drm/meson: Add support for XBGR8888 & ABGR8888 formats 2019-09-19 09:09:36 +02:00
mga
mgag200
msm msm/gpu/a6xx: Force of_dma_configure to setup DMA for GMU 2019-11-24 08:20:06 +01:00
mxsfb
nouveau drm/nouveau/kms/nv50-: Don't create MSTMs for eDP connectors 2019-10-11 18:21:03 +02:00
omapdrm drm/omap: fix max fclk divider for omap36xx 2019-10-11 18:21:01 +02:00
panel drm/panel: check failure cases in the probe func 2019-10-07 18:56:31 +02:00
pl111 drm/pl111: Initialize clock spinlock early 2019-06-15 11:54:00 +02:00
qxl qxl: fix null-pointer crash during suspend 2019-11-20 18:45:56 +01:00
r128
radeon drm/radeon: fix si_enable_smc_cac() failed issue 2019-11-12 19:20:38 +01:00
rcar-du drm: rcar-du: add missing of_node_put 2019-04-05 22:33:10 +02:00
rockchip drm/rockchip: Suspend DP late 2019-08-29 08:28:40 +02:00
savage
scheduler drm/scheduler: fix param documentation 2018-08-09 11:57:39 -05:00
selftests
shmobile
sis
sti
stm drm/stm: attach gem fence to atomic state 2019-10-07 18:56:31 +02:00
sun4i drm/sun4i: Fix sun8i HDMI PHY configuration for > 148.5 MHz 2019-06-09 09:17:23 +02:00
tdfx
tegra drm/tegra: gem: Fix CPU-cache maintenance for BO's allocated using get_pages() 2019-06-09 09:17:22 +02:00
tilcdc drm/tilcdc: Register cpufreq notifier after we have initialized crtc 2019-09-06 10:22:03 +02:00
tinydrm tinydrm/mipi-dbi: Use dma-safe buffers for all SPI transfers 2019-05-31 06:46:32 -07:00
ttm drm/ttm: Restore ttm prefaulting 2019-10-29 09:19:54 +01:00
tve200
udl drm/udl: move to embedding drm device inside udl device. 2019-07-21 09:03:18 +02:00
v3d drm/v3d: Handle errors from IRQ setup. 2019-05-31 06:46:34 -07:00
vc4 drm/vc4: fix fb references in async update 2019-06-15 11:54:11 +02:00
vgem drm/vgem: fix use-after-free when drm_gem_handle_create() fails 2019-04-03 06:26:26 +02:00
via
virtio drm/virtio: Add memory barriers for capset cache. 2019-07-31 07:27:00 +02:00
vkms drm/vkms: Bugfix extra vblank frame 2019-04-05 22:33:12 +02:00
vmwgfx drm/vmwgfx: Fix double free in vmw_recv_msg() 2019-09-16 08:21:40 +02:00
xen
zte
ati_pcigart.c
drm_agpsupport.c
drm_atomic_helper.c drm/atomic_helper: Allow DPMS On<->Off changes for unregistered connectors 2019-09-16 08:22:23 +02:00
drm_atomic.c drm/atomic_helper: Allow DPMS On<->Off changes for unregistered connectors 2019-09-16 08:22:23 +02:00
drm_auth.c drm: set is_master to 0 upon drm_new_set_master() failure 2018-12-08 12:59:07 +01:00
drm_blend.c
drm_bridge.c
drm_bufs.c drm: return -EFAULT if copy_to_user() fails 2019-07-14 08:11:14 +02:00
drm_cache.c
drm_client.c drm/cma-helper: Fix crash in fbdev error path 2018-10-02 13:03:34 +02:00
drm_color_mgmt.c
drm_connector.c
drm_context.c
drm_crtc_helper_internal.h
drm_crtc_helper.c
drm_crtc_internal.h
drm_crtc.c drm/lease: Make sure implicit planes are leased 2019-06-09 09:17:23 +02:00
drm_debugfs_crc.c drm/crc-debugfs: Also sprinkle irqrestore over early exits 2019-07-31 07:26:59 +02:00
drm_debugfs.c drm/atomic: Use drm_drv_uses_atomic_modeset() for debugfs creation 2018-09-17 19:24:37 -04:00
drm_dma.c
drm_dp_aux_dev.c
drm_dp_cec.c
drm_dp_dual_mode_helper.c
drm_dp_helper.c
drm_dp_mst_topology.c drm/dp/mst: Configure no_stop_bit correctly for remote i2c xfers 2019-04-05 22:33:17 +02:00
drm_drv.c drm/drv: Hold ref on parent device during drm_device lifetime 2019-05-31 06:46:34 -07:00
drm_dumb_buffers.c
drm_edid_load.c drm/edid: Fix a missing-check bug in drm_load_edid_firmware() 2019-07-31 07:26:58 +02:00
drm_edid.c drm/edid: Add 6 bpc quirk for SDC panel in Lenovo G50 2019-10-29 09:19:53 +01:00
drm_encoder_slave.c
drm_encoder.c
drm_fb_cma_helper.c drm/cma-helper: Fix crash in fbdev error path 2018-10-02 13:03:34 +02:00
drm_fb_helper.c drm/fb-helper: generic: Don't take module ref for fbcon 2019-07-10 09:53:45 +02:00
drm_file.c drm: Wake up next in drm_read() chain if we are forced to putback the event 2019-05-31 06:46:34 -07:00
drm_flip_work.c
drm_fourcc.c
drm_framebuffer.c drm: silence variable 'conn' set but not used 2019-08-16 10:12:46 +02:00
drm_gem_cma_helper.c
drm_gem_framebuffer_helper.c
drm_gem.c
drm_global.c
drm_hashtab.c
drm_info.c
drm_internal.h drm/lease: Send a distinct uevent 2018-12-13 09:16:21 +01:00
drm_ioc32.c drm: add __user attribute to ptr_to_compat() 2019-09-16 08:22:08 +02:00
drm_ioctl.c drm/ioctl: Fix Spectre v1 vulnerabilities 2018-12-29 13:37:59 +01:00
drm_irq.c
drm_kms_helper_common.c
drm_lease.c drm: Use array_size() when creating lease 2019-02-20 10:25:49 +01:00
drm_legacy.h
drm_lock.c
drm_memory.c
drm_mipi_dsi.c
drm_mm.c
drm_mode_config.c
drm_mode_object.c drm: Reorder set_property_atomic to avoid returning with an active ww_ctx 2019-03-27 14:14:42 +09:00
drm_modes.c drm/modes: Prevent division by zero htotal 2019-02-15 08:10:12 +01:00
drm_modeset_helper.c
drm_modeset_lock.c
drm_of.c
drm_panel_orientation_quirks.c drm: panel-orientation-quirks: Add extra quirk table entry for GPD MicroPC 2019-09-19 09:09:39 +02:00
drm_panel.c Revert "drm/panel: Add device_link from panel device to DRM device" 2018-09-27 11:00:42 -04:00
drm_pci.c
drm_plane_helper.c
drm_plane.c drm/lease: Make sure implicit planes are leased 2019-06-09 09:17:23 +02:00
drm_prime.c
drm_print.c
drm_probe_helper.c drm: Flush output polling on shutdown 2019-10-01 08:26:11 +02:00
drm_property.c
drm_rect.c
drm_scatter.c
drm_scdc_helper.c
drm_simple_kms_helper.c
drm_syncobj.c drm/syncobj: Don't leak fences when WAIT_FOR_SUBMIT is set 2018-09-26 10:39:14 -04:00
drm_sysfs.c drm/lease: Send a distinct uevent 2018-12-13 09:16:21 +01:00
drm_trace_points.c
drm_trace.h
drm_vblank.c drm/vblank: Allow dynamic per-crtc max_vblank_count 2019-09-16 08:22:04 +02:00
drm_vm.c
drm_vma_manager.c
drm_writeback.c
Kconfig drm/fb_helper: Allow leaking fbdev smem_start 2019-01-16 22:04:35 +01:00
Makefile