From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: "Maíra Canal" <mcanal@igalia.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Sasha Levin" <sashal@kernel.org>,
maarten.lankhorst@linux.intel.com, tzimmermann@suse.de,
airlied@gmail.com, daniel@ffwll.ch,
dri-devel@lists.freedesktop.org
Subject: [PATCH AUTOSEL 6.6 01/75] drm/vc4: don't check if plane->state->fb == state->fb
Date: Fri, 29 Mar 2024 08:41:42 -0400 [thread overview]
Message-ID: <20240329124330.3089520-1-sashal@kernel.org> (raw)
From: Maíra Canal <mcanal@igalia.com>
[ Upstream commit 5ee0d47dcf33efd8950b347dcf4d20bab12a3fa9 ]
Currently, when using non-blocking commits, we can see the following
kernel warning:
[ 110.908514] ------------[ cut here ]------------
[ 110.908529] refcount_t: underflow; use-after-free.
[ 110.908620] WARNING: CPU: 0 PID: 1866 at lib/refcount.c:87 refcount_dec_not_one+0xb8/0xc0
[ 110.908664] Modules linked in: rfcomm snd_seq_dummy snd_hrtimer snd_seq snd_seq_device cmac algif_hash aes_arm64 aes_generic algif_skcipher af_alg bnep hid_logitech_hidpp vc4 brcmfmac hci_uart btbcm brcmutil bluetooth snd_soc_hdmi_codec cfg80211 cec drm_display_helper drm_dma_helper drm_kms_helper snd_soc_core snd_compress snd_pcm_dmaengine fb_sys_fops sysimgblt syscopyarea sysfillrect raspberrypi_hwmon ecdh_generic ecc rfkill libaes i2c_bcm2835 binfmt_misc joydev snd_bcm2835(C) bcm2835_codec(C) bcm2835_isp(C) v4l2_mem2mem videobuf2_dma_contig snd_pcm bcm2835_v4l2(C) raspberrypi_gpiomem bcm2835_mmal_vchiq(C) videobuf2_v4l2 snd_timer videobuf2_vmalloc videobuf2_memops videobuf2_common snd videodev vc_sm_cma(C) mc hid_logitech_dj uio_pdrv_genirq uio i2c_dev drm fuse dm_mod drm_panel_orientation_quirks backlight ip_tables x_tables ipv6
[ 110.909086] CPU: 0 PID: 1866 Comm: kodi.bin Tainted: G C 6.1.66-v8+ #32
[ 110.909104] Hardware name: Raspberry Pi 3 Model B Rev 1.2 (DT)
[ 110.909114] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 110.909132] pc : refcount_dec_not_one+0xb8/0xc0
[ 110.909152] lr : refcount_dec_not_one+0xb4/0xc0
[ 110.909170] sp : ffffffc00913b9c0
[ 110.909177] x29: ffffffc00913b9c0 x28: 000000556969bbb0 x27: 000000556990df60
[ 110.909205] x26: 0000000000000002 x25: 0000000000000004 x24: ffffff8004448480
[ 110.909230] x23: ffffff800570b500 x22: ffffff802e03a7bc x21: ffffffecfca68c78
[ 110.909257] x20: ffffff8002b42000 x19: ffffff802e03a600 x18: 0000000000000000
[ 110.909283] x17: 0000000000000011 x16: ffffffffffffffff x15: 0000000000000004
[ 110.909308] x14: 0000000000000fff x13: ffffffed577e47e0 x12: 0000000000000003
[ 110.909333] x11: 0000000000000000 x10: 0000000000000027 x9 : c912d0d083728c00
[ 110.909359] x8 : c912d0d083728c00 x7 : 65646e75203a745f x6 : 746e756f63666572
[ 110.909384] x5 : ffffffed579f62ee x4 : ffffffed579eb01e x3 : 0000000000000000
[ 110.909409] x2 : 0000000000000000 x1 : ffffffc00913b750 x0 : 0000000000000001
[ 110.909434] Call trace:
[ 110.909441] refcount_dec_not_one+0xb8/0xc0
[ 110.909461] vc4_bo_dec_usecnt+0x4c/0x1b0 [vc4]
[ 110.909903] vc4_cleanup_fb+0x44/0x50 [vc4]
[ 110.910315] drm_atomic_helper_cleanup_planes+0x88/0xa4 [drm_kms_helper]
[ 110.910669] vc4_atomic_commit_tail+0x390/0x9dc [vc4]
[ 110.911079] commit_tail+0xb0/0x164 [drm_kms_helper]
[ 110.911397] drm_atomic_helper_commit+0x1d0/0x1f0 [drm_kms_helper]
[ 110.911716] drm_atomic_commit+0xb0/0xdc [drm]
[ 110.912569] drm_mode_atomic_ioctl+0x348/0x4b8 [drm]
[ 110.913330] drm_ioctl_kernel+0xec/0x15c [drm]
[ 110.914091] drm_ioctl+0x24c/0x3b0 [drm]
[ 110.914850] __arm64_sys_ioctl+0x9c/0xd4
[ 110.914873] invoke_syscall+0x4c/0x114
[ 110.914897] el0_svc_common+0xd0/0x118
[ 110.914917] do_el0_svc+0x38/0xd0
[ 110.914936] el0_svc+0x30/0x8c
[ 110.914958] el0t_64_sync_handler+0x84/0xf0
[ 110.914979] el0t_64_sync+0x18c/0x190
[ 110.914996] ---[ end trace 0000000000000000 ]---
This happens because, although `prepare_fb` and `cleanup_fb` are
perfectly balanced, we cannot guarantee consistency in the check
plane->state->fb == state->fb. This means that sometimes we can increase
the refcount in `prepare_fb` and don't decrease it in `cleanup_fb`. The
opposite can also be true.
In fact, the struct drm_plane .state shouldn't be accessed directly
but instead, the `drm_atomic_get_new_plane_state()` helper function should
be used. So, we could stick to this check, but using
`drm_atomic_get_new_plane_state()`. But actually, this check is not really
needed. We can increase and decrease the refcount symmetrically without
problems.
This is going to make the code more simple and consistent.
Signed-off-by: Maíra Canal <mcanal@igalia.com>
Acked-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240105175908.242000-1-mcanal@igalia.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/gpu/drm/vc4/vc4_plane.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index 00e713faecd5a..5948e34f7f813 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -1505,9 +1505,6 @@ static int vc4_prepare_fb(struct drm_plane *plane,
drm_gem_plane_helper_prepare_fb(plane, state);
- if (plane->state->fb == state->fb)
- return 0;
-
return vc4_bo_inc_usecnt(bo);
}
@@ -1516,7 +1513,7 @@ static void vc4_cleanup_fb(struct drm_plane *plane,
{
struct vc4_bo *bo;
- if (plane->state->fb == state->fb || !state->fb)
+ if (!state->fb)
return;
bo = to_vc4_bo(&drm_fb_dma_get_gem_obj(state->fb, 0)->base);
--
2.43.0
next reply other threads:[~2024-03-29 12:43 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-29 12:41 Sasha Levin [this message]
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 02/75] Input: synaptics-rmi4 - fail probing if memory allocation for "phys" fails Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 03/75] drm: panel-orientation-quirks: Add quirk for GPD Win Mini Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 04/75] ASoC: SOF: amd: Optimize quirk for Valve Galileo Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 05/75] drm/ttm: return ENOSPC from ttm_bo_mem_space v3 Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 06/75] arm64: dts: qcom: sdm630: add USB QMP PHY support Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 07/75] arm64: dts: qcom: sda660-ifc6560: enable USB 3.0 PHY Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 08/75] pinctrl: renesas: checker: Limit cfg reg enum checks to provided IDs Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 09/75] VMCI: Fix memcpy() run-time warning in dg_dispatch_as_host() Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 10/75] sysv: don't call sb_bread() with pointers_lock held Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 11/75] quota: Fix potential NULL pointer dereference Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 12/75] scsi: lpfc: Fix possible memory leak in lpfc_rcv_padisc() Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 13/75] printk: For @suppress_panic_printk check for other CPU in panic Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 14/75] printk: Avoid non-panic CPUs writing to ringbuffer Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 15/75] panic: Flush kernel log buffer at the end Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 16/75] isofs: handle CDs with bad root inode but good Joliet root directory Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 17/75] ASoC: Intel: common: DMI remap for rebranded Intel NUC M15 (LAPRC710) laptops Sasha Levin
2024-03-29 12:41 ` [PATCH AUTOSEL 6.6 18/75] cpuidle: Avoid potential overflow in integer multiplication Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 19/75] ARM: dts: rockchip: fix rk3288 hdmi ports node Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 20/75] ARM: dts: rockchip: fix rk322x " Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 21/75] arm64: dts: rockchip: fix rk3328 " Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 22/75] arm64: dts: rockchip: fix rk3399 " Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 23/75] pmdomain: ti: Add a null pointer check to the omap_prm_domain_init Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 24/75] pmdomain: imx8mp-blk-ctrl: imx8mp_blk: Add fdcc clock to hdmimix domain Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 25/75] arm64: dts: sc8280xp: correct DMIC2 and DMIC3 pin config node names Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 26/75] arm64: dts: sm8450: " Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 27/75] arm64: dts: sm8550: " Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 28/75] rcu/nocb: Fix WARN_ON_ONCE() in the rcu_nocb_bypass_lock() Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 29/75] rcu-tasks: Repair RCU Tasks Trace quiescence check Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 30/75] Julia Lawall reported this null pointer dereference, this should fix it Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 31/75] media: sta2x11: fix irq handler cast Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 32/75] ALSA: firewire-lib: handle quirk to calculate payload quadlets as data block counter Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 33/75] ASoC: Intel: avs: Populate board selection with new I2S entries Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 34/75] firmware: tegra: bpmp: Return directly after a failed kzalloc() in get_filename() Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 35/75] ext4: add a hint for block bitmap corrupt state in mb_groups Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 36/75] ext4: forbid commit inconsistent quota data when errors=remount-ro Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 37/75] ACPI: x86: Move acpi_quirk_skip_serdev_enumeration() out of CONFIG_X86_ANDROID_TABLETS Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 38/75] drm/amd/display: Fix nanosec stat overflow Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 39/75] pstore/zone: Add a null pointer check to the psz_kmsg_read Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 40/75] tools/power x86_energy_perf_policy: Fix file leak in get_pkg_num() Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 41/75] accel/habanalabs: increase HL_MAX_STR to 64 bytes to avoid warnings Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 42/75] i2c: designware: Fix RX FIFO depth define on Wangxun 10Gb NIC Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 43/75] HID: input: avoid polling stylus battery on Chromebook Pompom Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 44/75] drm/amd/amdgpu: Fix potential ioremap() memory leaks in amdgpu_device_init() Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 45/75] dma-direct: Leak pages on dma_set_decrypted() failure Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 46/75] drm: Check output polling initialized before disabling Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 47/75] SUNRPC: increase size of rpc_wait_queue.qlen from unsigned short to unsigned int Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 48/75] PCI: Disable D3cold on Asus B1400 PCI-NVMe bridge Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 49/75] Revert "ACPI: PM: Block ASUS B1400CEAE from suspend to idle by default" Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 50/75] sparc: vdso: Disable UBSAN instrumentation Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 51/75] libperf evlist: Avoid out-of-bounds access Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 52/75] PCI: Mark LSI FW643 to avoid bus reset Sasha Levin
2024-03-29 15:17 ` Bjorn Helgaas
2024-04-07 23:51 ` Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 53/75] cpufreq: Don't unregister cpufreq cooling on CPU hotplug Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 54/75] overflow: Allow non-type arg to type_max() and type_min() Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 55/75] sh: Fix build with CONFIG_UBSAN=y Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 56/75] input/touchscreen: imagis: Correct the maximum touch area value Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 57/75] input/touchscreen: imagis: Add support for Imagis IST3038B Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 58/75] input/touchscreen: imagis: add support for IST3032C Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 59/75] drivers/perf: hisi: Enable HiSilicon Erratum 162700402 quirk for HIP09 Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 60/75] btrfs: preallocate temporary extent buffer for inode logging when needed Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 61/75] btrfs: handle chunk tree lookup error in btrfs_relocate_sys_chunks() Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 62/75] btrfs: export: handle invalid inode or root reference in btrfs_get_parent() Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 63/75] btrfs: send: handle path ref underflow in header iterate_inode_ref() Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 64/75] block: prevent division by zero in blk_rq_stat_sum() Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 65/75] RDMA/cm: add timeout to cm_destroy_id wait Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 66/75] Input: make input_class constant Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 67/75] Input: imagis - use FIELD_GET where applicable Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 68/75] Input: imagis - add touch key support Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 69/75] Input: allocate keycode for Display refresh rate toggle Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 70/75] platform/x86: touchscreen_dmi: Add an extra entry for a variant of the Chuwi Vi8 tablet Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 71/75] perf/x86/amd/lbr: Discard erroneous branch entries Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 72/75] ALSA: hda/realtek: Add quirk for Lenovo Yoga 9 14IMH9 Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 73/75] ktest: force $buildonly = 1 for 'make_warnings_file' test type Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 74/75] Input: xpad - add support for Snakebyte GAMEPADs Sasha Levin
2024-03-29 12:42 ` [PATCH AUTOSEL 6.6 75/75] ring-buffer: use READ_ONCE() to read cpu_buffer->commit_page in concurrent environment Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240329124330.3089520-1-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=airlied@gmail.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mcanal@igalia.com \
--cc=mripard@kernel.org \
--cc=stable@vger.kernel.org \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox