[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <7907d42e-4805-48bc-aaf6-16cbe46eb1d2@intel.com>
Date: Tue, 3 Feb 2026 11:19:33 +0100
From: Przemek Kitszel <przemyslaw.kitszel@...el.com>
To: Petr Oros <poros@...hat.com>, Jacob Keller <jacob.e.keller@...el.com>,
Jakub Kicinski <kuba@...nel.org>
CC: <ivecera@...hat.com>, <netdev@...r.kernel.org>,
<linux-kernel@...r.kernel.org>, Andrew Lunn <andrew+netdev@...n.ch>, "Eric
Dumazet" <edumazet@...gle.com>, Stanislav Fomichev <sdf@...ichev.me>, "Tony
Nguyen" <anthony.l.nguyen@...el.com>, <intel-wired-lan@...ts.osuosl.org>,
Paolo Abeni <pabeni@...hat.com>, "David S. Miller" <davem@...emloft.net>
Subject: Re: [Intel-wired-lan] [PATCH net] iavf: fix deadlock in reset
handling
On 2/3/26 09:44, Petr Oros wrote:
>
> On 2/3/26 02:00, Jacob Keller wrote:
>>
>>
>> On 2/2/2026 3:58 PM, Jakub Kicinski wrote:
>>> On Mon, 2 Feb 2026 09:48:20 +0100 Petr Oros wrote:
>>>> + netdev_unlock(netdev);
>>>> + ret = wait_event_interruptible_timeout(adapter->reset_waitqueue,
>>>> + !iavf_is_reset_in_progress(adapter),
>>>> + msecs_to_jiffies(5000));
>>>> + netdev_lock(netdev);
>>>
>>> Dropping locks taken by the core around the driver callback
>>> is obviously unacceptable. SMH.
>>
>> Right. It seems like the correct fix is to either a) have reset take
>> and hold the netdev lock (now that its distinct from the global RTNL
>> lock) or b) refactor reset so that it can defer any of the netdev
>> related stuff somehow.
>>
> I modeled this after the existing pattern in iavf_close() (ndo_stop),
> which also temporarily releases the netdev instance lock taken by the
> core to wait for an async operation to complete:
First of all, thank you for working on that, I was hit by the very same
problem (no series yet), but my local fix is the same as of now.
I don't see an easy fix (w/o substantial driver refactor).
>
> static int iavf_close(struct net_device *netdev)
> {
> netdev_assert_locked(netdev);
> ...
> iavf_down(adapter);
> iavf_change_state(adapter, __IAVF_DOWN_PENDING);
> iavf_free_traffic_irqs(adapter);
>
> netdev_unlock(netdev);
>
> status = wait_event_timeout(adapter->down_waitqueue,
> adapter->state == __IAVF_DOWN,
> msecs_to_jiffies(500));
> if (!status)
> netdev_warn(netdev, "Device resources not yet
> released\n");
> netdev_lock(netdev);
> ...
> }
>
> This was introduced by commit 120f28a6f314fe ("iavf: get rid of the crit
> lock"), and ndo_stop is called with netdev instance lock held by the
> core just like ndo_change_mtu is.
technically it was introduced by commmit afc664987ab3 ("eth: iavf:
extend the netdev_lock usage")
> Could you clarify why the unlock-wait-
> lock pattern is acceptable in ndo_stop but not here?
>
perhaps just closing netdev is a special kind of operation
Other thing is that the lock was added to allow further NAPI
development, and one silly driver should not stop that effort.
Sadly, we have not managed to re-design the driver yet. I would like to
do so personally, but have much work accumulated/pending to free my time
Powered by blists - more mailing lists