Re: [PATCH 0/4] Fix forward()/expires() racing with concurrent arming

FUJITA Tomonori <[email protected]>
Newsgroups org.kernel.vger.rust-for-linux
Message-ID <[email protected]>
On Tue, 18 Aug 2026 13:59:30 +0200
Andreas Hindborg <[email protected]> wrote:

> "FUJITA Tomonori" <[email protected]> writes:
> 
>> On Tue, 18 Aug 2026 11:02:27 +0200
>> Andreas Hindborg <[email protected]> wrote:
>>
>>>> perf and CFS bandwidth have a flag as well as a lock. The flag is "do
>>>> not arm while armed", which is the same rule the types enforce
>>>> here. rtc and the softlockup watchdog look like they cancel first and
>>>> then start instead. None of them arms a timer that is active, so I
>>>> would rather the abstraction did not allow it either. Does that seem
>>>> reasonable?
>>>
>>> I am fine with preventing starting a timer that is Started or Running,
>>> but I am not liking the `UniqueArc` requirement.
>>>
>>> I have a use case in `rnull` where I have to start a timer behind an
>>> `Arc` with no way to obtain a `UniqueArc`, so I would prefer if that use
>>> case keeps on working. Without this, I would have to allocate a box and
>>> put it behind a lock, leading to double indirection.
>>
>> Before the UniqueArc requirement, I would like to check which timer
>> you have in mind? The bandwidth timer, the per-command timer, or
>> something else? The two seem to need different things, so I would
>> rather not guess.
> 
> The bandwidth timer. It is started from an `Arc<NullBlkDevice>:
> HasHrTimer`. If we make the suggested change to `ArcTimerHandle`, I
> think I would need to change the `NullBlkDevice::bandwidth_timer` from
> an embedded `HrTimer` to a `SpinLock<Box<HrTimer>>` or something like
> that.
> 
> Maybe this is fine. I don't think it will affect performance for `rnull`
> - this is already a throttled path. But it gives slightly more
> convoluted code in the caller by reducing the way we can use the API.

I think we can allow creating HrTimerArc<T> from Arc<T>, so that UniqueArc is
not required. ListArc does the same with AtomicTracker, an atomic bool in the
object that records whether a ListArc exists:

    HrTimerArc::try_from_arc(Arc<T>) -> Result<HrTimerArc<T>, Arc<T>>

It fails when there is already another HrTimerArc for the object.

> For the completion timer, the change you propose would work fine I
> think. I would just start the timer via the unique request reference
> rather than the shared one. This is probably a better way to do it
> anyway.

Agreed.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.