From: Paul Burton <paul.burton@imgtec.com>
To: Ralf Baechle <ralf@linux-mips.org>
Cc: David Daney <ddaney@caviumnetworks.com>,
<linux-mips@linux-mips.org>,
"Lars Persson" <lars.persson@axis.com>,
"stable # v4 . 1+" <stable@vger.kernel.org>,
"Steven J. Hill" <Steven.Hill@imgtec.com>,
David Daney <david.daney@cavium.com>,
Huacai Chen <chenhc@lemote.com>,
Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>,
<linux-kernel@vger.kernel.org>,
"Andrew Morton" <akpm@linux-foundation.org>,
Jerome Marchand <jmarchan@redhat.com>,
"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH 4/4] MIPS: Sync icache & dcache in set_pte_at
Date: Wed, 2 Mar 2016 14:24:01 +0000 [thread overview]
Message-ID: <20160302142401.GA10198@NP-P-BURTON> (raw)
In-Reply-To: <20160302141203.GB18341@linux-mips.org>
On Wed, Mar 02, 2016 at 03:12:03PM +0100, Ralf Baechle wrote:
> On Tue, Mar 01, 2016 at 05:19:40PM +0000, Paul Burton wrote:
>
> > > >+static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
> > > >+ pte_t *ptep, pte_t pteval)
> > > >+{
> > > >+ extern void __update_cache(unsigned long address, pte_t pte);
> > > >+
> > > >+ if (!pte_present(pteval))
> > > >+ goto cache_sync_done;
> > > >+
> > > >+ if (pte_present(*ptep) && (pte_pfn(*ptep) == pte_pfn(pteval)))
> > > >+ goto cache_sync_done;
> > > >+
> > > >+ __update_cache(addr, pteval);
> > > >+cache_sync_done:
> > > >+ set_pte(ptep, pteval);
> > > >+}
> > > >+
> > >
> > > This seems crazy.
> >
> > Perhaps, but also correct...
> >
> > > I don't think any other architecture does this type of work in set_pte_at().
> >
> > Yes they do. As mentioned in the commit message see arm, ia64 or powerpc
> > for architectures that all do the same sort of thing in set_pte_at.
> >
> > > Can you look into finding a better way?
> >
> > Not that I can see.
>
> FYI, this is the original commit message adding set_pte_at(). The commit
> predates Linus' git history but is in the various history trees, for example
> https://git.kernel.org/cgit/linux/kernel/git/tglx/history.git/commit/?id=ae3d0a847f4b38812241e4a5dc3371965c752a8c
>
> Or for your convenience:
>
> commit ae3d0a847f4b38812241e4a5dc3371965c752a8c
> Author: David S. Miller <davem@nuts.davemloft.net>
> Date: Tue Feb 22 23:42:56 2005 -0800
>
> [MM]: Add set_pte_at() which takes 'mm' and 'addr' args.
>
> I'm taking a slightly different approach this time around so things
> are easier to integrate. Here is the first patch which builds the
> infrastructure. Basically:
>
> 1) Add set_pte_at() which is set_pte() with 'mm' and 'addr' arguments
> added. All generic code uses set_pte_at().
>
> Most platforms simply get this define:
> #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
>
> I chose this method over simply changing all set_pte() call sites
> because many platforms implement this in assembler and it would
> take forever to preserve the build and stabilize things if modifying
> that was necessary.
>
> Soon, with platform maintainer's help, we can kill of set_pte() entirely.
> To be honest, there are only a handful of set_pte() call sites in the
> arch specific code.
>
> Actually, in this patch ppc64 is completely set_pte() free and does not
> define it.
>
> 2) pte_clear() gets 'mm' and 'addr' arguments now.
> This had a cascading effect on many ptep_test_and_*() routines. Specifically:
> a) ptep_test_and_clear_{young,dirty}() now take 'vma' and 'address' args.
> b) ptep_get_and_clear now take 'mm' and 'address' args.
> c) ptep_mkdirty was deleted, unused by any code.
> d) ptep_set_wrprotect now takes 'mm' and 'address' args.
>
> I've tested this patch as follows:
>
> 1) compile and run tested on sparc64/SMP
> 2) compile tested on:
> a) ppc64/SMP
> b) i386 both with and without PAE enabled
>
> Signed-off-by: David S. Miller <davem@davemloft.net>
>
> Which doesn't specify if the function is meant for cache management nor
> is it documented in Documentation/cachetlb.txt.
>
> Ralf
Hi Ralf,
It is, however, used in such a way by others & seems to me like the only
correct way to implement the lazy cache flushing. The alternative would
be to adjust all generic code to ensure flush_icache_page gets called
before set_pte_at, which is far more invasive.
Since you mention Documentation/cachetlb.txt that does indicate that
flush_icache_page should be removed some time & prior to this patch
we're making use of it, so I hardly think the content of that document
can be taken as defining what's acceptable.
Thanks,
Paul
WARNING: multiple messages have this Message-ID (diff)
From: Paul Burton <paul.burton@imgtec.com>
To: Ralf Baechle <ralf@linux-mips.org>
Cc: David Daney <ddaney@caviumnetworks.com>,
linux-mips@linux-mips.org, Lars Persson <lars.persson@axis.com>,
"stable # v4 . 1+" <stable@vger.kernel.org>,
"Steven J. Hill" <Steven.Hill@imgtec.com>,
David Daney <david.daney@cavium.com>,
Huacai Chen <chenhc@lemote.com>,
"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Jerome Marchand <jmarchan@redhat.com>,
"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH 4/4] MIPS: Sync icache & dcache in set_pte_at
Date: Wed, 2 Mar 2016 14:24:01 +0000 [thread overview]
Message-ID: <20160302142401.GA10198@NP-P-BURTON> (raw)
Message-ID: <20160302142401.D2oZwYNDxf_01OT0glPA6qCndEpdN410bBc8ee_TwIk@z> (raw)
In-Reply-To: <20160302141203.GB18341@linux-mips.org>
On Wed, Mar 02, 2016 at 03:12:03PM +0100, Ralf Baechle wrote:
> On Tue, Mar 01, 2016 at 05:19:40PM +0000, Paul Burton wrote:
>
> > > >+static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
> > > >+ pte_t *ptep, pte_t pteval)
> > > >+{
> > > >+ extern void __update_cache(unsigned long address, pte_t pte);
> > > >+
> > > >+ if (!pte_present(pteval))
> > > >+ goto cache_sync_done;
> > > >+
> > > >+ if (pte_present(*ptep) && (pte_pfn(*ptep) == pte_pfn(pteval)))
> > > >+ goto cache_sync_done;
> > > >+
> > > >+ __update_cache(addr, pteval);
> > > >+cache_sync_done:
> > > >+ set_pte(ptep, pteval);
> > > >+}
> > > >+
> > >
> > > This seems crazy.
> >
> > Perhaps, but also correct...
> >
> > > I don't think any other architecture does this type of work in set_pte_at().
> >
> > Yes they do. As mentioned in the commit message see arm, ia64 or powerpc
> > for architectures that all do the same sort of thing in set_pte_at.
> >
> > > Can you look into finding a better way?
> >
> > Not that I can see.
>
> FYI, this is the original commit message adding set_pte_at(). The commit
> predates Linus' git history but is in the various history trees, for example
> https://git.kernel.org/cgit/linux/kernel/git/tglx/history.git/commit/?id=ae3d0a847f4b38812241e4a5dc3371965c752a8c
>
> Or for your convenience:
>
> commit ae3d0a847f4b38812241e4a5dc3371965c752a8c
> Author: David S. Miller <davem@nuts.davemloft.net>
> Date: Tue Feb 22 23:42:56 2005 -0800
>
> [MM]: Add set_pte_at() which takes 'mm' and 'addr' args.
>
> I'm taking a slightly different approach this time around so things
> are easier to integrate. Here is the first patch which builds the
> infrastructure. Basically:
>
> 1) Add set_pte_at() which is set_pte() with 'mm' and 'addr' arguments
> added. All generic code uses set_pte_at().
>
> Most platforms simply get this define:
> #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
>
> I chose this method over simply changing all set_pte() call sites
> because many platforms implement this in assembler and it would
> take forever to preserve the build and stabilize things if modifying
> that was necessary.
>
> Soon, with platform maintainer's help, we can kill of set_pte() entirely.
> To be honest, there are only a handful of set_pte() call sites in the
> arch specific code.
>
> Actually, in this patch ppc64 is completely set_pte() free and does not
> define it.
>
> 2) pte_clear() gets 'mm' and 'addr' arguments now.
> This had a cascading effect on many ptep_test_and_*() routines. Specifically:
> a) ptep_test_and_clear_{young,dirty}() now take 'vma' and 'address' args.
> b) ptep_get_and_clear now take 'mm' and 'address' args.
> c) ptep_mkdirty was deleted, unused by any code.
> d) ptep_set_wrprotect now takes 'mm' and 'address' args.
>
> I've tested this patch as follows:
>
> 1) compile and run tested on sparc64/SMP
> 2) compile tested on:
> a) ppc64/SMP
> b) i386 both with and without PAE enabled
>
> Signed-off-by: David S. Miller <davem@davemloft.net>
>
> Which doesn't specify if the function is meant for cache management nor
> is it documented in Documentation/cachetlb.txt.
>
> Ralf
Hi Ralf,
It is, however, used in such a way by others & seems to me like the only
correct way to implement the lazy cache flushing. The alternative would
be to adjust all generic code to ensure flush_icache_page gets called
before set_pte_at, which is far more invasive.
Since you mention Documentation/cachetlb.txt that does indicate that
flush_icache_page should be removed some time & prior to this patch
we're making use of it, so I hardly think the content of that document
can be taken as defining what's acceptable.
Thanks,
Paul
next prev parent reply other threads:[~2016-03-02 14:24 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-01 2:37 [PATCH 0/4] MIPS cache & highmem fixes Paul Burton
2016-03-01 2:37 ` Paul Burton
2016-03-01 2:37 ` [PATCH 1/4] MIPS: Flush dcache for flush_kernel_dcache_page Paul Burton
2016-03-01 2:37 ` Paul Burton
2016-03-04 15:09 ` Lars Persson
2016-03-29 8:29 ` Ralf Baechle
2016-03-01 2:37 ` [PATCH 2/4] MIPS: Flush highmem pages in __flush_dcache_page Paul Burton
2016-03-01 2:37 ` Paul Burton
2016-03-29 8:35 ` Ralf Baechle
2016-03-29 8:55 ` Paul Burton
2016-03-29 8:55 ` Paul Burton
2016-03-01 2:37 ` [PATCH 3/4] MIPS: Handle highmem pages in __update_cache Paul Burton
2016-03-01 2:37 ` Paul Burton
2016-03-29 8:39 ` Ralf Baechle
2016-03-01 2:37 ` [PATCH 4/4] MIPS: Sync icache & dcache in set_pte_at Paul Burton
2016-03-01 2:37 ` Paul Burton
2016-03-01 9:44 ` Lars Persson
2016-03-01 9:44 ` Lars Persson
2016-03-01 17:13 ` David Daney
2016-03-01 17:13 ` David Daney
2016-03-01 17:19 ` Paul Burton
2016-03-01 17:19 ` Paul Burton
2016-03-02 14:12 ` Ralf Baechle
2016-03-02 14:24 ` Paul Burton [this message]
2016-03-02 14:24 ` Paul Burton
2016-03-04 17:43 ` David Daney
2016-03-04 17:43 ` David Daney
2016-03-04 17:47 ` Paul Burton
2016-03-04 17:47 ` Paul Burton
2016-03-03 3:03 ` [4/4] " Leonid Yegoshin
2016-03-03 3:03 ` Leonid Yegoshin
2016-03-04 10:37 ` Paul Burton
2016-03-04 10:37 ` Paul Burton
2016-03-04 15:20 ` Lars Persson
2016-03-04 21:01 ` Leonid Yegoshin
2016-03-04 21:01 ` Leonid Yegoshin
2016-03-04 21:21 ` Leonid Yegoshin
2016-03-04 21:21 ` Leonid Yegoshin
2016-03-05 1:06 ` Leonid Yegoshin
2016-03-05 1:06 ` Leonid Yegoshin
2016-03-04 19:02 ` [PATCH 4/4] " Lars Persson
2016-03-05 0:21 ` Paul Burton
2016-03-05 0:27 ` Paul Burton
2016-03-02 11:39 ` [PATCH 0/4] MIPS cache & highmem fixes Harvey Hunt
2016-03-02 11:39 ` Harvey Hunt
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=20160302142401.GA10198@NP-P-BURTON \
--to=paul.burton@imgtec.com \
--cc=Steven.Hill@imgtec.com \
--cc=akpm@linux-foundation.org \
--cc=aneesh.kumar@linux.vnet.ibm.com \
--cc=chenhc@lemote.com \
--cc=david.daney@cavium.com \
--cc=ddaney@caviumnetworks.com \
--cc=jmarchan@redhat.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=lars.persson@axis.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=ralf@linux-mips.org \
--cc=stable@vger.kernel.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