mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
bnxt_en: improve TX timestamping FIFO configuration
Reconfiguration of netdev may trigger close/open procedure which can
break FIFO status by adjusting the amount of empty slots for TX
timestamps. But it is not really needed because timestamps for the
packets sent over the wire still can be retrieved. On the other side,
during netdev close procedure any skbs waiting for TX timestamps can be
leaked because there is no cleaning procedure called. Free skbs waiting
for TX timestamps when closing netdev.
Fixes: 8aa2a79e9b
("bnxt_en: Increase the max total outstanding PTP TX packets to 4")
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Vadim Fedorenko <vadfed@meta.com>
Link: https://patch.msgid.link/20250424125547.460632-1-vadfed@meta.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
8548c84c00
commit
8f7ae5a851
3 changed files with 25 additions and 10 deletions
|
@ -3414,6 +3414,9 @@ static void bnxt_free_tx_skbs(struct bnxt *bp)
|
|||
|
||||
bnxt_free_one_tx_ring_skbs(bp, txr, i);
|
||||
}
|
||||
|
||||
if (bp->ptp_cfg && !(bp->fw_cap & BNXT_FW_CAP_TX_TS_CMP))
|
||||
bnxt_ptp_free_txts_skbs(bp->ptp_cfg);
|
||||
}
|
||||
|
||||
static void bnxt_free_one_rx_ring(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
|
||||
|
@ -12797,8 +12800,6 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
|
|||
/* VF-reps may need to be re-opened after the PF is re-opened */
|
||||
if (BNXT_PF(bp))
|
||||
bnxt_vf_reps_open(bp);
|
||||
if (bp->ptp_cfg && !(bp->fw_cap & BNXT_FW_CAP_TX_TS_CMP))
|
||||
WRITE_ONCE(bp->ptp_cfg->tx_avail, BNXT_MAX_TX_TS);
|
||||
bnxt_ptp_init_rtc(bp, true);
|
||||
bnxt_ptp_cfg_tstamp_filters(bp);
|
||||
if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
|
||||
|
|
|
@ -794,6 +794,27 @@ next_slot:
|
|||
return HZ;
|
||||
}
|
||||
|
||||
void bnxt_ptp_free_txts_skbs(struct bnxt_ptp_cfg *ptp)
|
||||
{
|
||||
struct bnxt_ptp_tx_req *txts_req;
|
||||
u16 cons = ptp->txts_cons;
|
||||
|
||||
/* make sure ptp aux worker finished with
|
||||
* possible BNXT_STATE_OPEN set
|
||||
*/
|
||||
ptp_cancel_worker_sync(ptp->ptp_clock);
|
||||
|
||||
ptp->tx_avail = BNXT_MAX_TX_TS;
|
||||
while (cons != ptp->txts_prod) {
|
||||
txts_req = &ptp->txts_req[cons];
|
||||
if (!IS_ERR_OR_NULL(txts_req->tx_skb))
|
||||
dev_kfree_skb_any(txts_req->tx_skb);
|
||||
cons = NEXT_TXTS(cons);
|
||||
}
|
||||
ptp->txts_cons = cons;
|
||||
ptp_schedule_worker(ptp->ptp_clock, 0);
|
||||
}
|
||||
|
||||
int bnxt_ptp_get_txts_prod(struct bnxt_ptp_cfg *ptp, u16 *prod)
|
||||
{
|
||||
spin_lock_bh(&ptp->ptp_tx_lock);
|
||||
|
@ -1105,7 +1126,6 @@ out:
|
|||
void bnxt_ptp_clear(struct bnxt *bp)
|
||||
{
|
||||
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
|
||||
int i;
|
||||
|
||||
if (!ptp)
|
||||
return;
|
||||
|
@ -1117,12 +1137,5 @@ void bnxt_ptp_clear(struct bnxt *bp)
|
|||
kfree(ptp->ptp_info.pin_config);
|
||||
ptp->ptp_info.pin_config = NULL;
|
||||
|
||||
for (i = 0; i < BNXT_MAX_TX_TS; i++) {
|
||||
if (ptp->txts_req[i].tx_skb) {
|
||||
dev_kfree_skb_any(ptp->txts_req[i].tx_skb);
|
||||
ptp->txts_req[i].tx_skb = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bnxt_unmap_ptp_regs(bp);
|
||||
}
|
||||
|
|
|
@ -162,6 +162,7 @@ int bnxt_ptp_cfg_tstamp_filters(struct bnxt *bp);
|
|||
void bnxt_ptp_reapply_pps(struct bnxt *bp);
|
||||
int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr);
|
||||
int bnxt_hwtstamp_get(struct net_device *dev, struct ifreq *ifr);
|
||||
void bnxt_ptp_free_txts_skbs(struct bnxt_ptp_cfg *ptp);
|
||||
int bnxt_ptp_get_txts_prod(struct bnxt_ptp_cfg *ptp, u16 *prod);
|
||||
void bnxt_get_tx_ts_p5(struct bnxt *bp, struct sk_buff *skb, u16 prod);
|
||||
int bnxt_get_rx_ts_p5(struct bnxt *bp, u64 *ts, u32 pkt_ts);
|
||||
|
|
Loading…
Add table
Reference in a new issue