All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Toke Høiland-Jørgensen" <toke@toke.dk>
To: Halil Pasic <pasic@linux.ibm.com>, Robin Murphy <robin.murphy@arm.com>
Cc: mbizon@freebox.fr, Linus Torvalds <torvalds@linux-foundation.org>,
	Netdev <netdev@vger.kernel.org>, Kalle Valo <kvalo@kernel.org>,
	linux-wireless <linux-wireless@vger.kernel.org>,
	Oleksandr Natalenko <oleksandr@natalenko.name>,
	stable <stable@vger.kernel.org>,
	"David S. Miller" <davem@davemloft.net>,
	iommu <iommu@lists.linux-foundation.org>,
	Olha Cherevyk <olha.cherevyk@gmail.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Christoph Hellwig <hch@lst.de>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Halil Pasic <pasic@linux.ibm.com>
Subject: Re: [REGRESSION] Recent swiotlb DMA_FROM_DEVICE fixes break ath9k-based AP
Date: Sat, 26 Mar 2022 17:05:37 +0100	[thread overview]
Message-ID: <8735j47l7y.fsf@toke.dk> (raw)
In-Reply-To: <20220326003853.44c3285c.pasic@linux.ibm.com>

Halil Pasic <pasic@linux.ibm.com> writes:

> On Fri, 25 Mar 2022 11:27:41 +0000
> Robin Murphy <robin.murphy@arm.com> wrote:
>
>> What muddies the waters a bit is that the opposite combination 
>> sync_for_cpu(DMA_TO_DEVICE) really *should* always be a no-op, and I for 
>> one have already made the case for eliding that in code elsewhere, but 
>> it doesn't necessarily hold for the inverse here, hence why I'm not sure 
>> there even is a robust common solution for peeking at a live 
>> DMA_FROM_DEVICE buffer.
>
> In https://lkml.org/lkml/2022/3/24/739 I also argued, that a robust
> common solution for a peeking at a live DMA_FROM_DEVICE buffer is
> probably not possible, at least not with the current programming model
> as described by Documentation/core-api/dma-api.rst.
>
> Namely AFAIU the programming model is based on exclusive ownership: the
> buffer is either owned by the device, which means CPU(s) are not allowed
> to *access* it, or it is owned by the CPU(s), and the device is not
> allowed to *access* it. Do we agree on this?
>
> Considering what Linus said here https://lkml.org/lkml/2022/3/24/775
> I understand that: if the idea that dma_sync_*_for_{cpu,device} always
> transfers ownership to the cpu and device respectively is abandoned, 
> and we re-define ownership in a sense that only the owner may write,
> but non-owner is allowed to read, then it may be possible to make the
> scenario under discussion work. 
>
> The scenario in pseudo code:
>
> /* when invoked device might be doing DMA into buf */
> rx_buf_complete(buf)
> {
> 	prepare_peek(buf, DMA_FROM_DEVICE);
>         if (!is_ready(buf)) {
>                 /*let device gain the buffer again*/
>                 peek_done_not_ready(buf, DMA_FROM_DEVICE);
>                 return false;
>         }
> 	peek_done_ready(buf, DMA_FROM_DEVICE);
> 	process_buff(buf, DMA_FROM_DEVICE); is
> }
>
> IMHO it is pretty obvious, that prepare_peek() has to update the
> cpu copy of the data *without* transferring ownership to the CPU. Since
> the owner is still the device, it is legit for the device to keep
> modifying the buffer via DMA. In case of the swiotlb, we would copy the
> content of the bounce buffer to the orig buffer possibly after
> invalidating
> caches, and for non-swiotlb we would do invalidate caches. So
> prepare_peek() could be actually something like,
> dma_sync_single_for_cpu(buf, DMA_FROM_DEVICE,
>                         DMA_ATTR_NO_OWNERSHIP_TRANSFER)
> which would most end up being functionally the same, as without the
> flag, since my guess is that the ownership is only tracked in our
> heads.

Well we also need to ensure that the CPU caches are properly invalidated
either in prepare_peek() or peek_done_not_ready(), so that the data is
not cached between subsequent peeks. This could translate to either
turning prepare_peek() into dma_sync_single_for_cpu(buf,
DMA_FROM_DEVICE, DMA_ATTR_NO_OWNERSHIP_TRANSFER_BUT_INVALIDATE_CACHES),
or it could turn peek_done_not_ready() into something that just
invalidates the cache.

I was also toying with the idea of having a copy-based peek helper like:

u32 data = dma_peek_word(buf, offset)

which leaves the ownership as-is, but copies out a single word from the
buffer at the given offset (from the bounce buffer or real buffer as
appropriate) without messing with the ownership notion. The trouble with
this idea is that ath9k reads two different words that are 44 bytes from
each other, so it would have to do two such calls, which would be racy :(

-Toke

WARNING: multiple messages have this Message-ID (diff)
From: "Toke Høiland-Jørgensen via iommu" <iommu@lists.linux-foundation.org>
To: Halil Pasic <pasic@linux.ibm.com>, Robin Murphy <robin.murphy@arm.com>
Cc: Netdev <netdev@vger.kernel.org>, Kalle Valo <kvalo@kernel.org>,
	linux-wireless <linux-wireless@vger.kernel.org>,
	Oleksandr Natalenko <oleksandr@natalenko.name>,
	stable <stable@vger.kernel.org>, Christoph Hellwig <hch@lst.de>,
	Halil Pasic <pasic@linux.ibm.com>,
	Jakub Kicinski <kuba@kernel.org>,
	iommu <iommu@lists.linux-foundation.org>,
	Olha Cherevyk <olha.cherevyk@gmail.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	mbizon@freebox.fr, Paolo Abeni <pabeni@redhat.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	"David S. Miller" <davem@davemloft.net>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [REGRESSION] Recent swiotlb DMA_FROM_DEVICE fixes break ath9k-based AP
Date: Sat, 26 Mar 2022 17:05:37 +0100	[thread overview]
Message-ID: <8735j47l7y.fsf@toke.dk> (raw)
In-Reply-To: <20220326003853.44c3285c.pasic@linux.ibm.com>

Halil Pasic <pasic@linux.ibm.com> writes:

> On Fri, 25 Mar 2022 11:27:41 +0000
> Robin Murphy <robin.murphy@arm.com> wrote:
>
>> What muddies the waters a bit is that the opposite combination 
>> sync_for_cpu(DMA_TO_DEVICE) really *should* always be a no-op, and I for 
>> one have already made the case for eliding that in code elsewhere, but 
>> it doesn't necessarily hold for the inverse here, hence why I'm not sure 
>> there even is a robust common solution for peeking at a live 
>> DMA_FROM_DEVICE buffer.
>
> In https://lkml.org/lkml/2022/3/24/739 I also argued, that a robust
> common solution for a peeking at a live DMA_FROM_DEVICE buffer is
> probably not possible, at least not with the current programming model
> as described by Documentation/core-api/dma-api.rst.
>
> Namely AFAIU the programming model is based on exclusive ownership: the
> buffer is either owned by the device, which means CPU(s) are not allowed
> to *access* it, or it is owned by the CPU(s), and the device is not
> allowed to *access* it. Do we agree on this?
>
> Considering what Linus said here https://lkml.org/lkml/2022/3/24/775
> I understand that: if the idea that dma_sync_*_for_{cpu,device} always
> transfers ownership to the cpu and device respectively is abandoned, 
> and we re-define ownership in a sense that only the owner may write,
> but non-owner is allowed to read, then it may be possible to make the
> scenario under discussion work. 
>
> The scenario in pseudo code:
>
> /* when invoked device might be doing DMA into buf */
> rx_buf_complete(buf)
> {
> 	prepare_peek(buf, DMA_FROM_DEVICE);
>         if (!is_ready(buf)) {
>                 /*let device gain the buffer again*/
>                 peek_done_not_ready(buf, DMA_FROM_DEVICE);
>                 return false;
>         }
> 	peek_done_ready(buf, DMA_FROM_DEVICE);
> 	process_buff(buf, DMA_FROM_DEVICE); is
> }
>
> IMHO it is pretty obvious, that prepare_peek() has to update the
> cpu copy of the data *without* transferring ownership to the CPU. Since
> the owner is still the device, it is legit for the device to keep
> modifying the buffer via DMA. In case of the swiotlb, we would copy the
> content of the bounce buffer to the orig buffer possibly after
> invalidating
> caches, and for non-swiotlb we would do invalidate caches. So
> prepare_peek() could be actually something like,
> dma_sync_single_for_cpu(buf, DMA_FROM_DEVICE,
>                         DMA_ATTR_NO_OWNERSHIP_TRANSFER)
> which would most end up being functionally the same, as without the
> flag, since my guess is that the ownership is only tracked in our
> heads.

Well we also need to ensure that the CPU caches are properly invalidated
either in prepare_peek() or peek_done_not_ready(), so that the data is
not cached between subsequent peeks. This could translate to either
turning prepare_peek() into dma_sync_single_for_cpu(buf,
DMA_FROM_DEVICE, DMA_ATTR_NO_OWNERSHIP_TRANSFER_BUT_INVALIDATE_CACHES),
or it could turn peek_done_not_ready() into something that just
invalidates the cache.

I was also toying with the idea of having a copy-based peek helper like:

u32 data = dma_peek_word(buf, offset)

which leaves the ownership as-is, but copies out a single word from the
buffer at the given offset (from the bounce buffer or real buffer as
appropriate) without messing with the ownership notion. The trouble with
this idea is that ath9k reads two different words that are 44 bytes from
each other, so it would have to do two such calls, which would be racy :(

-Toke
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

  reply	other threads:[~2022-03-26 16:05 UTC|newest]

Thread overview: 139+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-23  7:19 [REGRESSION] Recent swiotlb DMA_FROM_DEVICE fixes break ath9k-based AP Oleksandr Natalenko
2022-03-23  7:19 ` Oleksandr Natalenko via iommu
2022-03-23  7:28 ` Kalle Valo
2022-03-23  7:28   ` Kalle Valo
2022-03-23 17:27 ` Linus Torvalds
2022-03-23 17:27   ` Linus Torvalds
2022-03-23 19:06   ` Robin Murphy
2022-03-23 19:06     ` Robin Murphy
2022-03-23 19:16     ` Linus Torvalds
2022-03-23 19:16       ` Linus Torvalds
2022-03-23 20:54       ` Robin Murphy
2022-03-23 20:54         ` Robin Murphy
2022-03-24  5:57         ` Christoph Hellwig
2022-03-24  5:57           ` Christoph Hellwig
2022-03-24 10:25           ` Oleksandr Natalenko
2022-03-24 10:25             ` Oleksandr Natalenko via iommu
2022-03-24 11:05             ` Robin Murphy
2022-03-24 11:05               ` Robin Murphy
2022-03-24 14:27               ` Toke Høiland-Jørgensen
2022-03-24 14:27                 ` Toke Høiland-Jørgensen via iommu
2022-03-24 16:29                 ` Maxime Bizon
2022-03-24 16:29                   ` Maxime Bizon
2022-03-24 16:31                   ` Christoph Hellwig
2022-03-24 16:31                     ` Christoph Hellwig
2022-03-24 16:52                     ` Robin Murphy
2022-03-24 16:52                       ` Robin Murphy
2022-03-24 17:07                       ` Toke Høiland-Jørgensen
2022-03-24 17:07                         ` Toke Høiland-Jørgensen via iommu
2022-03-24 19:26                         ` Linus Torvalds
2022-03-24 19:26                           ` Linus Torvalds
2022-03-24 21:14                           ` Toke Høiland-Jørgensen
2022-03-24 21:14                             ` Toke Høiland-Jørgensen via iommu
2022-03-25 10:25                           ` Maxime Bizon
2022-03-25 10:25                             ` Maxime Bizon
2022-03-25 11:27                             ` Robin Murphy
2022-03-25 11:27                               ` Robin Murphy
2022-03-25 23:38                               ` Halil Pasic
2022-03-25 23:38                                 ` Halil Pasic
2022-03-26 16:05                                 ` Toke Høiland-Jørgensen [this message]
2022-03-26 16:05                                   ` Toke Høiland-Jørgensen via iommu
2022-03-26 18:38                                   ` Linus Torvalds
2022-03-26 18:38                                     ` Linus Torvalds
2022-03-26 22:38                                     ` David Laight
2022-03-26 22:38                                       ` David Laight
2022-03-26 22:41                                       ` Linus Torvalds
2022-03-26 22:41                                         ` Linus Torvalds
2022-03-25 16:25                             ` Toke Høiland-Jørgensen
2022-03-25 16:25                               ` Toke Høiland-Jørgensen via iommu
2022-03-25 16:45                               ` Robin Murphy
2022-03-25 16:45                                 ` Robin Murphy
2022-03-25 18:13                                 ` Toke Høiland-Jørgensen via iommu
2022-03-25 18:13                                   ` Toke Høiland-Jørgensen
2022-03-25 18:30                             ` Linus Torvalds
2022-03-25 18:30                               ` Linus Torvalds
2022-03-25 19:14                               ` Robin Murphy
2022-03-25 19:14                                 ` Robin Murphy
2022-03-25 19:21                                 ` Linus Torvalds
2022-03-25 19:21                                   ` Linus Torvalds
2022-03-25 19:26                               ` Oleksandr Natalenko via iommu
2022-03-25 19:26                                 ` Oleksandr Natalenko
2022-03-25 19:27                                 ` Linus Torvalds
2022-03-25 19:27                                   ` Linus Torvalds
2022-03-25 19:35                                   ` Oleksandr Natalenko via iommu
2022-03-25 19:35                                     ` Oleksandr Natalenko
2022-03-25 20:37                               ` Johannes Berg
2022-03-25 20:37                                 ` Johannes Berg
2022-03-25 20:47                                 ` Linus Torvalds
2022-03-25 20:47                                   ` Linus Torvalds
2022-03-25 21:13                                   ` Johannes Berg
2022-03-25 21:13                                     ` Johannes Berg
2022-03-25 21:40                                     ` David Laight
2022-03-25 21:40                                       ` David Laight
2022-03-25 21:56                                     ` Linus Torvalds
2022-03-25 21:56                                       ` Linus Torvalds
2022-03-25 22:41                                       ` David Laight
2022-03-25 22:41                                         ` David Laight
2022-03-27  3:15                                     ` Halil Pasic
2022-03-27  3:15                                       ` Halil Pasic
2022-03-28  9:48                                       ` Johannes Berg
2022-03-28  9:48                                         ` Johannes Berg
2022-03-28  9:50                                         ` Johannes Berg
2022-03-28  9:50                                           ` Johannes Berg
2022-03-28  9:57                                           ` Johannes Berg
2022-03-28  9:57                                             ` Johannes Berg
2022-03-27  3:48                           ` Halil Pasic
2022-03-27  3:48                             ` Halil Pasic
2022-03-27  5:06                             ` Linus Torvalds
2022-03-27  5:06                               ` Linus Torvalds
2022-03-27  5:21                               ` Linus Torvalds
2022-03-27  5:21                                 ` Linus Torvalds
2022-03-27 15:24                                 ` David Laight
2022-03-27 15:24                                   ` David Laight
2022-03-27 19:23                                   ` Linus Torvalds
2022-03-27 19:23                                     ` Linus Torvalds
2022-03-27 20:04                                     ` Linus Torvalds
2022-03-27 20:04                                       ` Linus Torvalds
2022-03-27 23:52                                 ` Halil Pasic
2022-03-27 23:52                                   ` Halil Pasic
2022-03-28  0:30                                   ` Linus Torvalds
2022-03-28  0:30                                     ` Linus Torvalds
2022-03-28 12:02                                     ` Halil Pasic
2022-03-28 12:02                                       ` Halil Pasic
2022-03-27 23:37                               ` Halil Pasic
2022-03-27 23:37                                 ` Halil Pasic
2022-03-28  0:37                                 ` Linus Torvalds
2022-03-28  0:37                                   ` Linus Torvalds
2022-03-25  7:12                         ` Oleksandr Natalenko
2022-03-25  7:12                           ` Oleksandr Natalenko via iommu
2022-03-25  9:21                           ` Thorsten Leemhuis
2022-03-25  9:21                             ` Thorsten Leemhuis
2022-03-24 18:31                       ` Halil Pasic
2022-03-24 18:31                         ` Halil Pasic
2022-03-25 16:31                         ` Christoph Hellwig
2022-03-25 16:31                           ` Christoph Hellwig
2022-03-24 18:02         ` Halil Pasic
2022-03-24 18:02           ` Halil Pasic
2022-03-25 15:25           ` Halil Pasic
2022-03-25 15:25             ` Halil Pasic
2022-03-25 16:23             ` Robin Murphy
2022-03-25 16:23               ` Robin Murphy
2022-03-25 16:32           ` Christoph Hellwig
2022-03-25 16:32             ` Christoph Hellwig
2022-03-25 18:15             ` Toke Høiland-Jørgensen via iommu
2022-03-25 18:15               ` Toke Høiland-Jørgensen
2022-03-25 18:42               ` Robin Murphy
2022-03-25 18:42                 ` Robin Murphy
2022-03-25 18:46                 ` Linus Torvalds
2022-03-25 18:46                   ` Linus Torvalds
2022-03-28  6:37                   ` Christoph Hellwig
2022-03-28  6:37                     ` Christoph Hellwig
2022-03-28  8:15                     ` David Laight
2022-03-28  8:15                       ` David Laight
2022-03-30 12:11                     ` Halil Pasic
2022-03-30 12:11                       ` Halil Pasic
2022-03-24  8:55   ` Oleksandr Natalenko
2022-03-24  8:55     ` Oleksandr Natalenko via iommu
2022-03-24 12:32 ` [REGRESSION] Recent swiotlb DMA_FROM_DEVICE fixes break ath9k-based AP #forregzbot Thorsten Leemhuis
2022-03-25  9:24   ` Thorsten Leemhuis
2022-03-27  9:00     ` Thorsten Leemhuis

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=8735j47l7y.fsf@toke.dk \
    --to=toke@toke.dk \
    --cc=davem@davemloft.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=hch@lst.de \
    --cc=iommu@lists.linux-foundation.org \
    --cc=kuba@kernel.org \
    --cc=kvalo@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=mbizon@freebox.fr \
    --cc=netdev@vger.kernel.org \
    --cc=oleksandr@natalenko.name \
    --cc=olha.cherevyk@gmail.com \
    --cc=pabeni@redhat.com \
    --cc=pasic@linux.ibm.com \
    --cc=robin.murphy@arm.com \
    --cc=stable@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /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.