All of lore.kernel.org
 help / color / mirror / Atom feed
From: Saeed Mahameed <saeed@kernel.org>
To: Tony Nguyen <anthony.l.nguyen@intel.com>
Cc: davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com,
	edumazet@google.com, Jacob Keller <jacob.e.keller@intel.com>,
	netdev@vger.kernel.org, richardcochran@gmail.com,
	leon@kernel.org, Gurucharan G <gurucharanx.g@intel.com>
Subject: Re: [PATCH net-next v2 09/15] ice: protect init and calibrating check in ice_ptp_request_ts
Date: Wed, 7 Dec 2022 15:36:33 -0800	[thread overview]
Message-ID: <Y5Ejgb2P2f/PX0ym@x130> (raw)
In-Reply-To: <20221207210937.1099650-10-anthony.l.nguyen@intel.com>

On 07 Dec 13:09, Tony Nguyen wrote:
>From: Jacob Keller <jacob.e.keller@intel.com>
>
>When requesting a new timestamp, the ice_ptp_request_ts function does not
>hold the Tx tracker lock while checking init and calibrating. This means
>that we might issue a new timestamp request just after the Tx timestamp
>tracker starts being deinitialized. This could lead to incorrect access of
>the timestamp structures. Correct this by moving the init and calibrating
>checks under the lock, and updating the flows which modify these fields to
>use the lock.
>
>Note that we do not need to hold the lock while checking for tx->init in
>ice_ptp_tstamp_tx. This is because the teardown function will use
>synchronize_irq after clearing the flag to ensure that the threaded

FYI: couldn't find any ice_ptp_tstamp_tx(), and if it's running in xmit
path sofritrq then sync_irq won't help you.

