From: Ding Hui <dinghui1111@163.com>
To: lorenzo.bianconi@oss.qualcomm.com
Cc: alexandre.torgue@foss.st.com, andrew+netdev@lunn.ch,
andrew@lunn.ch, davem@davemloft.net, dinghui1111@163.com,
dinghui@lixiang.com, edumazet@google.com, kuba@kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org,
linux-stm32@st-md-mailman.stormreply.com, liuxuanjun@lixiang.com,
maxime.chevallier@bootlin.com, mcoquelin.stm32@gmail.com,
netdev@vger.kernel.org, pabeni@redhat.com, xiasanbo@lixiang.com,
yangchen11@lixiang.com
Subject: Re:Re: [PATCH net-next v2] net: stmmac: fix error path cleanup in DMA descriptor ring allocation
Date: Thu, 10 Sep 2026 17:35:44 +0800 [thread overview]
Message-ID: <20260910093544.411975-1-dinghui1111@163.com> (raw)
In-Reply-To: <ap09hwoKJjqQWIrB@lore-desk>
Hi Lorenzo,
Thanks for your review comments.
At 2026-09-06 18:16:39, "Lorenzo Bianconi" <lorenzo.bianconi@oss.qualcomm.com> wrote:
>> From: Ding Hui <dinghui@lixiang.com>
>
>Hi Ding Hui,
>
>just a couple of nits inline.
>
>Regards,
>Lorenzo
>
>[...]
>
>> .../net/ethernet/stmicro/stmmac/stmmac_main.c | 59 ++++++++++++++++---
>> 1 file changed, 50 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
>> index f2fc89176654..f0e06c011b8d 100644
>> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
>> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
>> @@ -1728,7 +1728,7 @@ static void stmmac_free_tx_buffer(struct stmmac_priv *priv,
>> DMA_TO_DEVICE);
>> }
>>
>
>Is it more appropriate to move the tx_q->tx_skbuff_dma check here from
>dma_free_tx_skbufs()?
>
tx_skbuff_dma is a per-queue resource, and stmmac_free_tx_buffer()
references it in multiple places across the function body. Moving the
NULL check into stmmac_free_tx_buffer() would require repeating it on
every call, introducing O(n) overhead proportional to dma_tx_size.
So I put it at the entry of dma_free_tx_skbufs().
>> - if (tx_q->xdpf[i] &&
>> + if (tx_q->xdpf && tx_q->xdpf[i] &&
>> (tx_q->tx_skbuff_dma[i].buf_type == STMMAC_TXBUF_T_XDP_TX ||
>> tx_q->tx_skbuff_dma[i].buf_type == STMMAC_TXBUF_T_XDP_NDO)) {
>> xdp_return_frame(tx_q->xdpf[i]);
>> @@ -1738,7 +1738,7 @@ static void stmmac_free_tx_buffer(struct stmmac_priv *priv,
>> if (tx_q->tx_skbuff_dma[i].buf_type == STMMAC_TXBUF_T_XSK_TX)
>> tx_q->xsk_frames_done++;
>>
>> - if (tx_q->tx_skbuff[i] &&
>> + if (tx_q->tx_skbuff && tx_q->tx_skbuff[i] &&
>> tx_q->tx_skbuff_dma[i].buf_type == STMMAC_TXBUF_T_SKB) {
>> dev_kfree_skb_any(tx_q->tx_skbuff[i]);
>> tx_q->tx_skbuff[i] = NULL;
>> @@ -1761,6 +1761,10 @@ static void dma_free_rx_skbufs(struct stmmac_priv *priv,
>> struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue];
>> int i;
>>
>> + /* buf_pool may not be allocated if alloc failed early */
>> + if (!rx_q->buf_pool)
>> + return;
>> +
>> for (i = 0; i < dma_conf->dma_rx_size; i++)
>> stmmac_free_rx_buffer(priv, rx_q, i);
>> }
>> @@ -2272,15 +2284,19 @@ static int __alloc_dma_rx_desc_resources(struct stmmac_priv *priv,
>> }
>>
>> rx_q->buf_pool = kzalloc_objs(*rx_q->buf_pool, dma_conf->dma_rx_size);
>> - if (!rx_q->buf_pool)
>> - return -ENOMEM;
>> + if (!rx_q->buf_pool) {
>> + ret = -ENOMEM;
>> + goto err_destroy_pool;
>> + }
>>
>> size = stmmac_get_rx_desc_size(priv) * dma_conf->dma_rx_size;
>>
>> addr = dma_alloc_coherent(priv->device, size, &rx_q->dma_rx_phy,
>> GFP_KERNEL);
>> - if (!addr)
>> - return -ENOMEM;
>> + if (!addr) {
>> + ret = -ENOMEM;
>> + goto err_free_buf_pool;
>> + }
>>
>> if (priv->extend_desc)
>> rx_q->dma_erx = addr;
>> @@ -2296,10 +2312,27 @@ static int __alloc_dma_rx_desc_resources(struct stmmac_priv *priv,
>> ret = xdp_rxq_info_reg(&rx_q->xdp_rxq, priv->dev, queue, napi_id);
>> if (ret) {
>> netdev_err(priv->dev, "Failed to register xdp rxq info\n");
>> - return -EINVAL;
>> + goto err_free_dma;
>> }
>>
>> return 0;
>> +
>> +err_free_dma:
>> + if (priv->extend_desc)
>> + dma_free_coherent(priv->device, size, rx_q->dma_erx,
>> + rx_q->dma_rx_phy);
>> + else
>> + dma_free_coherent(priv->device, size, rx_q->dma_rx,
>> + rx_q->dma_rx_phy);
>
>I guess you can use addr here and remove the if/else block
>
Excellent suggestion, will use addr directly in v3.
Thanks,
Ding Hui
next prev parent reply other threads:[~2026-09-10 9:37 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-05 15:46 [PATCH net-next v2] net: stmmac: fix error path cleanup in DMA descriptor ring allocation Ding Hui
2026-09-06 10:16 ` Lorenzo Bianconi
2026-09-10 9:35 ` Ding Hui [this message]
2026-09-09 0:48 ` netdev-bot+sashiko
2026-09-13 13:33 ` Ding Hui
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=20260910093544.411975-1-dinghui1111@163.com \
--to=dinghui1111@163.com \
--cc=alexandre.torgue@foss.st.com \
--cc=andrew+netdev@lunn.ch \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=dinghui@lixiang.com \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=liuxuanjun@lixiang.com \
--cc=lorenzo.bianconi@oss.qualcomm.com \
--cc=maxime.chevallier@bootlin.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=xiasanbo@lixiang.com \
--cc=yangchen11@lixiang.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.