Netdev List
 help / color / mirror / Atom feed
From: Jacob Keller <jacob.e.keller@intel.com>
To: Intel Wired LAN <intel-wired-lan@lists.osuosl.org>
Cc: <netdev@vger.kernel.org>,
	Maciej Machnikowski <maciej.machnikowski@intel.com>,
	Anthony Nguyen <anthony.l.nguyen@intel.com>,
	Przemyslaw Korba <przemyslaw.korba@intel.com>,
	Grzegorz Nitka <grzegorz.nitka@intel.com>,
	Petr Oros <poros@redhat.com>, <alexander.nowlin@intel.com>,
	<kevin.bross@intel.com>, <ranjit.cavatur@intel.com>
Subject: Re: [PATCH iwl-net 01/12] ice: use reference counting and RCU for PTP port access
Date: Mon, 24 Aug 2026 16:36:47 -0700	[thread overview]
Message-ID: <659ce543-a6b1-41ac-b0b2-4640af341bc3@intel.com> (raw)
In-Reply-To: <20260821-jk-e825c-minimized-fixes-v1-1-9d0731eb4858@intel.com>

On 8/21/2026 5:13 PM, Jacob Keller wrote:
> diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
> index c4b0da7ce20e..da2003ba3bb0 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ptp.h
> +++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
> @@ -673,20 +675,33 @@ static void ice_ptp_process_tx_tstamp(struct ice_ptp_tx *tx)
>  	pf->ptp.tx_hwtstamp_good += tstamp_good;
>  }
>  
> +static void ice_ptp_release_port_rcu(struct kref *ref)
> +{
> +	wake_up_var(ref);
> +}
> +
>  static void ice_ptp_tx_tstamp_owner(struct ice_pf *pf)
>  {
>  	struct ice_ptp_port *port;
>  
> -	mutex_lock(&pf->adapter->ports.lock);
> -	list_for_each_entry(port, &pf->adapter->ports.ports, list_node) {
> +	rcu_read_lock();
> +	list_for_each_entry_rcu(port, &pf->adapter->ports.list, list_node) {
>  		struct ice_ptp_tx *tx = &port->tx;
>  
> -		if (!tx || !tx->init)
> +		if (!tx->init)
>  			continue;
>  
> +		if (!kref_get_unless_zero(&port->ref))
> +			continue;
> +
> +		rcu_read_unlock();
> +
>  		ice_ptp_process_tx_tstamp(tx);
> +
> +		kref_put(&port->ref, ice_ptp_release_port_rcu);
> +		rcu_read_lock();
>  	}
> -	mutex_unlock(&pf->adapter->ports.lock);
> +	rcu_read_unlock();
>  }
>  

Sashiko says:

> Can this sequence lead to a use-after-free when advancing the iterator?
> The list_for_each_entry_rcu() macro evaluates port->list_node.next at the end
> of each iteration to find the next element.
> If kref_put() drops the last reference here, it wakes up the teardown thread
> in ice_ptp_cleanup_pf().
> Since the iterator thread previously dropped the RCU read lock via
> rcu_read_unlock(), could the following race happen?
> Iterator thread:
>     kref_put(&port->ref, ice_ptp_release_port_rcu);
>     // Last ref dropped, wakes up ice_ptp_cleanup_pf()
> Teardown thread (ice_ptp_cleanup_pf):
>     wakes up from wait_var_event_timeout()
>     synchronize_rcu(); // Completes without waiting for iterator thread
>     // Port memory is freed
> Iterator thread:
>     rcu_read_lock();
>     // list_for_each_entry_rcu evaluates port->list_node.next on freed port
> Is it necessary to use a safe iterator or pre-fetch the next pointer before
> dropping the reference, to prevent reading from the freed port?
> This same traversal pattern dropping the lock and reference appears to also
> be present in ice_ptp_flush_all_tx_tracker(), ice_ptp_restart_all_phy(),
> and ice_ptp_prepare_rebuild_sec().

I am not sure there is a problem here. I need to investigate carefully.

I think there is a problem here because the original logic was built
around xarray iterators which may not work exactly the same as the list
iterator. We currently remove the item from the list before releasing
the final reference.

I believe that worked for the xarray but doesn't work for this list
based approach. I think the best solution here is to follow the guidance
from Documentation/core-api/kref.rst under the kref + RCU section.

I will fix this in a v2, along with any other issues pointed out by sashiko

  parent reply	other threads:[~2026-08-24 23:36 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-22  0:13 [PATCH iwl-net 00/12] ice: E82x: timestamp processing logic fixes Jacob Keller
2026-08-22  0:13 ` [PATCH iwl-net 01/12] ice: use reference counting and RCU for PTP port access Jacob Keller
2026-08-22  4:11   ` Nowlin, Alexander
2026-08-24 23:36   ` Jacob Keller [this message]
2026-08-22  0:13 ` [PATCH iwl-net 02/12] ice: E822: keep Tx timestamps disabled during offset calibration Jacob Keller
2026-08-22  4:13   ` Nowlin, Alexander
2026-08-24 23:39   ` Jacob Keller
2026-08-22  0:13 ` [PATCH iwl-net 03/12] ice: E822: cancel offset verification work during reset preparation Jacob Keller
2026-08-22  4:14   ` Nowlin, Alexander
2026-08-22  0:13 ` [PATCH iwl-net 04/12] ice: call PTP link change only from link events Jacob Keller
2026-08-22  4:15   ` Nowlin, Alexander
2026-08-24 23:48   ` Jacob Keller
2026-08-22  0:13 ` [PATCH iwl-net 05/12] ice: E825: stop clearing PHY_REG_TX_OFFSET_READY Jacob Keller
2026-08-22  4:16   ` Nowlin, Alexander
2026-08-22  0:13 ` [PATCH iwl-net 06/12] ice: E825: clear PHY_REG_TX_MEMORY_STATUS prior to soft reset Jacob Keller
2026-08-22  4:16   ` Nowlin, Alexander
2026-08-24  9:29   ` Loktionov, Aleksandr
2026-08-24 23:51   ` Jacob Keller
2026-08-22  0:13 ` [PATCH iwl-net 07/12] ice: E825: perform a soft reset when starting the PHY timer Jacob Keller
2026-08-22  4:17   ` Nowlin, Alexander
2026-08-24 23:54   ` Jacob Keller
2026-08-22  0:13 ` [PATCH iwl-net 08/12] ice: wait for in-flight Tx timestamps before flushing the tracker Jacob Keller
2026-08-22  4:17   ` Nowlin, Alexander
2026-08-25  0:09   ` Jacob Keller
2026-08-22  0:13 ` [PATCH iwl-net 09/12] ice: keep Tx timestamp slots tracked until completion or timeout Jacob Keller
2026-08-22  4:18   ` Nowlin, Alexander
2026-08-25  0:11   ` Jacob Keller
     [not found] ` <20260821-jk-e825c-minimized-fixes-v1-10-9d0731eb4858@intel.com>
2026-08-22  4:19   ` [PATCH iwl-net 10/12] ice: remove unnecessary discarding of timestamps after clock adjust Nowlin, Alexander
2026-08-25  0:17   ` Jacob Keller
     [not found] ` <20260821-jk-e825c-minimized-fixes-v1-11-9d0731eb4858@intel.com>
2026-08-22  4:19   ` [PATCH iwl-net 11/12] ice: skip reading Tx ready bitmap on ports with no timestamps Nowlin, Alexander
2026-08-25  0:24   ` Jacob Keller
     [not found] ` <20260821-jk-e825c-minimized-fixes-v1-12-9d0731eb4858@intel.com>
2026-08-22  4:20   ` [PATCH iwl-net 12/12] ice: don't clear in_use until HW clears ready bitmap Nowlin, Alexander
2026-08-24 10:09   ` Loktionov, Aleksandr
2026-08-25  0:36   ` Jacob Keller

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=659ce543-a6b1-41ac-b0b2-4640af341bc3@intel.com \
    --to=jacob.e.keller@intel.com \
    --cc=alexander.nowlin@intel.com \
    --cc=anthony.l.nguyen@intel.com \
    --cc=grzegorz.nitka@intel.com \
    --cc=intel-wired-lan@lists.osuosl.org \
    --cc=kevin.bross@intel.com \
    --cc=maciej.machnikowski@intel.com \
    --cc=netdev@vger.kernel.org \
    --cc=poros@redhat.com \
    --cc=przemyslaw.korba@intel.com \
    --cc=ranjit.cavatur@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox