parisc: fixes and cleanups in page cache flushing (1/4)
Helge Deller
maintainerPATCH 1/1 parisc: fixes and cleanups in page cache flushing (1/4)
This is the first patch in a series of 4, with which the page cache flushing of parisc will gets fixed and enhanced. This even fixes the nasty "minifail" bug
(http://wiki.parisc-linux.org/TestCases?highlight=%28minifail%29) which prevented parisc to stay an official debian port. Basically the flush in copy_user_page together with the TLB patch from commit 7139bc1579901b53db7e898789e916ee2fb52d78 is what fixes the minifail bug.
This patch still uses the TMPALIAS approach. The new copy_user_page implementation calls flush_dcache_page_asm to flush the user dcache page (crucial for minifail fix) via a kernel TMPALIAS mapping. After that, it just copies the page using the kernel mapping. It does a final flush if needed. Generally it is hard to avoid doing some cache flushes using the kernel mapping (e.g., copy_to_user_page and copy_from_user_page).
This patch depends on a subsequent change to pacache.S implementing clear_page_asm and copy_page_asm. These are optimized routines to clear and copy a page. The calls in clear_user_page and copy_user_page could be replaced by calls to memset and memcpy, respectively. I tested prefetch optimizations in clear_page_asm and copy_page_asm but didn't see any significant performance improvement on rp3440. I'm not sure if these are routines are significantly faster than memset and/or memcpy, but they are there for further performance evaluation.
arch/parisc/include/asm/page.h +16 -4
@@ -21,15 +21,27 @@#include <asm/types.h> #include <asm/cache.h> -#define clear_page (page) memset((void *)(page), 0, PAGE_SIZE) -#define copy_page (to,from) copy_user_page_asm((void *)(to), (void *)(from)) +#define clear_page (page) clear_page_asm((void *)(page)) +#define copy_page (to, from) copy_page_asm((void *)(to), (void *)(from))struct page ; -void copy_user_page_asm (void *to,void *from); +void clear_page_asm (void *page); +void copy_page_asm (void *to,void *from); +void clear_user_page (void *vto,unsigned long vaddr,struct page *pg);void copy_user_page (void *vto,void *vfrom,unsigned long vaddr,struct page *pg); -void clear_user_page (void *page,unsigned long vaddr,struct page *pg); + +/* #define CONFIG_PARISC_TMPALIAS */ + +#ifdef CONFIG_PARISC_TMPALIAS +void clear_user_highpage (struct page *page,unsigned long vaddr); +#define clear_user_highpage clear_user_highpage +struct vm_area_struct ; +void copy_user_highpage (struct page *to,struct page *from, +unsigned long vaddr,struct vm_area_struct *vma); +#define __HAVE_ARCH_COPY_USER_HIGHPAGE +#endif /* * These are used to make use of C type-checking..
arch/parisc/kernel/cache.c +21 -28
69 lines not on this page · raw message
arch/parisc/kernel/parisc_ksyms.c +3 -2
@@ -157,5 +157,6 @@ extern void _mcount(void);EXPORT_SYMBOL (_mcount);#endif -/* from pacache.S -- needed for copy_page */ -EXPORT_SYMBOL (copy_user_page_asm); +/* from pacache.S -- needed for clear/copy_page */ +EXPORT_SYMBOL (clear_page_asm); +EXPORT_SYMBOL (copy_page_asm);
Helge Deller
maintainerNeed to mention here:
Author of this patch series is:
Author: John David Anglin <[email protected]>
When I sent the mail the "Author" tag vanished in the mail header...
Helge
Quoted 154 lines · Helge Deller
This is the first patch in a series of 4, with which the page cache flushing of parisc will gets fixed and enhanced. This even fixes the nasty "minifail" bug
(http://wiki.parisc-linux.org/TestCases?highlight=%28minifail%29) which prevented parisc to stay an official debian port. Basically the flush incopy_user_pagetogether with the TLB patch from commit7139bc1579901b53db7e898789e916ee2fb52d78is what fixes the minifail bug.This patch still uses the TMPALIAS approach. The new
copy_user_pageimplementation callsflush_dcache_page_asmto flush the user dcache page (crucial for minifail fix) via a kernel TMPALIAS mapping. After that, it just copies the page using the kernel mapping. It does a final flush if needed. Generally it is hard to avoid doing some cache flushes using the kernel mapping (e.g.,copy_to_user_pageandcopy_from_user_page).This patch depends on a subsequent change to
pacache.Simplementingclear_page_asmandcopy_page_asm. These are optimized routines to clear and copy a page. The calls inclear_user_pageandcopy_user_pagecould be replaced by calls to memset and memcpy, respectively. I tested prefetch optimizations inclear_page_asmandcopy_page_asmbut didn't see any significant performance improvement on rp3440. I'm not sure if these are routines are significantly faster than memset and/or memcpy, but they are there for further performance evaluation.Signed-off-by John David Anglin <[email protected]>Signed-off-by Helge Deller <[email protected]>arch/parisc/include/asm/page.h +16
-4@@ -21,15 +21,27 @@#include <asm/types.h> #include <asm/cache.h> -#define clear_page (page) memset((void *)(page), 0, PAGE_SIZE) -#define copy_page (to,from) copy_user_page_asm((void *)(to), (void *)(from)) +#define clear_page (page) clear_page_asm((void *)(page)) +#define copy_page (to, from) copy_page_asm((void *)(to), (void *)(from))struct page ; -void copy_user_page_asm (void *to,void *from); +void clear_page_asm (void *page); +void copy_page_asm (void *to,void *from); +void clear_user_page (void *vto,unsigned long vaddr,struct page *pg);void copy_user_page (void *vto,void *vfrom,unsigned long vaddr,struct page *pg); -void clear_user_page (void *page,unsigned long vaddr,struct page *pg); + +/* #define CONFIG_PARISC_TMPALIAS */ + +#ifdef CONFIG_PARISC_TMPALIAS +void clear_user_highpage (struct page *page,unsigned long vaddr); +#define clear_user_highpage clear_user_highpage +struct vm_area_struct ; +void copy_user_highpage (struct page *to,struct page *from, +unsigned long vaddr,struct vm_area_struct *vma); +#define __HAVE_ARCH_COPY_USER_HIGHPAGE +#endif /* * These are used to make use of C type-checking.. arch/parisc/kernel/cache.c +21
-28@@ -329,17 +331,6 @@ EXPORT_SYMBOL(flush_kernel_dcache_page_asm);EXPORT_SYMBOL (flush_data_cache_local);EXPORT_SYMBOL (flush_kernel_icache_range_asm); -void clear_user_page_asm (void *page,unsigned long vaddr) -{ -unsigned long flags; -/* This function is implemented in assembly in pacache.S */ -extern void __clear_user_page_asm (void *page,unsigned long vaddr); - -purge_tlb_start (flags); -__clear_user_page_asm (page, vaddr); -purge_tlb_end (flags); -} -#define FLUSH_THRESHOLD 0x80000/* 0.5MB */ int parisc_cache_flush_threshold__read_mostly =FLUSH_THRESHOLD ;@@ -373,20 +364,9 @@ void __init parisc_setup_cache_timing(void)printk (KERN_INFO "Setting cache flush threshold to %x (%d CPUs online)\n" , parisc_cache_flush_threshold,num_online_cpus ()); } -extern void purge_kernel_dcache_page (unsigned long ); -extern void clear_user_page_asm (void *page,unsigned long vaddr); - -void clear_user_page (void *page,unsigned long vaddr,struct page *pg) -{ -unsigned long flags; - -purge_kernel_dcache_page ((unsigned long )page); -purge_tlb_start (flags); -pdtlb_kernel (page); -purge_tlb_end (flags); -clear_user_page_asm (page, vaddr); -} -EXPORT_SYMBOL (clear_user_page); +extern void purge_kernel_dcache_page_asm (unsigned long ); +extern void clear_user_page_asm (void *,unsigned long ); +extern void copy_user_page_asm (void *,void *,unsigned long );void flush_kernel_dcache_page_addr (void *addr) {@@ -399,11 +379,26 @@ void flush_kernel_dcache_page_addr(void *addr) }EXPORT_SYMBOL (flush_kernel_dcache_page_addr); +void clear_user_page (void *vto,unsigned long vaddr,struct page *page) +{ +clear_page_asm (vto); +if (!parisc_requires_coherency ()) +flush_kernel_dcache_page_asm (vto); +} +EXPORT_SYMBOL (clear_user_page); +void copy_user_page (void *vto,void *vfrom,unsigned long vaddr, -struct page *pg) +struct page *pg) { -/* no coherency needed (all in kmap/kunmap) */ -copy_user_page_asm (vto, vfrom); +/* Copy using kernel mapping. No coherency is needed +(all in kmap/kunmap) on machines that don't support +non-equivalent aliasing. However, the `from' page +needs to be flushed before it can be accessed through +the kernel mapping. */ +preempt_disable (); +flush_dcache_page_asm (__pa (vfrom), vaddr); +preempt_enable (); +copy_page_asm (vto, vfrom);if (!parisc_requires_coherency ())flush_kernel_dcache_page_asm (vto); }arch/parisc/kernel/parisc_ksyms.c +3
-2@@ -157,5 +157,6 @@ extern void _mcount(void);EXPORT_SYMBOL (_mcount);#endif -/* from pacache.S -- needed for copy_page */ -EXPORT_SYMBOL (copy_user_page_asm); +/* from pacache.S -- needed for clear/copy_page */ +EXPORT_SYMBOL (clear_page_asm); +EXPORT_SYMBOL (copy_page_asm);
Quoted 8 lines · Helge Deller
Need to mention here:
Author of this patch series is:
Author: John David Anglin <[email protected]>When I sent the mail the "Author" tag vanished in the mail header...
Helge
Send with git send-email. It manages all of this for you.
Quoted 6 lines · Helge Deller
This is the first patch in a series of 4, with which the page cache flushing of parisc will gets fixed and enhanced. This even fixes the nasty "minifail" bug
(http://wiki.parisc-linux.org/TestCases?highlight=%28minifail%29) which prevented parisc to stay an official debian port. Basically the flush incopy_user_pagetogether with the TLB patch from commit7139bc1579901b53db7e898789e916ee2fb52d78is what fixes the minifail bug.
Is this series expected to fix the thread related problems I see in the git testsuite?
Eike
Helge Deller
maintainerQuoted 14 lines
Von: Rolf Eike Beer <[email protected]>
Quoted 11 lines · Helge Deller
This is the first patch in a series of 4, with which the page cache flushing of
parisc will gets fixed and enhanced. This even fixes the nasty "minifail" bug
(http://wiki.parisc-linux.org/TestCases?highlight=%28minifail%29)
which
prevented parisc to stay an official debian port. Basically the flush incopy_user_pagetogether with the TLB patch from commit7139bc1579901b53db7e898789e916ee2fb52d78is what fixes the minifail bug.
Quoted 2 lines
Is this series expected to fix the thread related problems I see in the git testsuite?
I expect so, if not, please let us know!
If you want to test yourself, you may check out my "testing" branch from parisc-linux.git which includes all necessary patches:
https://git.kernel.org/?p=linux/kernel/git/deller/parisc-linux.git;a=shortlog;h=refs/heads/testing
Helge
Helge Deller
maintainerQuoted 14 lines
Quoted 14 lines
Von: Rolf Eike Beer <[email protected]>
Quoted 11 lines · Helge Deller
This is the first patch in a series of 4, with which the page cache flushing of
parisc will gets fixed and enhanced. This even fixes the nasty "minifail" bug
(http://wiki.parisc-linux.org/TestCases?highlight=%28minifail%29)
which
prevented parisc to stay an official debian port. Basically the flush incopy_user_pagetogether with the TLB patch from commit7139bc1579901b53db7e898789e916ee2fb52d78is what fixes the minifail bug.
Quoted 4 lines
Quoted 2 lines
Is this series expected to fix the thread related problems I see in the git testsuite?
I expect so, if not, please let us know!
Ahem... actually:
MAYBE!!!
The problem is, that you probably will need an updated glibc (and maybe compiler) as well. Dave has done a lot of work to fix stuff. We have copied the most important update-packages to ftp.parisc-linux.org. To update, just make sure the following lines are in your /etc/apt/source.list file:
deb ftp://ftp.de.debian.org/debian-ports unstable main
deb ftp://ftp.parisc-linux.org/debian-ports/unstable unstable main
deb-src ftp://ftp.de.debian.org/debian unstable main
Do *not* just update to the packages of debian-ports.org. If you do that it will render your system unbootable, since the udev-package is broken and it will not find your discs at startup.
It's on my todo-list to upload further packages, update the website on how to update your system, and of course to get a buildd working...
Helge
Quoted 19 lines · Helge Deller
Quoted 13 lines
Quoted 13 lines
Von: Rolf Eike Beer <[email protected]>
Quoted 11 lines · Helge Deller
This is the first patch in a series of 4, with which the page cache flushing of
parisc will gets fixed and enhanced. This even fixes the nasty "minifail" bug
(http://wiki.parisc-linux.org/TestCases?highlight=%28minifail%29)
which
prevented parisc to stay an official debian port. Basically the flush incopy_user_pagetogether with the TLB patch from commit7139bc1579901b53db7e898789e916ee2fb52d78is what fixes the minifail bug.Quoted 3 lines
Quoted 2 lines
Is this series expected to fix the thread related problems I see in the git testsuite?
I expect so, if not, please let us know!
Ahem... actually:
MAYBE!!!
Quoted 8 lines
The problem is, that you probably will need an updated glibc (and maybe compiler) as well. Dave has done a lot of work to fix stuff. We have copied the most important update-packages to ftp.parisc-linux.org. To update, just make sure the following lines are in your
/etc/apt/source.listfile:
deb ftp://ftp.de.debian.org/debian-ports unstable main
deb ftp://ftp.parisc-linux.org/debian-ports/unstable unstable main
deb-src ftp://ftp.de.debian.org/debian unstable mainDo *not* just update to the packages of debian-ports.org. If you do that it will render your system unbootable, since the udev-package is broken and it will not find your discs at startup.
It's on my todo-list to upload further packages, update the website on how to update your system, and of course to get a buildd working...
Just a note, these packages are for debian systems. I believe that Eike is running gentoo. With respect to glibc, Carlos had a set of changes which I submitted to Debian. The full set was accepted around the -30 unstable release. I think most of these are in gentoo but the matter needs review.
Dave
Signature · 1 line
John David Anglin [email protected]
Quoted 37 lines · John David Anglin
Quoted 36 lines · Helge Deller
Quoted 15 lines
Quoted 15 lines
Von: Rolf Eike Beer <[email protected]>
Quoted 11 lines · Helge Deller
This is the first patch in a series of 4, with which the page cache flushing of
parisc will gets fixed and enhanced. This even fixes the nasty "minifail" bug
(http://wiki.parisc-linux.org/TestCases?highlight=%28minifail%29)
which
prevented parisc to stay an official debian port. Basically the flush incopy_user_pagetogether with the TLB patch from commit7139bc1579901b53db7e898789e916ee2fb52d78is what fixes the minifail bug.Quoted 4 lines
Quoted 2 lines
Is this series expected to fix the thread related problems I see in the git testsuite?
I expect so, if not, please let us know!
Ahem... actually:
MAYBE!!!The problem is, that you probably will need an updated glibc (and maybe compiler) as well. Dave has done a lot of work to fix stuff. We have copied the most important update-packages to ftp.parisc-linux.org. To update, just make sure the following lines are in your
/etc/apt/source.listfile: deb ftp://ftp.de.debian.org/debian-ports unstable main
deb ftp://ftp.parisc-linux.org/debian-ports/unstable unstable main deb-src ftp://ftp.de.debian.org/debian unstable mainDo *not* just update to the packages of debian-ports.org. If you do that it will render your system unbootable, since the udev-package is broken and it will not find your discs at startup.
Quoted 7 lines
Quoted 2 lines
It's on my todo-list to upload further packages, update the website on how to update your system, and of course to get a buildd working...
Just a note, these packages are for debian systems. I believe that Eike is running gentoo. With respect to glibc, Carlos had a set of changes which I submitted to Debian. The full set was accepted around the -30 unstable release.
I think most of these are in gentoo but the matter needs review.
Oh Dave, I wanted to write a mail with "apt-get: no such command" or something ;) I have tested your patchset you sent on 2012-12-31 and it fixed my git issues. So it simply boils down to: is everything from that patchset now in Helge's tree?
Eike
Quoted 42 lines · Rolf Eike Beer
Quoted 34 lines · John David Anglin
Quoted 33 lines · Helge Deller
Quoted 14 lines
Quoted 14 lines
Von: Rolf Eike Beer <[email protected]>
Quoted 11 lines · Helge Deller
This is the first patch in a series of 4, with which the page cache flushing of
parisc will gets fixed and enhanced. This even fixes the nasty "minifail" bug
(http://wiki.parisc-linux.org/TestCases?highlight=%28minifail%29)
which
prevented parisc to stay an official debian port. Basically the flush incopy_user_pagetogether with the TLB patch from commit7139bc1579901b53db7e898789e916ee2fb52d78is what fixes the minifail bug.Quoted 3 lines
Quoted 2 lines
Is this series expected to fix the thread related problems I see in the git testsuite?
I expect so, if not, please let us know!
Ahem... actually:
MAYBE!!!The problem is, that you probably will need an updated glibc (and maybe compiler) as well. Dave has done a lot of work to fix stuff. We have copied the most important update-packages to ftp.parisc-linux.org. To update, just make sure the following lines are in your
/etc/apt/source.listfile: deb ftp://ftp.de.debian.org/debian-ports unstable main
deb ftp://ftp.parisc-linux.org/debian-ports/unstable unstable main deb-src ftp://ftp.de.debian.org/debian unstable mainDo *not* just update to the packages of debian-ports.org. If you do that it will render your system unbootable, since the udev-package is broken and it will not find your discs at startup.
Quoted 7 lines
Quoted 2 lines
It's on my todo-list to upload further packages, update the website on how to update your system, and of course to get a buildd working...
Just a note, these packages are for debian systems. I believe that Eike is running gentoo. With respect to glibc, Carlos had a set of changes which I submitted to Debian. The full set was accepted around the -30 unstable release.
I think most of these are in gentoo but the matter needs review.
Quoted 4 lines
Oh Dave, I wanted to write a mail with "apt-get: no such command" or something ;) I have tested your patchset you sent on 2012-12-31 and it fixed my git issues. So it simply boils down to: is everything from that patchset now in Helge's tree?
Mostly. I believe there is still some stuff for entry.S and syscall.S that's not in the tree but I haven't checked. All the cache related changes are mow in Helge's tree plus some other changes.
Dave
Signature · 1 line
John David Anglin [email protected]
Quoted 37 lines · On Monday 04 February 2013 12:11:25 John David Anglin wrote:
Quoted 36 lines · Helge Deller
Quoted 15 lines
Quoted 15 lines
Von: Rolf Eike Beer <[email protected]>
Quoted 11 lines · Helge Deller
This is the first patch in a series of 4, with which the page cache flushing of
parisc will gets fixed and enhanced. This even fixes the nasty "minifail" bug
(http://wiki.parisc-linux.org/TestCases?highlight=%28minifail%29)
which
prevented parisc to stay an official debian port. Basically the flush incopy_user_pagetogether with the TLB patch from commit7139bc1579901b53db7e898789e916ee2fb52d78is what fixes the minifail bug.Quoted 4 lines
Quoted 2 lines
Is this series expected to fix the thread related problems I see in the git testsuite?
I expect so, if not, please let us know!
Ahem... actually:
MAYBE!!!The problem is, that you probably will need an updated glibc (and maybe compiler) as well. Dave has done a lot of work to fix stuff. We have copied the most important update-packages to ftp.parisc-linux.org. To update, just make sure the following lines are in your
/etc/apt/source.listfile: deb ftp://ftp.de.debian.org/debian-ports unstable main
deb ftp://ftp.parisc-linux.org/debian-ports/unstable unstable main deb-src ftp://ftp.de.debian.org/debian unstable mainDo *not* just update to the packages of debian-ports.org. If you do that it will render your system unbootable, since the udev-package is broken and it will not find your discs at startup.
Quoted 8 lines
Quoted 2 lines
It's on my todo-list to upload further packages, update the website on how to update your system, and of course to get a buildd working...
Just a note, these packages are for debian systems. I believe that Eike is running gentoo. With respect to glibc, Carlos had a set of changes which I submitted to Debian. The full set was accepted around the -30 unstable release.
I think most of these are in gentoo but the matter needs review.
afaik, Gentoo's glibc-2.17 should have all relevant fixes -mike