Netdev List
 help / color / mirror / Atom feed
From: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
To: Grygorii Strashko <grygorii.strashko@ti.com>,
	David Miller <davem@davemloft.net>,
	netdev@vger.kernel.org, nsekhar@ti.com,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] net: ethernet: ti: davinci_cpdma: fix warning "device driver frees DMA memory with different size"
Date: Sat, 7 Dec 2019 14:02:39 +0200	[thread overview]
Message-ID: <20191207120238.GB2798@khorivan> (raw)
In-Reply-To: <20191207114419.GA2798@khorivan>

On Sat, Dec 07, 2019 at 01:44:20PM +0200, Ivan Khoronzhuk wrote:
>On Thu, Dec 05, 2019 at 12:48:46PM +0200, Grygorii Strashko wrote:
>>
>>
>>On 04/12/2019 22:37, David Miller wrote:
>>>From: Grygorii Strashko <grygorii.strashko@ti.com>
>>>Date: Wed, 4 Dec 2019 18:50:29 +0200
>>>
>>>>@@ -1018,7 +1018,7 @@ static int cpdma_chan_submit_si(struct submit_info *si)
>>>> 	struct cpdma_chan		*chan = si->chan;
>>>> 	struct cpdma_ctlr		*ctlr = chan->ctlr;
>>>> 	int				len = si->len;
>>>>-	int				swlen = len;
>>>>+	int				swlen;
>>>> 	struct cpdma_desc __iomem	*desc;
>>>> 	dma_addr_t			buffer;
>>>> 	u32				mode;
>>>>@@ -1040,6 +1040,7 @@ static int cpdma_chan_submit_si(struct submit_info *si)
>>>> 		chan->stats.runt_transmit_buff++;
>>>> 	}
>>>>+	swlen = len;
>>>> 	mode = CPDMA_DESC_OWNER | CPDMA_DESC_SOP | CPDMA_DESC_EOP;
>>>> 	cpdma_desc_to_port(chan, mode, si->directed);
>>>>-- 
>>>>2.17.1
>>>>
>>>
>>>Now there is no reason to keep a separate swlen variable.
>>>
>>>The integral value is always consumed as the length before the descriptor bits
>>>are added to it.
>>>
>>>Therefore you can just use 'len' everywhere in this function now.
>>>
>>
>>Sry, but seems i can't, at least i can't just drop swlen.
>>
>>Below in this function:
>>	writel_relaxed(0, &desc->hw_next);
>>	writel_relaxed(buffer, &desc->hw_buffer);
>>	writel_relaxed(len, &desc->hw_len);
>>	writel_relaxed(mode | len, &desc->hw_mode);
>>^^ here the "len" should be use
>>
>>	writel_relaxed((uintptr_t)si->token, &desc->sw_token);
>>	writel_relaxed(buffer, &desc->sw_buffer);
>>	writel_relaxed(swlen, &desc->sw_len);
>>^^ and here "len"|CPDMA_DMA_EXT_MAP if (si->data_dma) [1]
>>
>>	desc_read(desc, sw_len);
>>
>>so additional if statement has to be added at [1] if "swlen" is dropped
>>
>>-- 
>>Best regards,
>>grygorii
>
>Seems like yes,
>
>And the "swlen" can be avoided like this:
>
>--- a/drivers/net/ethernet/ti/davinci_cpdma.c
>+++ b/drivers/net/ethernet/ti/davinci_cpdma.c
>@@ -1018,7 +1018,6 @@ static int cpdma_chan_submit_si(struct submit_info *si)
>       struct cpdma_chan               *chan = si->chan;
>       struct cpdma_ctlr               *ctlr = chan->ctlr;
>       int                             len = si->len;
>-       int                             swlen = len;
>       struct cpdma_desc __iomem       *desc;
>       dma_addr_t                      buffer;
>       u32                             mode;
>@@ -1046,7 +1045,7 @@ static int cpdma_chan_submit_si(struct submit_info *si)
>       if (si->data_dma) {
>               buffer = si->data_dma;
>               dma_sync_single_for_device(ctlr->dev, buffer, len, chan->dir);
>-               swlen |= CPDMA_DMA_EXT_MAP;
>+               writel_relaxed(len | CPDMA_DMA_EXT_MAP, &desc->sw_len);
>       } else {
>               buffer = dma_map_single(ctlr->dev, si->data_virt, len, chan->dir);
>               ret = dma_mapping_error(ctlr->dev, buffer);
>@@ -1054,6 +1053,7 @@ static int cpdma_chan_submit_si(struct submit_info *si)
>                       cpdma_desc_free(ctlr->pool, desc, 1);
>                       return -EINVAL;
>               }
>+               writel_relaxed(len, &desc->sw_len);
>       }
>
>       /* Relaxed IO accessors can be used here as there is read barrier
>@@ -1065,7 +1065,6 @@ static int cpdma_chan_submit_si(struct submit_info *si)
>       writel_relaxed(mode | len, &desc->hw_mode);
>       writel_relaxed((uintptr_t)si->token, &desc->sw_token);
>       writel_relaxed(buffer, &desc->sw_buffer);
>-       writel_relaxed(swlen, &desc->sw_len);
>       desc_read(desc, sw_len);
>
>       __cpdma_chan_submit(chan, desc);
>
>But not sure what is better.
>

Or like this:

--- a/drivers/net/ethernet/ti/davinci_cpdma.c
+++ b/drivers/net/ethernet/ti/davinci_cpdma.c
@@ -1018,7 +1018,6 @@ static int cpdma_chan_submit_si(struct submit_info *si)
        struct cpdma_chan               *chan = si->chan;
        struct cpdma_ctlr               *ctlr = chan->ctlr;
        int                             len = si->len;
-       int                             swlen = len;
        struct cpdma_desc __iomem       *desc;
        dma_addr_t                      buffer;
        u32                             mode;
@@ -1046,7 +1045,6 @@ static int cpdma_chan_submit_si(struct submit_info *si)
        if (si->data_dma) {
                buffer = si->data_dma;
                dma_sync_single_for_device(ctlr->dev, buffer, len, chan->dir);
-               swlen |= CPDMA_DMA_EXT_MAP;
        } else {
                buffer = dma_map_single(ctlr->dev, si->data_virt, len, chan->dir);
                ret = dma_mapping_error(ctlr->dev, buffer);
@@ -1065,7 +1063,7 @@ static int cpdma_chan_submit_si(struct submit_info *si)
        writel_relaxed(mode | len, &desc->hw_mode);
        writel_relaxed((uintptr_t)si->token, &desc->sw_token);
        writel_relaxed(buffer, &desc->sw_buffer);
-       writel_relaxed(swlen, &desc->sw_len);
+       writel_relaxed(si->data_dma ? len | CPDMA_DMA_EXT_MAP : len, &desc->sw_len);
        desc_read(desc, sw_len);

        __cpdma_chan_submit(chan, desc);

But it's branched twice then.

-- 
Regards,
Ivan Khoronzhuk

  reply	other threads:[~2019-12-07 12:02 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-04 16:50 [PATCH v2] net: ethernet: ti: davinci_cpdma: fix warning "device driver frees DMA memory with different size" Grygorii Strashko
2019-12-04 20:37 ` David Miller
2019-12-05 10:48   ` Grygorii Strashko
2019-12-07 11:44     ` Ivan Khoronzhuk
2019-12-07 12:02       ` Ivan Khoronzhuk [this message]
2019-12-07 19:50         ` David Miller

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=20191207120238.GB2798@khorivan \
    --to=ivan.khoronzhuk@linaro.org \
    --cc=davem@davemloft.net \
    --cc=grygorii.strashko@ti.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=nsekhar@ti.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