From: catalin.marinas@arm.com (Catalin Marinas)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH V4] ARM: handle user space mapped pages in flush_kernel_dcache_page
Date: Tue, 28 May 2013 11:20:01 +0100 [thread overview]
Message-ID: <20130528102001.GB14329@arm.com> (raw)
In-Reply-To: <20130527214245.GB517@schnuecks.de>
On Mon, May 27, 2013 at 10:42:45PM +0100, Simon Baatz wrote:
> On Thu, May 23, 2013 at 11:43:03AM +0100, Catalin Marinas wrote:
> > On Sun, May 12, 2013 at 06:35:56AM +0100, Simon Baatz wrote:
> > > Commit f8b63c1 made flush_kernel_dcache_page a no-op assuming that the pages
> > > it needs to handle are kernel mapped only. However, for example when doing
> > > direct I/O, pages with user space mappings may occur.
> > >
> > > Thus, continue to do lazy flushing if there are no user space mappings.
> > > Otherwise, flush the kernel cache lines directly.
> > >
> > > Signed-off-by: Simon Baatz <gmbnomis@gmail.com>
> > > Cc: Catalin Marinas <catalin.marinas@arm.com>
> > > Cc: Russell King <linux@arm.linux.org.uk>
> >
> > An issue is that for kunmap_atomic() && VIVT we flush the same page
> > twice. I don't think we should remove the cache flushing in
> > __kunmap_atomic() for VIVT since not all kunmap_atomic() calls require
> > flush_kernel_dcache_page() (unless we just assume that highmem && vivt
> > don't work together). Flushing the VIVT cache on kunmap is essential
> > since we just lose the alias after that.
>
> Not sure if I am missing something here. From our previous
> discussion:
>
> > > > > We probably should reuse it in flush_kernel_dcache_page() to flush
> > > > > the kernel mapping. (The last else clause looks strange though)
> > > >
> > > > I think it makes sense to reuse this logic in
> > > > flush_kernel_dcache_page(). If the page is already mapped with kmap,
> > > > then kmap_high_get() should return the actual address. If it was mapped
> > > > with kmap_atomic, kmap_high_get() would return NULL, hence the 'else'
> > > > clause and the additional kmap_atomic(). The cache_is_vipt() check is
> > > > useful because kunmap_atomic() would flush VIVT caches anyway.
I think the context was that page_address() is not always valid after
kmap_atomic(), so reusing the same logic would make sense.
But the key point I try to understand is why kunmap() does not need to
flush the VIVT cache. If it does need to, then we can simplify your
patch.
> As you say, this logic does not flush on VIVT if the page was mapped
> via kmap_atomic() (and kmap_atomic() could not reuse an existing
> mapping via kmap_high_get())
>
> kmap_atomic() tries to reuse an existing mapping and only allocates a
> new dedicated kmap if it finds none. Consequently, __kunmap_atomic()
> only flushes in the latter case (because we lose the alias).
>
> Thus, no double flushing should occur here. If kunmap_atomic() will
> flush, __flush_kernel_dcache_page() will not and vice versa.
That's correct for the current code. Let's wait for some insight from
Nico or Russell on whether kunmap() needs to lush the VIVT cache as
well. If it doesn't need to, then my original comment made sense.
--
Catalin
next prev parent reply other threads:[~2013-05-28 10:20 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-12 5:35 [PATCH V4] ARM: handle user space mapped pages in flush_kernel_dcache_page Simon Baatz
2013-05-23 10:43 ` Catalin Marinas
2013-05-25 3:53 ` Nicolas Pitre
2013-05-28 9:55 ` Catalin Marinas
2013-05-28 17:52 ` Nicolas Pitre
2013-05-29 10:37 ` Catalin Marinas
2013-05-29 14:39 ` Nicolas Pitre
2013-05-29 16:32 ` Nicolas Pitre
2013-05-29 17:33 ` Catalin Marinas
2013-05-27 21:42 ` Simon Baatz
2013-05-28 10:20 ` Catalin Marinas [this message]
2013-05-28 18:50 ` Nicolas Pitre
2013-05-29 11:05 ` Catalin Marinas
2013-05-29 19:16 ` Simon Baatz
2013-05-30 16:43 ` Catalin Marinas
2013-05-31 12:05 ` Jason Cooper
2013-05-31 14:15 ` Catalin Marinas
2013-05-31 14:20 ` Jason Cooper
2013-06-03 17:38 ` Simon Baatz
2013-06-03 18:03 ` Jason Cooper
2013-06-03 19:11 ` Simon Baatz
2013-06-03 19:22 ` Jason Cooper
2013-06-03 20:38 ` Greg KH
2013-06-05 13:58 ` Catalin Marinas
2013-06-05 19:55 ` Simon Baatz
2013-05-31 9:07 ` Ming Lei
2013-05-31 18:54 ` Simon Baatz
2013-06-01 10:27 ` Ming Lei
2013-06-03 9:33 ` Catalin Marinas
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=20130528102001.GB14329@arm.com \
--to=catalin.marinas@arm.com \
--cc=linux-arm-kernel@lists.infradead.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).