* [BUG] exynos5_i2c_xfer_atomic() can sleep.
@ 2026-05-06 6:51 ` Sebastian Andrzej Siewior
2026-05-08 9:45 ` Marek Szyprowski
0 siblings, 1 reply; 7+ messages in thread
From: Sebastian Andrzej Siewior @ 2026-05-06 6:51 UTC (permalink / raw)
To: linux-i2c, linux-samsung-soc
Cc: Waiman Long, linux-rt-devel, Andi Shyti, Krzysztof Kozlowski,
Alim Akhtar
Hi,
While looking into the xfer_atomic i2c thingy, I've been looking at the
exynos5_i2c_xfer_atomic() function and noticed that it has a
disable_irq() invocation. Given that i2c_algorithm::xfer_atomic is
called from atomic context (with either preemption or interrupts
disabled) the might_sleep() in disable_irq() must lead to splat here.
This looks very light tested because exynos5_i2c_poll_irqs_timeout()
which should be invoked from atomic context has usleep_range(). This
will schedule from atomic context is not good. I *think* this gets back
with enabled interrupts.
Sebastian
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [BUG] exynos5_i2c_xfer_atomic() can sleep.
2026-05-06 6:51 ` [BUG] exynos5_i2c_xfer_atomic() can sleep Sebastian Andrzej Siewior
@ 2026-05-08 9:45 ` Marek Szyprowski
2026-05-08 10:09 ` Sebastian Andrzej Siewior
0 siblings, 1 reply; 7+ messages in thread
From: Marek Szyprowski @ 2026-05-08 9:45 UTC (permalink / raw)
To: Sebastian Andrzej Siewior, linux-i2c, linux-samsung-soc
Cc: Waiman Long, linux-rt-devel, Andi Shyti, Krzysztof Kozlowski,
Alim Akhtar
On 06.05.2026 08:51, Sebastian Andrzej Siewior wrote:
> While looking into the xfer_atomic i2c thingy, I've been looking at the
> exynos5_i2c_xfer_atomic() function and noticed that it has a
> disable_irq() invocation. Given that i2c_algorithm::xfer_atomic is
> called from atomic context (with either preemption or interrupts
> disabled) the might_sleep() in disable_irq() must lead to splat here.
Its me, who added that code, commit 445094c8a9fb1. I've tested that in the reboot/shutdown path and I'm quite sure that I've copied that irq_disable/enable from some other driver. I also cannot locate that might_sleep() in disable_irq(), where exactly it is?
> This looks very light tested because exynos5_i2c_poll_irqs_timeout()
> which should be invoked from atomic context has usleep_range(). This
> will schedule from atomic context is not good. I *think* this gets back
> with enabled interrupts.
Indeed this should be replaced with udelay.
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [BUG] exynos5_i2c_xfer_atomic() can sleep.
2026-05-08 9:45 ` Marek Szyprowski
@ 2026-05-08 10:09 ` Sebastian Andrzej Siewior
2026-05-08 10:35 ` Marek Szyprowski
0 siblings, 1 reply; 7+ messages in thread
From: Sebastian Andrzej Siewior @ 2026-05-08 10:09 UTC (permalink / raw)
To: Marek Szyprowski
Cc: linux-i2c, linux-samsung-soc, Waiman Long, linux-rt-devel,
Andi Shyti, Krzysztof Kozlowski, Alim Akhtar
On 2026-05-08 11:45:15 [+0200], Marek Szyprowski wrote:
> On 06.05.2026 08:51, Sebastian Andrzej Siewior wrote:
> > While looking into the xfer_atomic i2c thingy, I've been looking at the
> > exynos5_i2c_xfer_atomic() function and noticed that it has a
> > disable_irq() invocation. Given that i2c_algorithm::xfer_atomic is
> > called from atomic context (with either preemption or interrupts
> > disabled) the might_sleep() in disable_irq() must lead to splat here.
>
> Its me, who added that code, commit 445094c8a9fb1. I've tested that in
> the reboot/shutdown path and I'm quite sure that I've copied that
> irq_disable/enable from some other driver. I also cannot locate that
> might_sleep() in disable_irq(), where exactly it is?
kernel/irq/manage.c:
| void disable_irq(unsigned int irq)
| {
| might_sleep();
| if (!__disable_irq_nosync(irq))
^^
| synchronize_irq(irq);
| }
| EXPORT_SYMBOL(disable_irq);
Sebastian
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [BUG] exynos5_i2c_xfer_atomic() can sleep.
2026-05-08 10:09 ` Sebastian Andrzej Siewior
@ 2026-05-08 10:35 ` Marek Szyprowski
2026-05-08 10:42 ` Sebastian Andrzej Siewior
0 siblings, 1 reply; 7+ messages in thread
From: Marek Szyprowski @ 2026-05-08 10:35 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: linux-i2c, linux-samsung-soc, Waiman Long, linux-rt-devel,
Andi Shyti, Krzysztof Kozlowski, Alim Akhtar
On 08.05.2026 12:09, Sebastian Andrzej Siewior wrote:
> On 2026-05-08 11:45:15 [+0200], Marek Szyprowski wrote:
>> On 06.05.2026 08:51, Sebastian Andrzej Siewior wrote:
>>> While looking into the xfer_atomic i2c thingy, I've been looking at the
>>> exynos5_i2c_xfer_atomic() function and noticed that it has a
>>> disable_irq() invocation. Given that i2c_algorithm::xfer_atomic is
>>> called from atomic context (with either preemption or interrupts
>>> disabled) the might_sleep() in disable_irq() must lead to splat here.
>> Its me, who added that code, commit 445094c8a9fb1. I've tested that in
>> the reboot/shutdown path and I'm quite sure that I've copied that
>> irq_disable/enable from some other driver. I also cannot locate that
>> might_sleep() in disable_irq(), where exactly it is?
> kernel/irq/manage.c:
> | void disable_irq(unsigned int irq)
> | {
> | might_sleep();
> | if (!__disable_irq_nosync(irq))
> ^^
> | synchronize_irq(irq);
> | }
> | EXPORT_SYMBOL(disable_irq);
Ah, it looks that I've checked irq_disable() code, so that's why I didn't find might_sleep() call. In the case of exynos5_i2c driver, probably switching to disable_irq_nosync() will be enough. I assume that all previous transfers have to be finished to start this atomic one, so waiting for interrupts to finish is not needed.
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [BUG] exynos5_i2c_xfer_atomic() can sleep.
2026-05-08 10:35 ` Marek Szyprowski
@ 2026-05-08 10:42 ` Sebastian Andrzej Siewior
2026-05-08 15:28 ` Marek Szyprowski
0 siblings, 1 reply; 7+ messages in thread
From: Sebastian Andrzej Siewior @ 2026-05-08 10:42 UTC (permalink / raw)
To: Marek Szyprowski
Cc: linux-i2c, linux-samsung-soc, Waiman Long, linux-rt-devel,
Andi Shyti, Krzysztof Kozlowski, Alim Akhtar
On 2026-05-08 12:35:51 [+0200], Marek Szyprowski wrote:
> Ah, it looks that I've checked irq_disable() code, so that's why I
> didn't find might_sleep() call. In the case of exynos5_i2c driver,
> probably switching to disable_irq_nosync() will be enough. I assume
> that all previous transfers have to be finished to start this atomic
> one, so waiting for interrupts to finish is not needed.
This looks kind of odd. Are the "other" transfers really done at this
point? Do you have a backtrace for me from the atomic path?
Is this needed because you need to send the "power off" command via i2c?
Could you try to test with PREEMPT_RT? I'm sure how this works there.
> Best regards
Sebastian
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [BUG] exynos5_i2c_xfer_atomic() can sleep.
2026-05-08 10:42 ` Sebastian Andrzej Siewior
@ 2026-05-08 15:28 ` Marek Szyprowski
2026-05-08 15:52 ` Sebastian Andrzej Siewior
0 siblings, 1 reply; 7+ messages in thread
From: Marek Szyprowski @ 2026-05-08 15:28 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: linux-i2c, linux-samsung-soc, Waiman Long, linux-rt-devel,
Andi Shyti, Krzysztof Kozlowski, Alim Akhtar
On 08.05.2026 12:42, Sebastian Andrzej Siewior wrote:
> On 2026-05-08 12:35:51 [+0200], Marek Szyprowski wrote:
>> Ah, it looks that I've checked irq_disable() code, so that's why I
>> didn't find might_sleep() call. In the case of exynos5_i2c driver,
>> probably switching to disable_irq_nosync() will be enough. I assume
>> that all previous transfers have to be finished to start this atomic
>> one, so waiting for interrupts to finish is not needed.
> This looks kind of odd. Are the "other" transfers really done at this
> point? Do you have a backtrace for me from the atomic path?
I thought that i2c core somehow serializes the transfers for the given master.
> Is this needed because you need to send the "power off" command via i2c?
Yes, most embedded boards do power off by sending i2c command to PMIC chip.
> Could you try to test with PREEMPT_RT? I'm sure how this works there.
I will check this, but so far I run all my tests without PREEMPT_RT
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [BUG] exynos5_i2c_xfer_atomic() can sleep.
2026-05-08 15:28 ` Marek Szyprowski
@ 2026-05-08 15:52 ` Sebastian Andrzej Siewior
0 siblings, 0 replies; 7+ messages in thread
From: Sebastian Andrzej Siewior @ 2026-05-08 15:52 UTC (permalink / raw)
To: Marek Szyprowski
Cc: linux-i2c, linux-samsung-soc, Waiman Long, linux-rt-devel,
Andi Shyti, Krzysztof Kozlowski, Alim Akhtar
On 2026-05-08 17:28:10 [+0200], Marek Szyprowski wrote:
> On 08.05.2026 12:42, Sebastian Andrzej Siewior wrote:
> > On 2026-05-08 12:35:51 [+0200], Marek Szyprowski wrote:
> >> Ah, it looks that I've checked irq_disable() code, so that's why I
> >> didn't find might_sleep() call. In the case of exynos5_i2c driver,
> >> probably switching to disable_irq_nosync() will be enough. I assume
> >> that all previous transfers have to be finished to start this atomic
> >> one, so waiting for interrupts to finish is not needed.
> > This looks kind of odd. Are the "other" transfers really done at this
> > point? Do you have a backtrace for me from the atomic path?
>
> I thought that i2c core somehow serializes the transfers for the given master.
>
> > Is this needed because you need to send the "power off" command via i2c?
>
> Yes, most embedded boards do power off by sending i2c command to PMIC chip.
I'm wondering if you could "avoid" the interrupts-off part since
kernel_power_off() is called from preemtible context.
>
> > Could you try to test with PREEMPT_RT? I'm sure how this works there.
>
> I will check this, but so far I run all my tests without PREEMPT_RT
Right. I am curious if interrupts are really disabled on PREEMPT_RT or
if this happens as a side-effect of something that does not happen with
PREEMPT_RT enabled.
> Best regards
Sebastian
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-05-08 15:52 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20260506065541eucas1p2f986355d0a06ac1f72aa00e8d3148ad0@eucas1p2.samsung.com>
2026-05-06 6:51 ` [BUG] exynos5_i2c_xfer_atomic() can sleep Sebastian Andrzej Siewior
2026-05-08 9:45 ` Marek Szyprowski
2026-05-08 10:09 ` Sebastian Andrzej Siewior
2026-05-08 10:35 ` Marek Szyprowski
2026-05-08 10:42 ` Sebastian Andrzej Siewior
2026-05-08 15:28 ` Marek Szyprowski
2026-05-08 15:52 ` Sebastian Andrzej Siewior
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox