Message ID | 20130203225909.GA14573@p100.box (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Need to mention here: Author of this patch series is: Author: John David Anglin <dave.anglin@bell.net> When I sent the mail the "Author" tag vanished in the mail header... Helge On 02/03/2013 11:59 PM, Helge Deller wrote: > 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. > > Signed-off-by: John David Anglin <dave.anglin@bell.net> > Signed-off-by: Helge Deller <deller@gmx.de> > > > diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h > index 4e0e7db..d9812d8 100644 > --- a/arch/parisc/include/asm/page.h > +++ b/arch/parisc/include/asm/page.h > @@ -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.. > > diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c > index b89a85a..703ed48 100644 > --- a/arch/parisc/kernel/cache.c > +++ b/arch/parisc/kernel/cache.c > @@ -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); > } > diff --git a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c > index ceec85d..6795dc6 100644 > --- a/arch/parisc/kernel/parisc_ksyms.c > +++ b/arch/parisc/kernel/parisc_ksyms.c > @@ -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); > -- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Sun, Feb 3, 2013 at 3:04 PM, Helge Deller <deller@gmx.de> wrote: > Need to mention here: > > Author of this patch series is: > Author: John David Anglin <dave.anglin@bell.net> > > 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. -- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Helge Deller wrote: > 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. Is this series expected to fix the thread related problems I see in the git testsuite? Eike -- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> Von: Rolf Eike Beer <eike-kernel@sf-tec.de> > Helge Deller wrote: > > 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. > > 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 -- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> > Von: Rolf Eike Beer <eike-kernel@sf-tec.de> > > Helge Deller wrote: > > > 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. > > > > 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 -- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 2/4/2013 11:37 AM, Helge Deller wrote: >>> Von: Rolf Eike Beer <eike-kernel@sf-tec.de> >>> Helge Deller wrote: >>>> 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. >>> 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... 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
John David Anglin wrote: > On 2/4/2013 11:37 AM, Helge Deller wrote: > >>> Von: Rolf Eike Beer <eike-kernel@sf-tec.de> > >>> > >>> Helge Deller wrote: > >>>> 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. > >>> > >>> 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... > 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
On 2/4/2013 12:57 PM, Rolf Eike Beer wrote: > John David Anglin wrote: >> On 2/4/2013 11:37 AM, Helge Deller wrote: >>>>> Von: Rolf Eike Beer <eike-kernel@sf-tec.de> >>>>> >>>>> Helge Deller wrote: >>>>>> 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. >>>>> 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... >> 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? 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
On Monday 04 February 2013 12:11:25 John David Anglin wrote: > On 2/4/2013 11:37 AM, Helge Deller wrote: > >>> Von: Rolf Eike Beer <eike-kernel@sf-tec.de> > >>> > >>> Helge Deller wrote: > >>>> 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. > >>> > >>> 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... > > 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
diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h index 4e0e7db..d9812d8 100644 --- a/arch/parisc/include/asm/page.h +++ b/arch/parisc/include/asm/page.h @@ -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.. diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index b89a85a..703ed48 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c @@ -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); } diff --git a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c index ceec85d..6795dc6 100644 --- a/arch/parisc/kernel/parisc_ksyms.c +++ b/arch/parisc/kernel/parisc_ksyms.c @@ -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);