From: Simon Horman <horms@kernel.org>
To: Aaron Ma <aaron.ma@canonical.com>
Cc: Tony Nguyen <anthony.l.nguyen@intel.com>,
Przemek Kitszel <przemyslaw.kitszel@intel.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
Henry Tieman <henry.w.tieman@intel.com>,
"moderated list:INTEL ETHERNET DRIVERS"
<intel-wired-lan@lists.osuosl.org>
Subject: Re: [PATCH 2/2] ice: clear Flow Director entries before reset cleanup
Date: Sat, 5 Sep 2026 17:46:57 +0100 [thread overview]
Message-ID: <20260905164657.GB40544@horms.kernel.org> (raw)
In-Reply-To: <20260903074706.602087-2-aaron.ma@canonical.com>
On Thu, Sep 03, 2026 at 03:47:06PM +0800, Aaron Ma wrote:
> Flow Director profiles retain handles to generic flow entries. Reset calls
> ice_clear_hw_tbls() to free those entries, but leaves the Flow Director
> handles unchanged until replay replaces them.
>
> If rebuild fails before replay completes, later driver removal follows a
> stale handle and dereferences a freed flow entry in ice_flow_rem_entry().
> KASAN reports a wild access to list poison from
> ice_fdir_erase_flow_from_hw().
>
> The failure is reported as:
>
> KASAN: maybe wild-memory-access in range [0xdead000000000108-...]
> RIP: ice_flow_rem_entry+0xaf/0x170 [ice]
> ice_fdir_erase_flow_from_hw+0x1ee/0x420 [ice]
>
> Clear the Flow Director handles before the hardware tables free their
> entries. A successful replay installs new handles, while a failed rebuild
> leaves them invalid for later cleanup.
>
> Fixes: 148beb612031 ("ice: Initialize Flow Director resources")
> Signed-off-by: Aaron Ma <aaron.ma@canonical.com>
> ---
> drivers/net/ethernet/intel/ice/ice.h | 1 +
> .../net/ethernet/intel/ice/ice_ethtool_fdir.c | 21 +++++++++++++++++++
> drivers/net/ethernet/intel/ice/ice_main.c | 2 ++
> 3 files changed, 24 insertions(+)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
> index db3c7015c56c4..4739ff882b9ec 100644
> --- a/drivers/net/ethernet/intel/ice/ice.h
> +++ b/drivers/net/ethernet/intel/ice/ice.h
> @@ -1029,6 +1029,7 @@ ice_get_fdir_fltr_ids(struct ice_hw *hw, struct ethtool_rxnfc *cmd,
> u32 *rule_locs);
> void ice_fdir_rem_adq_chnl(struct ice_hw *hw, u16 vsi_idx);
> void ice_fdir_release_flows(struct ice_hw *hw);
> +void ice_fdir_clear_flow_handles(struct ice_hw *hw);
> void ice_fdir_replay_flows(struct ice_hw *hw);
> void ice_fdir_replay_fltrs(struct ice_pf *pf);
> int ice_fdir_create_dflt_rules(struct ice_pf *pf);
> diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c b/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c
> index aceec184e89b2..faa16b5a12c0d 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c
> @@ -428,6 +428,27 @@ void ice_fdir_release_flows(struct ice_hw *hw)
> ice_fdir_erase_flow_from_hw(hw, ICE_BLK_FD, flow);
> }
>
> +/**
> + * ice_fdir_clear_flow_handles - clear handles freed during reset
> + * @hw: pointer to HW instance
> + */
> +void ice_fdir_clear_flow_handles(struct ice_hw *hw)
> +{
> + int flow;
> +
> + for (flow = 0; flow < ICE_FLTR_PTYPE_MAX; flow++) {
> + struct ice_fd_hw_prof *prof = hw->fdir_prof[flow];
> + int tun, i;
> +
> + if (!prof)
> + continue;
> +
> + for (tun = 0; tun < ICE_FD_HW_SEG_MAX; tun++)
> + for (i = 0; i < prof->cnt; i++)
> + prof->entry_h[i][tun] = 0;
> + }
> +}
> +
> /**
> * ice_fdir_replay_flows - replay HW Flow Director filter info
> * @hw: pointer to HW instance
> diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
> index a97a1941cec6a..7aa1235447310 100644
> --- a/drivers/net/ethernet/intel/ice/ice_main.c
> +++ b/drivers/net/ethernet/intel/ice/ice_main.c
> @@ -601,6 +601,8 @@ ice_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
> netif_device_detach(vsi->netdev);
> skip:
>
> + if (hw->fdir_prof)
> + ice_fdir_clear_flow_handles(hw);
> /* clear SW filtering DB */
> ice_clear_hw_tbls(hw);
> /* disable the VSIs and their queues that are not already DOWN */
Hi Aaron,
There is an AI-generated review of this patch available at
https://sashiko.dev/#/patchset/20260903074706.602087-1-aaron.ma%40canonical.com?part=2
Of that review, the following seems relevant.
And I'd appreciate it if you could comment on it.
Does calling ice_fdir_clear_flow_handles() here modify prof->entry_h
locklessly from the reset task?
If an ethtool command to add or remove a Flow Director rule executes
concurrently with a PF reset, ice_add_fdir_ethtool() checks the reset flag
locklessly and then acquires hw->fdir_fltr_lock. Can this result in a data
race if the reset worker clears the array without holding the lock while the
ethtool thread updates it?
next prev parent reply other threads:[~2026-09-05 16:47 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 7:47 [PATCH 1/2] ice: restore DDP state during PFR recovery Aaron Ma
2026-09-03 7:47 ` [PATCH 2/2] ice: clear Flow Director entries before reset cleanup Aaron Ma
2026-09-04 15:08 ` Przemek Kitszel
2026-09-05 16:46 ` Simon Horman [this message]
2026-09-04 15:08 ` [PATCH 1/2] ice: restore DDP state during PFR recovery Przemek Kitszel
2026-09-05 16:43 ` Simon Horman
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=20260905164657.GB40544@horms.kernel.org \
--to=horms@kernel.org \
--cc=aaron.ma@canonical.com \
--cc=andrew+netdev@lunn.ch \
--cc=anthony.l.nguyen@intel.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=henry.w.tieman@intel.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=przemyslaw.kitszel@intel.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.