From: Christophe Leroy <christophe.leroy@csgroup.eu>
To: Jakub Kicinski <kuba@kernel.org>
Cc: "Måns Rullgård" <mans@mansr.com>,
"Pantelis Antoniou" <pantelis.antoniou@gmail.com>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Paolo Abeni" <pabeni@redhat.com>,
"Vitaly Bordug" <vbordug@ru.mvista.com>,
"Dan Malek" <dan@embeddededge.com>,
"Joakim Tjernlund" <joakim.tjernlund@lumentis.se>,
"linuxppc-dev@lists.ozlabs.org" <linuxppc-dev@lists.ozlabs.org>,
"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] net: fs_enet: sync rx dma buffer before reading
Date: Sat, 21 May 2022 06:44:41 +0000 [thread overview]
Message-ID: <d8cc1123-30d2-d65b-84b1-2ffee0d50aab@csgroup.eu> (raw)
In-Reply-To: <20220520104347.2b1b658a@kernel.org>
Le 20/05/2022 à 19:43, Jakub Kicinski a écrit :
> On Fri, 20 May 2022 12:54:56 +0000 Christophe Leroy wrote:
>> Le 20/05/2022 à 14:35, Måns Rullgård a écrit :
>>> Christophe Leroy <christophe.leroy@csgroup.eu> writes:
>>>> See original commit 070e1f01827c. It explicitely says that the cache
>>>> must be invalidate _AFTER_ the copy.
>>>>
>>>> The cache is initialy invalidated by dma_map_single(), so before the
>>>> copy the cache is already clean.
>>>>
>>>> After the copy, data is in the cache. In order to allow re-use of the
>>>> skb, it must be put back in the same condition as before, in extenso the
>>>> cache must be invalidated in order to be in the same situation as after
>>>> dma_map_single().
>>>>
>>>> So I think your change is wrong.
>>>
>>> OK, looking at it more closely, the change is at least unnecessary since
>>> there will be a cache invalidation between each use of the buffer either
>>> way. Please disregard the patch. Sorry for the noise.
>>>
>>
>> I also looked deeper.
>>
>> Indeed it was implemented in kernel 4.9 or 4.8. At that time
>> dma_unmap_single() was a no-op, it was not doing any sync/invalidation
>> at all, invalidation was done only at mapping, so when we were reusing
>> the skb it was necessary to clean the cache _AFTER_ the copy as if it
>> was a new mapping.
>>
>> Today a sync is done at both map and unmap, so it doesn't really matter
>> whether we do the invalidation before or after the copy when we re-use
>> the skb.
>
> Hm, I think the patch is necessary, sorry if you're also saying that
> and I'm misinterpreting.
Well, I say the contrary.
On the mainline the patch may be applied as is, it won't harm.
However, it is gets applied to kernel 4.9 (based on the fixes: tag), it
will break the driver for at least powerpc 8xx.
In 4.9, dma_direct_map_page() invalidates the cache, but
dma_direct_unmap_page() is a no-op. It means that when we re-use a skb
as we do in fs_enet when the received packet is small, the cache must be
invalidated _AFTER_ reading the received data.
The driver works like this:
allocate an SKB with the largest possible packet size
dma_direct_map_page() ==> cache invalidation
loop forever
wait for some received data in DMA
if (received packet is small)
allocate a new SKB with the size of the received packet
copy received data into the new SKB
hand new SKB to network layer
invalidate the cache
else
dma_direct_unmap_page() ==> no-op
hand SKB to network layer
allocate a new SKB with the largest possible packet size
dma_direct_map_page() ==> cache invalidation
endif
endloop
If you don't invalidate the cache _AFTER_ the copy, you have stale data
in the cache when you later hand a non-small received packet to the
network stack.
Invalidating _BEFORE_ the copy is useless as it has already been
invalidated at mapping time.
In mainline, the DMA handling has been make generic, and cache
invalidation is performed at both mapping at unmapping (Which is by the
way sub-optimal) so by change it would still work after the patch.
>
> Without the dma_sync_single_for_cpu() if swiotlb is used the data
> will not be copied back into the original buffer if there is no sync.
I don't know how SWIOTLB works or even what it is, does any of the
microcontrollers embedding freescale ethernet uses that at all ?
Christophe
next prev parent reply other threads:[~2022-05-21 6:44 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-19 19:24 Mans Rullgard
2022-05-20 5:39 ` Christophe Leroy
2022-05-20 12:35 ` Måns Rullgård
2022-05-20 12:54 ` Christophe Leroy
2022-05-20 17:43 ` Jakub Kicinski
2022-05-21 6:44 ` Christophe Leroy [this message]
2022-05-21 17:44 ` Jakub Kicinski
2022-05-23 20:23 ` Jakub Kicinski
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=d8cc1123-30d2-d65b-84b1-2ffee0d50aab@csgroup.eu \
--to=christophe.leroy@csgroup.eu \
--cc=dan@embeddededge.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=joakim.tjernlund@lumentis.se \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mans@mansr.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pantelis.antoniou@gmail.com \
--cc=vbordug@ru.mvista.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
all inboxes | Powered by JetHome®