From: Vadim Fedorenko <vadim.fedorenko@linux.dev>
To: Taehee Yoo <ap420073@gmail.com>
Cc: Michael Chan <michael.chan@broadcom.com>,
Pavan Chebbi <pavan.chebbi@broadcom.com>,
Jakub Kicinski <kuba@kernel.org>,
Richard Cochran <richardcochran@gmail.com>,
netdev@vger.kernel.org
Subject: Re: [PATCH net v4] bnxt_en: improve TX timestamping FIFO configuration
Date: Wed, 30 Apr 2025 17:47:13 +0100 [thread overview]
Message-ID: <e4f6b9e1-d51a-49f9-9c75-57ef1ea7babf@linux.dev> (raw)
In-Reply-To: <CAMArcTXnZ-T6nsSyEtBLj+_SzMJhEz8R4g5HnR-ToFx8JPLngw@mail.gmail.com>
On 30/04/2025 17:43, Taehee Yoo wrote:
> On Wed, Apr 30, 2025 at 11:55 PM Vadim Fedorenko
> <vadim.fedorenko@linux.dev> wrote:
>>
>> On 30/04/2025 13:59, Taehee Yoo wrote:
>>> On Thu, Apr 24, 2025 at 10:11 PM Vadim Fedorenko <vadfed@meta.com> wrote:
>>>>
>>>
>>> Hi Vadim,
>>> Thanks for this work!
>>>
>>>> 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: 8aa2a79e9b95 ("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>
>>>> ---
>>>> v3 -> v4:
>>>> * actually remove leftover unused variable in bnxt_ptp_clear()
>>>> (v3 was not committed before preparing unfortunately)
>>>> v2 -> v3:
>>>> * remove leftover unused variable in bnxt_ptp_clear()
>>>> v1 -> v2:
>>>> * move clearing of TS skbs to bnxt_free_tx_skbs
>>>> * remove spinlock as no TX is possible after bnxt_tx_disable()
>>>> * remove extra FIFO clearing in bnxt_ptp_clear()
>>>> ---
>>>> drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 ++--
>>>> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c | 29 ++++++++++++++-----
>>>> drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h | 1 +
>>>> 3 files changed, 25 insertions(+), 10 deletions(-)
>>>>
>>>> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
>>>> index c8e3468eee61..2c8e2c19d854 100644
>>>> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
>>>> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
>>>> @@ -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))
>>>> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
>>>> index 2d4e19b96ee7..0669d43472f5 100644
>>>> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
>>>> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
>>>> @@ -794,6 +794,27 @@ static long bnxt_ptp_ts_aux_work(struct ptp_clock_info *ptp_info)
>>>> 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 @@ int bnxt_ptp_init(struct bnxt *bp)
>>>> 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);
>>>> }
>>>> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
>>>> index a95f05e9c579..0481161d26ef 100644
>>>> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
>>>> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h
>>>> @@ -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);
>>>> --
>>>> 2.47.1
>>>>
>>>>
>>>
>>> I’ve encountered a kernel panic that I think is related to this patch.
>>> Could you please investigate it?
>>>
>>> Reproducer:
>>> ip link set $interface up
>>> modprobe -rv bnxt_en
>>>
>>
>> Hi Taehee!
>>
>> Yeah, looks like there are some issues on the remove path.
>> Could you please test the diff which may fix the problem:
>>
>> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
>> b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
>> index 78e496b0ec26..86a5de44b6f3 100644
>> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
>> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
>> @@ -16006,8 +16006,8 @@ static void bnxt_remove_one(struct pci_dev *pdev)
>>
>> bnxt_rdma_aux_device_del(bp);
>>
>> - bnxt_ptp_clear(bp);
>> unregister_netdev(dev);
>> + bnxt_ptp_clear(bp);
>>
>> bnxt_rdma_aux_device_uninit(bp);
>>
>
> Thanks! It seems to fix the issue.
> The above reproducer can't reproduce a kernel panic.
Great, thanks, I'll post a proper patch soon
prev parent reply other threads:[~2025-04-30 16:47 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-24 12:55 [PATCH net v4] bnxt_en: improve TX timestamping FIFO configuration Vadim Fedorenko
2025-04-26 2:00 ` patchwork-bot+netdevbpf
2025-04-30 12:59 ` Taehee Yoo
2025-04-30 14:55 ` Vadim Fedorenko
2025-04-30 16:43 ` Taehee Yoo
2025-04-30 16:47 ` Vadim Fedorenko [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=e4f6b9e1-d51a-49f9-9c75-57ef1ea7babf@linux.dev \
--to=vadim.fedorenko@linux.dev \
--cc=ap420073@gmail.com \
--cc=kuba@kernel.org \
--cc=michael.chan@broadcom.com \
--cc=netdev@vger.kernel.org \
--cc=pavan.chebbi@broadcom.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).