From: Bjorn Helgaas <helgaas@kernel.org>
To: Tony Nguyen <anthony.l.nguyen@intel.com>,
Przemek Kitszel <przemyslaw.kitszel@intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>, Len Brown <lenb@kernel.org>,
"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
Linux kernel mailing list <linux-kernel@vger.kernel.org>,
Linux regressions mailing list <regressions@lists.linux.dev>,
intel-wired-lan@lists.osuosl.org,
"Rafael J. Wysocki" <rafael@kernel.org>,
Petr Valenta <petr@jevklidu.cz>,
Jiri Slaby <jirislaby@kernel.org>
Subject: Re: ACPI IRQ storm with 6.10
Date: Tue, 20 Aug 2024 13:44:24 -0500 [thread overview]
Message-ID: <20240820184424.GA216935@bhelgaas> (raw)
In-Reply-To: <782b7159-076a-4064-8333-69c454972b29@kernel.org>
[+to Tony, Przemek for e1000e questions; -cc Jesse]
On Mon, Aug 19, 2024 at 07:23:42AM +0200, Jiri Slaby wrote:
> On 19. 08. 24, 6:50, Jiri Slaby wrote:
> > CC e1000e guys + Jesse (due to 75a3f93b5383) + Bjorn (due to b2c289415b2b)
>
> Bjorn,
>
> I am confused by these changes:
> ==========================================
> @@ -291,16 +288,13 @@ static int e1000_set_link_ksettings(struct net_device
> *net
> dev,
> * duplex is forced.
> */
> if (cmd->base.eth_tp_mdix_ctrl) {
> - if (hw->phy.media_type != e1000_media_type_copper) {
> - ret_val = -EOPNOTSUPP;
> - goto out;
> - }
> + if (hw->phy.media_type != e1000_media_type_copper)
> + return -EOPNOTSUPP;
>
> if ((cmd->base.eth_tp_mdix_ctrl != ETH_TP_MDI_AUTO) &&
> (cmd->base.autoneg != AUTONEG_ENABLE)) {
> e_err("forcing MDI/MDI-X state is not supported when
> lin
> k speed and/or duplex are forced\n");
> - ret_val = -EINVAL;
> - goto out;
> + return -EINVAL;
> }
> }
>
> @@ -347,7 +341,6 @@ static int e1000_set_link_ksettings(struct net_device
> *netde
> v,
> }
>
> out:
> - pm_runtime_put_sync(netdev->dev.parent);
> clear_bit(__E1000_RESETTING, &adapter->state);
> return ret_val;
> }
> ==========================================
>
> So no more clear_bit(__E1000_RESETTING in the above fail paths. Is that
> intentional?
I don't remember if it was intentional, but the use of
__E1000_RESETTING is a bit subtle and I don't know what is correct.
Here's how it was used before I changed it with b2c289415b2b, i.e., in
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/net/ethernet/intel/e1000e/ethtool.c?id=39f59c72ad3a:
e1000_set_link_ksettings(...)
{
if (hw->phy.ops.check_reset_block(hw)) {
ret_val = -EINVAL;
goto out;
}
while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
usleep_range(1000, 2000);
if (err) {
ret_val = -EINVAL;
goto out;
}
...
out:
clear_bit(__E1000_RESETTING, &adapter->state);
}
In this case, we *always* clear __E1000_RESETTING, even if we bail out
before the test_and_set_bit(__E1000_RESETTING).
It makes sense to me that we clear __E1000_RESETTING after we've set
it via test_and_set_bit() because we know it was set *here*.
But it seems wrong to me that we clear __E1000_RESETTING even when we
haven't done the test_and_set_bit() because it may have been set by a
concurrent thread executing a different operation.
e1000_set_ringparam(...)
{
if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
return -EINVAL;
while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
usleep_range(1000, 2000);
err = e1000e_setup_tx_resources(...);
if (err)
goto out;
...
out:
clear_bit(__E1000_RESETTING, &adapter->state);
}
But here, we *don't* clear __E1000_RESETTING if we bail out before the
test_and_set_bit(__E1000_RESETTING). This seems like the correct
behavior.
In the e1000 driver (not the e1000e driver),
e1000_set_link_ksettings() does *not* clear __E1000_RESETTING unless
it has already done the test_and_set_bit().
b2c289415b2b changed e1000e to work that way, too.
FWIW, 3ef672ab1862 ("e1000e: ethtool unnecessarily takes device out of
RPM suspend") changed e1000e e1000_set_link_ksettings() to clear
__E1000_RESETTING even when bailing out before the test_and_set_bit().
That part of 3ef672ab1862 looks possibly buggy to me.
Bjorn
prev parent reply other threads:[~2024-08-20 18:44 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-14 5:22 ACPI IRQ storm with 6.10 Jiri Slaby
2024-08-14 6:47 ` Jiri Slaby
2024-08-16 18:29 ` Rafael J. Wysocki
2024-08-16 21:36 ` Petr Valenta
2024-08-17 17:57 ` Petr Valenta
2024-08-19 4:50 ` Jiri Slaby
2024-08-19 5:23 ` Jiri Slaby
2024-08-19 16:47 ` Bjorn Helgaas
2024-08-20 18:09 ` Bjorn Helgaas
2024-08-20 21:13 ` Petr Valenta
2024-08-20 21:30 ` Bjorn Helgaas
2024-08-21 5:09 ` Jiri Slaby
2024-08-21 11:39 ` Petr Valenta
2024-08-21 14:59 ` Bjorn Helgaas
[not found] ` <1041b9b5-cc78-13b1-459a-d1d3a313475a@intel.com>
2024-08-22 7:44 ` Petr Valenta
2024-08-22 8:33 ` Petr Valenta
2024-08-22 9:18 ` Vitaly Lifshits
2024-08-22 10:24 ` Petr Valenta
2024-08-20 18:44 ` Bjorn Helgaas [this message]
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=20240820184424.GA216935@bhelgaas \
--to=helgaas@kernel.org \
--cc=anthony.l.nguyen@intel.com \
--cc=bhelgaas@google.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=jirislaby@kernel.org \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=petr@jevklidu.cz \
--cc=przemyslaw.kitszel@intel.com \
--cc=rafael@kernel.org \
--cc=regressions@lists.linux.dev \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox