stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Halil Pasic <pasic@linux.ibm.com>
To: Robin Murphy <robin.murphy@arm.com>
Cc: mbizon@freebox.fr,
	"Linus Torvalds" <torvalds@linux-foundation.org>,
	"Toke Høiland-Jørgensen" <toke@toke.dk>,
	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 00:38:53 +0100	[thread overview]
Message-ID: <20220326003853.44c3285c.pasic@linux.ibm.com> (raw)
In-Reply-To: <cce202fb-5185-aa3e-9e9b-11626192cb49@arm.com>

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. 

For peek_done_not_ready() there is conceptually nothing to do, because
the device retained ownership. Thus would either have to mandate
peek_done_not_ready() being a nop, or non-existent, (that is
what Toke's patch does in the specific case), or we would have to
mandate that dma_sync_*_for_*() has no side effects under certain. The
former looks simpler to me, especially with swiotlb. But we are also
fine if the cache ain't dirty, because the CPU didn't write (as pointed
out by Linus) and we were to detect that, and avoid flushing a clean
cache, or if we were to track ownership and to avoid flushing caches
because no ownership transfer. But to avoid these bad flushes, at least
for swiotlb, we would either have to track cache ownership, or even
worse track dirtiness (for which we would have to extend the API, and
make the drivers tell us that the cache, i.e. the original buffer got
dirtied).

Since the device has ownership when peek_done_not_ready() is invoked,
we might need to transfer ownership to the CPU in peek_done_ready().
This could again be a dma_sync_for_cpu() with a flag, which when supplied
tells the dma API that no sync (cache invalidate) is needed because the
driver guarantees, that the whole mapping was sufficiently sync-ed by
prepare_peek(). Please notice, that the whole scheme is based on the
driver knowing that the whole DMA is done by examining the buffer, and
it decides based on whatever it sees.

Some of the ongoing discussion seem so ignore this whole ownership biz.
My feeling is: the notion of ownership useful. If both sides end up
modifying (and eventually flushing) we are in trouble IMHO, an ownership
avoids that. But if the conclusion ends up being, that ownership does
not matter, then we should make sure it is purged from the documentation,
because otherwise it will confuse the hell out of people who read
documentations and care about programming models. People like me.

Regards,
Halil

  reply	other threads:[~2022-03-25 23:41 UTC|newest]

Thread overview: 68+ 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:28 ` Kalle Valo
2022-03-23 17:27 ` Linus Torvalds
2022-03-23 19:06   ` Robin Murphy
2022-03-23 19:16     ` Linus Torvalds
2022-03-23 20:54       ` Robin Murphy
2022-03-24  5:57         ` Christoph Hellwig
2022-03-24 10:25           ` Oleksandr Natalenko
2022-03-24 11:05             ` Robin Murphy
2022-03-24 14:27               ` Toke Høiland-Jørgensen
2022-03-24 16:29                 ` Maxime Bizon
2022-03-24 16:31                   ` Christoph Hellwig
2022-03-24 16:52                     ` Robin Murphy
2022-03-24 17:07                       ` Toke Høiland-Jørgensen
2022-03-24 19:26                         ` Linus Torvalds
2022-03-24 21:14                           ` Toke Høiland-Jørgensen
2022-03-25 10:25                           ` Maxime Bizon
2022-03-25 11:27                             ` Robin Murphy
2022-03-25 23:38                               ` Halil Pasic [this message]
2022-03-26 16:05                                 ` Toke Høiland-Jørgensen
2022-03-26 18:38                                   ` Linus Torvalds
2022-03-26 22:38                                     ` David Laight
2022-03-26 22:41                                       ` Linus Torvalds
2022-03-25 16:25                             ` Toke Høiland-Jørgensen
2022-03-25 16:45                               ` Robin Murphy
2022-03-25 18:13                                 ` Toke Høiland-Jørgensen
2022-03-25 18:30                             ` Linus Torvalds
2022-03-25 19:14                               ` Robin Murphy
2022-03-25 19:21                                 ` Linus Torvalds
2022-03-25 19:26                               ` Oleksandr Natalenko
2022-03-25 19:27                                 ` Linus Torvalds
2022-03-25 19:35                                   ` Oleksandr Natalenko
2022-03-25 20:37                               ` Johannes Berg
2022-03-25 20:47                                 ` Linus Torvalds
2022-03-25 21:13                                   ` Johannes Berg
2022-03-25 21:40                                     ` David Laight
2022-03-25 21:56                                     ` Linus Torvalds
2022-03-25 22:41                                       ` David Laight
2022-03-27  3:15                                     ` Halil Pasic
2022-03-28  9:48                                       ` Johannes Berg
2022-03-28  9:50                                         ` Johannes Berg
2022-03-28  9:57                                           ` Johannes Berg
2022-03-27  3:48                           ` Halil Pasic
2022-03-27  5:06                             ` Linus Torvalds
2022-03-27  5:21                               ` Linus Torvalds
2022-03-27 15:24                                 ` David Laight
2022-03-27 19:23                                   ` Linus Torvalds
2022-03-27 20:04                                     ` Linus Torvalds
2022-03-27 23:52                                 ` Halil Pasic
2022-03-28  0:30                                   ` Linus Torvalds
2022-03-28 12:02                                     ` Halil Pasic
2022-03-27 23:37                               ` Halil Pasic
2022-03-28  0:37                                 ` Linus Torvalds
2022-03-25  7:12                         ` Oleksandr Natalenko
2022-03-25  9:21                           ` Thorsten Leemhuis
2022-03-24 18:31                       ` Halil Pasic
2022-03-25 16:31                         ` Christoph Hellwig
2022-03-24 18:02         ` Halil Pasic
2022-03-25 15:25           ` Halil Pasic
2022-03-25 16:23             ` Robin Murphy
2022-03-25 16:32           ` Christoph Hellwig
2022-03-25 18:15             ` Toke Høiland-Jørgensen
2022-03-25 18:42               ` Robin Murphy
2022-03-25 18:46                 ` Linus Torvalds
2022-03-28  6:37                   ` Christoph Hellwig
2022-03-28  8:15                     ` David Laight
2022-03-30 12:11                     ` Halil Pasic
2022-03-24  8:55   ` Oleksandr Natalenko

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=20220326003853.44c3285c.pasic@linux.ibm.com \
    --to=pasic@linux.ibm.com \
    --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=robin.murphy@arm.com \
    --cc=stable@vger.kernel.org \
    --cc=toke@toke.dk \
    --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 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).