From: Nam Cao <namcao@linutronix.de>
To: sh_def@163.com, andy@kernel.org, gregkh@linuxfoundation.org
Cc: dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org,
linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org,
sh_def@163.com, thomas.petazzoni@free-electrons.com,
notro@tronnes.org
Subject: Re: [PATCH] staging: fbtft: make dirty_lock IRQ-safe
Date: Fri, 07 Aug 2026 14:53:26 +0200 [thread overview]
Message-ID: <87pkzu852x.fsf@yellow.woof> (raw)
In-Reply-To: <20260804173712.176017-1-sh_def@163.com>
sh_def@163.com writes:
> diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c
> index ca0c38221c16..193643d0329d 100644
> --- a/drivers/staging/fbtft/fbtft-core.c
> +++ b/drivers/staging/fbtft/fbtft-core.c
> @@ -298,14 +298,20 @@ static void fbtft_mkdirty(struct fb_info *info, int y, int height)
> {
> struct fbtft_par *par = info->par;
> struct fb_deferred_io *fbdefio = info->fbdefio;
> + unsigned long flags;
>
> /* Mark display lines/area as dirty */
> - spin_lock(&par->dirty_lock);
> + /*
> + * fbcon takes dirty_lock while holding console_owner. Disable local
> + * interrupts here so a printk hardirq cannot acquire console_owner
> + * while dirty_lock is held and create the inverse lock ordering.
> + */
Beside that reason, we also need spin_lock_irqsave() because
fbtft_mkdirty() can be called in both task context and hardirq
context. And this reason alone suffices and usually is why
spin_lock_irqsave() is used, so I think a comment is not necessary.
But I am fine with it either way.
> + spin_lock_irqsave(&par->dirty_lock, flags);
> if (y < par->dirty_lines_start)
> par->dirty_lines_start = y;
> if (y + height - 1 > par->dirty_lines_end)
> par->dirty_lines_end = y + height - 1;
> - spin_unlock(&par->dirty_lock);
> + spin_unlock_irqrestore(&par->dirty_lock, flags);
>
> /* Schedule deferred_io to update display (no-op if already on queue)*/
> schedule_delayed_work(&info->deferred_work, fbdefio->delay);
> @@ -317,14 +323,15 @@ static void fbtft_deferred_io(struct fb_info *info, struct list_head *pagereflis
> unsigned int dirty_lines_start, dirty_lines_end;
> struct fb_deferred_io_pageref *pageref;
> unsigned int y_low = 0, y_high = 0;
> + unsigned long flags;
>
> - spin_lock(&par->dirty_lock);
> + spin_lock_irqsave(&par->dirty_lock, flags);
> dirty_lines_start = par->dirty_lines_start;
> dirty_lines_end = par->dirty_lines_end;
> /* set display line markers as clean */
> par->dirty_lines_start = par->info->var.yres - 1;
> par->dirty_lines_end = 0;
> - spin_unlock(&par->dirty_lock);
> + spin_unlock_irqrestore(&par->dirty_lock, flags);
fbtft_deferred_io() is executed in workqueue with interrupt enabled. So
it can use spin_lock_irq() instead of spin_lock_irqsave(), right?
Nam
next prev parent reply other threads:[~2026-08-07 12:53 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-04 17:37 [PATCH] staging: fbtft: make dirty_lock IRQ-safe sh_def
2026-08-07 12:53 ` Nam Cao [this message]
2026-08-07 13:08 ` Dan Carpenter
2026-08-07 14:37 ` Hui Su
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=87pkzu852x.fsf@yellow.woof \
--to=namcao@linutronix.de \
--cc=andy@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-fbdev@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-staging@lists.linux.dev \
--cc=notro@tronnes.org \
--cc=sh_def@163.com \
--cc=thomas.petazzoni@free-electrons.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.