Re: [PATCH] fbdev: ssd1307fb: defer I2C transfers from damage callbacks
Helge Deller <[email protected]> Tue, 4 Aug 2026 10:47:50 +0200
| Newsgroups | org.kernel.vger.stable,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-fbdev,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 8/3/26 20:39, [email protected] wrote: > From: Hui Su <[email protected]> > > The fbdev damage callbacks may run from fbcon while printk has disabled > preemption. They currently update the display synchronously, which enters > the sleeping I2C transfer path from atomic context. > > A complete report from an RK3566 system follows: > > [ 258.129004] watchdog: watchdog0: watchdog did not stop! > [ 258.129067] BUG: scheduling while atomic: systemd/1/0x00000003 > [ 258.129076] Modules linked in: algif_hash algif_skcipher af_alg bnep > binfmt_misc lz4hc lz4 zram snd_soc_hdmi_codec brcmfmac_wcc hci_uart > fb_ssd1306(C) fbtft(C) btqca btrtl btintel btsdio snd_soc_simple_card > motorcomm pwm_fan snd_soc_simple_card_utils ssd130x_spi nls_iso8859_1 > ssd130x btbcm drm_shmem_helper display_connector brcmfmac ssd1307fb > brcmutil bluetooth cfg80211 rfkill snd_soc_rockchip_i2s_tdm > snd_soc_rk817 hantro_vpu snd_soc_core snd_compress snd_pcm_dmaengine > v4l2_vp9 snd_pcm v4l2_h264 rockchip_rga snd_timer rk_crypto2 > spi_rockchip_sfc videobuf2_dma_contig snd sm3_generic v4l2_mem2mem > videobuf2_dma_sg dwmac_rk sm3 soundcore videobuf2_memops videobuf2_v4l2 > stmmac_platform dw_hdmi_cec videodev videobuf2_common dw_hdmi_i2s_audio > stmmac rk817_charger pcs_xpcs mc cpufreq_dt sch_fq_codel ip_tables > x_tables autofs4 > [ 258.129215] Preemption disabled at: > [ 258.129216] [<ffff80008012f96c>] vprintk_emit+0x11c/0x340 > [ 258.129234] CPU: 0 PID: 1 Comm: systemd Tainted: G C > 6.6.0-rc5-rockchip-rk356x #4 > [ 258.129239] Hardware name: Rockchip RK3566 OPi 3B (DT) > [ 258.129243] Call trace: > [ 258.129245] dump_backtrace+0xa0/0x128 > [ 258.129252] show_stack+0x20/0x38 > [ 258.129256] dump_stack_lvl+0x60/0xb0 > [ 258.129265] dump_stack+0x18/0x28 > [ 258.129269] __schedule_bug+0xa0/0xc8 > [ 258.129274] __schedule+0x9ac/0xd30 > [ 258.129279] schedule+0x60/0x100 > [ 258.129282] schedule_timeout+0x194/0x338 > [ 258.129289] rk3x_i2c_xfer_common.isra.0+0x384/0x498 > [ 258.129296] rk3x_i2c_xfer+0x20/0x60 > [ 258.129300] __i2c_transfer+0x194/0x648 > [ 258.129308] i2c_transfer+0x9c/0x130 > [ 258.129313] i2c_transfer_buffer_flags+0x64/0x98 > [ 258.129318] ssd1307fb_update_rect+0x42c/0x560 [ssd1307fb] > [ 258.129334] ssd1307fb_defio_imageblit+0x34/0x50 [ssd1307fb] > [ 258.129343] soft_cursor+0x13c/0x210 > [ 258.129350] bit_cursor+0x2dc/0x550 > [ 258.129354] fbcon_cursor+0xec/0x108 > [ 258.129359] hide_cursor+0x44/0xc8 > [ 258.129365] vt_console_print+0x398/0x3b0 > [ 258.129370] console_flush_all.isra.0+0x17c/0x410 > [ 258.129377] console_unlock+0x4c/0x100 > [ 258.129382] vprintk_emit+0x1c8/0x340 > [ 258.129386] vprintk_default+0x40/0x58 > [ 258.129389] vprintk+0xb8/0xd0 > [ 258.129392] _printk+0x68/0x98 > [ 258.129398] watchdog_release+0x170/0x230 > [ 258.129404] __fput+0xbc/0x288 > [ 258.129409] __fput_sync+0x58/0x70 > [ 258.129413] __arm64_sys_close+0x40/0x90 > [ 258.129419] invoke_syscall+0x4c/0x118 > [ 258.129426] el0_svc_common.constprop.0+0x48/0xf0 > [ 258.129432] do_el0_svc+0x24/0x38 > [ 258.129437] el0_svc+0x48/0x100 > [ 258.129443] el0t_64_sync_handler+0xc0/0xc8 > [ 258.129448] el0t_64_sync+0x190/0x198 > [ 258.573087] ------------[ cut here ]------------ > [ 258.573098] DEBUG_LOCKS_WARN_ON(val > preempt_count()) > [ 258.573111] WARNING: CPU: 0 PID: 1 at kernel/sched/core.c:5871 > preempt_count_sub+0x9c/0x148 > [ 258.573130] Modules linked in: algif_hash algif_skcipher af_alg bnep > binfmt_misc lz4hc lz4 zram snd_soc_hdmi_codec brcmfmac_wcc hci_uart > fb_ssd1306(C) fbtft(C) btqca btrtl btintel btsdio snd_soc_simple_card > motorcomm pwm_fan snd_soc_simple_card_utils ssd130x_spi nls_iso8859_1 > ssd130x btbcm drm_shmem_helper display_connector brcmfmac ssd1307fb > brcmutil bluetooth cfg80211 rfkill snd_soc_rockchip_i2s_tdm > snd_soc_rk817 hantro_vpu snd_soc_core snd_compress snd_pcm_dmaengine > v4l2_vp9 snd_pcm v4l2_h264 rockchip_rga snd_timer rk_crypto2 > spi_rockchip_sfc videobuf2_dma_contig snd sm3_generic v4l2_mem2mem > videobuf2_dma_sg dwmac_rk sm3 soundcore videobuf2_memops videobuf2_v4l2 > stmmac_platform dw_hdmi_cec videodev videobuf2_common dw_hdmi_i2s_audio > stmmac rk817_charger pcs_xpcs mc cpufreq_dt sch_fq_codel ip_tables > x_tables autofs4 > [ 258.573268] CPU: 0 PID: 1 Comm: systemd Tainted: G WC > 6.6.0-rc5-rockchip-rk356x #4 > [ 258.573274] Hardware name: Rockchip RK3566 OPi 3B (DT) > ** 37 printk messages dropped ** > [ 258.574064] Preemption disabled at: > ** 42 printk messages dropped ** > [ 259.190237] Preemption disabled at: > > Track damage in the driver's private data under a spinlock and merge > multiple updates into a bounding rectangle. Queue the existing > deferred-I/O work immediately for damage reported by fbdev drawing and > write helpers, so allocation and I2C transfers run from process context > without adding the configured mmap refresh delay. Keep full-screen > updates for dirty mmap pages, for which no precise rectangle is available. > > Tested on an RK3566 board with a 128x64 OLED by running five rounds of 250 > KERN_EMERG messages in total while issuing framebuffer writes every 15 ms. > No atomic-sleep, preemption, or lockdep warning occurred. Kprobe tracing > also confirmed that cursor-only damage remained an 8x16 partial update. > > Fixes: a2ed00da5047 ("drivers/video: add support for the Solomon SSD1307 OLED Controller") > Cc: [email protected] > Signed-off-by: Hui Su <[email protected]> > --- > drivers/video/fbdev/ssd1307fb.c | 72 ++++++++++++++++++++++++++++++--- > 1 file changed, 67 insertions(+), 5 deletions(-) applied. Thanks! Helge