>interrupt completes. Either a) the tx->init flag will be cleared before the
>ice_ptp_tx_tstamp function starts, thus it will exit immediately, or b) the
>threaded interrupt will be executing and the synchronize_irq will wait
>until the threaded interrupt has completed at which point we know the init
>field has definitely been set and new interrupts will not execute the Tx
>timestamp thread function.
>
>Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
>Tested-by: Gurucharan G <gurucharanx.g@intel.com> (A Contingent worker at Intel)
>Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
>---
> drivers/net/ethernet/intel/ice/ice_ptp.c | 36 ++++++++++++++++++++----
> drivers/net/ethernet/intel/ice/ice_ptp.h |  2 +-
> 2 files changed, 32 insertions(+), 6 deletions(-)
>
>diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c
>index 0282ccc55819..481492d84e0e 100644
>--- a/drivers/net/ethernet/intel/ice/ice_ptp.c
>+++ b/drivers/net/ethernet/intel/ice/ice_ptp.c
>@@ -599,6 +599,23 @@ static u64 ice_ptp_extend_40b_ts(struct ice_pf *pf, u64 in_tstamp)
> 				     (in_tstamp >> 8) & mask);
> }
>
>+/**
>+ * ice_ptp_is_tx_tracker_up - Check if Tx tracker is ready for new timestamps
>+ * @tx: the PTP Tx timestamp tracker to check
>+ *
>+ * Check that a given PTP Tx timestamp tracker is up, i.e. that it is ready
>+ * to accept new timestamp requests.
>+ *
>+ * Assumes the tx->lock spinlock is already held.
>+ */
>+static bool
>+ice_ptp_is_tx_tracker_up(struct ice_ptp_tx *tx)
>+{
>+	lockdep_assert_held(&tx->lock);
>+
>+	return tx->init && !tx->calibrating;
>+}
>+
> /**
>  * ice_ptp_tx_tstamp - Process Tx timestamps for a port
>  * @tx: the PTP Tx timestamp tracker
>@@ -788,10 +805,10 @@ ice_ptp_alloc_tx_tracker(struct ice_ptp_tx *tx)
> 		return -ENOMEM;
> 	}
>
>-	spin_lock_init(&tx->lock);
>-
> 	tx->init = 1;
>
>+	spin_lock_init(&tx->lock);
>+

this change is pointless. 

> 	return 0;
> }
>
>@@ -833,7 +850,9 @@ ice_ptp_flush_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx)
> static void
> ice_ptp_release_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx)
> {
>+	spin_lock(&tx->lock);
> 	tx->init = 0;
>+	spin_unlock(&tx->lock);
>
> 	/* wait for potentially outstanding interrupt to complete */
> 	synchronize_irq(pf->msix_entries[pf->oicr_idx].vector);
>@@ -1327,7 +1346,9 @@ ice_ptp_port_phy_restart(struct ice_ptp_port *ptp_port)
> 	kthread_cancel_delayed_work_sync(&ptp_port->ov_work);
>
> 	/* temporarily disable Tx timestamps while calibrating PHY offset */
>+	spin_lock(&ptp_port->tx.lock);
> 	ptp_port->tx.calibrating = true;
>+	spin_unlock(&ptp_port->tx.lock);
> 	ptp_port->tx_fifo_busy_cnt = 0;
>
> 	/* Start the PHY timer in Vernier mode */
>@@ -1336,7 +1357,9 @@ ice_ptp_port_phy_restart(struct ice_ptp_port *ptp_port)
> 		goto out_unlock;
>
> 	/* Enable Tx timestamps right away */
>+	spin_lock(&ptp_port->tx.lock);
> 	ptp_port->tx.calibrating = false;
>+	spin_unlock(&ptp_port->tx.lock);
>
> 	kthread_queue_delayed_work(pf->ptp.kworker, &ptp_port->ov_work, 0);
>
>@@ -2330,11 +2353,14 @@ s8 ice_ptp_request_ts(struct ice_ptp_tx *tx, struct sk_buff *skb)
> {
> 	u8 idx;
>
>-	/* Check if this tracker is initialized */
>-	if (!tx->init || tx->calibrating)
>+	spin_lock(&tx->lock);
>+
>+	/* Check that this tracker is accepting new timestamp requests */
>+	if (!ice_ptp_is_tx_tracker_up(tx)) {
>+		spin_unlock(&tx->lock);
> 		return -1;
>+	}
>
>-	spin_lock(&tx->lock);
> 	/* Find and set the first available index */
> 	idx = find_first_zero_bit(tx->in_use, tx->len);
> 	if (idx < tx->len) {
>diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h
>index 5052fc41bed3..0bfafaaab6c7 100644
>--- a/drivers/net/ethernet/intel/ice/ice_ptp.h
>+++ b/drivers/net/ethernet/intel/ice/ice_ptp.h
>@@ -110,7 +110,7 @@ struct ice_tx_tstamp {
>
> /**
>  * struct ice_ptp_tx - Tracking structure for all Tx timestamp requests on a port
>- * @lock: lock to prevent concurrent write to in_use bitmap
>+ * @lock: lock to prevent concurrent access to fields of this struct
>  * @tstamps: array of len to store outstanding requests
>  * @in_use: bitmap of len to indicate which slots are in use
>  * @block: which memory block (quad or port) the timestamps are captured in
>-- 
>2.35.1
>

  reply	other threads:[~2022-12-07 23:36 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-07 21:09 [PATCH net-next v2 00/15][pull request] Intel Wired LAN Driver Updates 2022-12-07 (ice) Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 01/15] ice: Use more generic names for ice_ptp_tx fields Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 02/15] ice: Remove the E822 vernier "bypass" logic Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 03/15] ice: Reset TS memory for all quads Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 04/15] ice: fix misuse of "link err" with "link status" Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 05/15] ice: always call ice_ptp_link_change and make it void Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 06/15] ice: handle discarding old Tx requests in ice_ptp_tx_tstamp Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 07/15] ice: check Tx timestamp memory register for ready timestamps Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 08/15] ice: synchronize the misc IRQ when tearing down Tx tracker Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 09/15] ice: protect init and calibrating check in ice_ptp_request_ts Tony Nguyen
2022-12-07 23:36   ` Saeed Mahameed [this message]
2022-12-08  0:29     ` Jacob Keller
2022-12-08 19:48     ` Jacob Keller
2022-12-08  9:22   ` Leon Romanovsky
2022-12-07 21:09 ` [PATCH net-next v2 10/15] ice: disable Tx timestamps while link is down Tony Nguyen
2022-12-07 23:46   ` Saeed Mahameed
2022-12-08  1:15     ` Jacob Keller
2022-12-08 18:17     ` Jacob Keller
2022-12-07 21:09 ` [PATCH net-next v2 11/15] ice: cleanup allocations in ice_ptp_alloc_tx_tracker Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 12/15] ice: handle flushing stale Tx timestamps in ice_ptp_tx_tstamp Tony Nguyen
2022-12-07 23:56   ` Saeed Mahameed
2022-12-08  1:12     ` Jacob Keller
2022-12-07 21:09 ` [PATCH net-next v2 13/15] ice: only check set bits in ice_ptp_flush_tx_tracker Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 14/15] ice: make Tx and Rx vernier offset calibration independent Tony Nguyen
2022-12-07 21:09 ` [PATCH net-next v2 15/15] ice: reschedule ice_ptp_wait_for_offset_valid during reset Tony Nguyen

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=Y5Ejgb2P2f/PX0ym@x130 \
    --to=saeed@kernel.org \
    --cc=anthony.l.nguyen@intel.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=gurucharanx.g@intel.com \
    --cc=jacob.e.keller@intel.com \
    --cc=kuba@kernel.org \
    --cc=leon@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=richardcochran@gmail.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.