[kernel] r8091 - in dists/sid/linux-2.6/debian: . patches/bugfix
patches/series
Martin Michlmayr
tbm at alioth.debian.org
Thu Jan 4 20:28:48 CET 2007
Author: tbm
Date: Thu Jan 4 20:28:47 2007
New Revision: 8091
Added:
dists/sid/linux-2.6/debian/patches/bugfix/flush_anon_page-arm.patch
dists/sid/linux-2.6/debian/patches/bugfix/flush_anon_page-generic.patch
Modified:
dists/sid/linux-2.6/debian/changelog
dists/sid/linux-2.6/debian/patches/series/9
Log:
arm: Implement flush_anon_page(), which is needed for FUSE
(closes: #402876) and possibly dm-crypt/LUKS (see #403426).
Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog (original)
+++ dists/sid/linux-2.6/debian/changelog Thu Jan 4 20:28:47 2007
@@ -11,6 +11,8 @@
doesn't depend on the mm changes (closes: #394392).
* mips: provide pci_get_legacy_ide_irq needed by some IDE drivers
(see #404950).
+ * arm: Implement flush_anon_page(), which is needed for FUSE
+ (closes: #402876) and possibly dm-crypt/LUKS (see #403426).
[ Bastian Blank ]
* Bump ABI to 4.
Added: dists/sid/linux-2.6/debian/patches/bugfix/flush_anon_page-arm.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/flush_anon_page-arm.patch Thu Jan 4 20:28:47 2007
@@ -0,0 +1,85 @@
+On Sat, Dec 30, 2006 at 04:39:55PM +0000, Russell King wrote:
+> Given that no one has any outstanding issues with the following patch, I'm
+> going to ask akpm to put this into -mm, and shortly after (a week or so)
+> I'll submit it and the ARM flush_anon_page() patch to Linus for -rc to fix
+> ARM data corruption issues.
+
+And here's the flush_anon_page() part.
+
+Add flush_anon_page() for ARM, to avoid data corruption issues when using
+fuse or other subsystems using get_user_pages().
+
+Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
+
+diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c
+index 628348c..86dd204 100644
+--- a/arch/arm/mm/flush.c
++++ b/arch/arm/mm/flush.c
+@@ -202,3 +202,39 @@ #endif
+ }
+ }
+ EXPORT_SYMBOL(flush_dcache_page);
++
++/*
++ * Flush an anonymous page so that users of get_user_pages()
++ * can safely access the data. The expected sequence is:
++ *
++ * get_user_pages()
++ * -> flush_anon_page
++ * memcpy() to/from page
++ * if written to page, flush_dcache_page()
++ */
++void __flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
++{
++ /* VIPT non-aliasing caches need do nothing */
++ if (cache_is_vipt_nonaliasing())
++ return;
++
++ /*
++ * Write back and invalidate userspace mapping.
++ */
++ if (cache_is_vivt()) {
++ flush_cache_page(vma, vmaddr, page_to_pfn(page));
++ } else {
++ /*
++ * For aliasing VIPT, we can flush an alias of the
++ * userspace address only.
++ */
++ flush_pfn_alias(page_to_pfn(page), vmaddr);
++ }
++
++ /*
++ * Invalidate kernel mapping. No data should be contained
++ * in this mapping of the page. FIXME: this is overkill
++ * since we actually ask for a write-back and invalidate.
++ */
++ __cpuc_flush_dcache_page(page_address(page));
++}
+diff --git a/include/asm-arm/cacheflush.h b/include/asm-arm/cacheflush.h
+index 378a3a2..506ef15 100644
+--- a/include/asm-arm/cacheflush.h
++++ b/include/asm-arm/cacheflush.h
+@@ -355,6 +355,16 @@ #define clean_dcache_area(start,size) cp
+ */
+ extern void flush_dcache_page(struct page *);
+
++#define ARCH_HAS_FLUSH_ANON_PAGE
++static inline void flush_anon_page(struct vm_area_struct *vma,
++ struct page *page, unsigned long vmaddr)
++{
++ extern void __flush_anon_page(struct vm_area_struct *vma,
++ struct page *, unsigned long);
++ if (PageAnon(page))
++ __flush_anon_page(vma, page, vmaddr);
++}
++
+ #define flush_dcache_mmap_lock(mapping) \
+ write_lock_irq(&(mapping)->tree_lock)
+ #define flush_dcache_mmap_unlock(mapping) \
+
+
+--
+Russell King
+ Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
+ maintainer of:
+
Added: dists/sid/linux-2.6/debian/patches/bugfix/flush_anon_page-generic.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/flush_anon_page-generic.patch Thu Jan 4 20:28:47 2007
@@ -0,0 +1,103 @@
+Given that no one has any outstanding issues with the following patch, I'm
+going to ask akpm to put this into -mm, and shortly after (a week or so)
+I'll submit it and the ARM flush_anon_page() patch to Linus for -rc to fix
+ARM data corruption issues.
+
+If anyone _does_ have a problem, holler ASAP.
+
+On Thu, Dec 21, 2006 at 05:17:39PM +0000, Russell King wrote:
+> On Thu, Dec 21, 2006 at 04:53:56PM +0100, Miklos Szeredi wrote:
+> > Yes, note the flush_dcache_page() call in fuse_copy_finish(). That
+> > could be replaced by the flush_kernel_dcache_page() (added by James
+> > Bottomley together with flush_anon_page()) when all relevant
+> > architectures have defined it.
+>
+> I should say that flush_anon_page() in its current form is going to be
+> problematic for ARM. It is passed:
+>
+> 1. the struct page
+> 2. the virtual address in process memory for the page
+>
+> It is not passed the mm or vma. This means that we have no idea whether
+> the virtual address is in the currently mapped VM space or not. The
+> common use of get_area_pages() is to get pages from other address
+> spaces.
+>
+> If we use the supplied virtual address to perform cache maintainence of
+> the userspace mapping, we might end up hitting a completely different
+> processes address space, which may contain some page sensitive to such
+> operations, or may not contain any page and thereby could cause a page
+> fault on some ARM CPUs.
+>
+> Hence, I first need something like this patch so I can tell if the
+> page to be flushed is in the current VMs address space or not:
+
+diff --git a/Documentation/cachetlb.txt b/Documentation/cachetlb.txt
+index 73e794f..920d0f6 100644
+--- a/Documentation/cachetlb.txt
++++ b/Documentation/cachetlb.txt
+@@ -373,7 +373,8 @@ maps this page at its virtual address.
+ likely that you will need to flush the instruction cache
+ for copy_to_user_page().
+
+- void flush_anon_page(struct page *page, unsigned long vmaddr)
++ void flush_anon_page(struct vm_area_struct *vma, struct page *page,
++ unsigned long vmaddr)
+ When the kernel needs to access the contents of an anonymous
+ page, it calls this function (currently only
+ get_user_pages()). Note: flush_dcache_page() deliberately
+diff --git a/include/asm-parisc/cacheflush.h b/include/asm-parisc/cacheflush.h
+index aedb051..a799dd8 100644
+--- a/include/asm-parisc/cacheflush.h
++++ b/include/asm-parisc/cacheflush.h
+@@ -186,7 +186,7 @@ flush_cache_page(struct vm_area_struct *
+ }
+
+ static inline void
+-flush_anon_page(struct page *page, unsigned long vmaddr)
++flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
+ {
+ if (PageAnon(page))
+ flush_user_dcache_page(vmaddr);
+diff --git a/include/linux/highmem.h b/include/linux/highmem.h
+index ca9a602..645d440 100644
+--- a/include/linux/highmem.h
++++ b/include/linux/highmem.h
+@@ -8,7 +8,7 @@ #include <linux/uaccess.h>
+ #include <asm/cacheflush.h>
+
+ #ifndef ARCH_HAS_FLUSH_ANON_PAGE
+-static inline void flush_anon_page(struct page *page, unsigned long vmaddr)
++static inline void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
+ {
+ }
+ #endif
+diff --git a/mm/memory.c b/mm/memory.c
+index c00bac6..13970fe 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -1091,7 +1091,7 @@ int get_user_pages(struct task_struct *t
+ if (pages) {
+ pages[i] = page;
+
+- flush_anon_page(page, start);
++ flush_anon_page(vma, page, start);
+ flush_dcache_page(page);
+ }
+ if (vmas)
+
+
+> --
+> Russell King
+> Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
+> maintainer of:
+> -
+> To unsubscribe from this list: send the line "unsubscribe linux-arch" in
+> the body of a message to majordomo at vger.kernel.org
+> More majordomo info at http://vger.kernel.org/majordomo-info.html
+
+--
+Russell King
+ Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
+ maintainer of:
+
Modified: dists/sid/linux-2.6/debian/patches/series/9
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/9 (original)
+++ dists/sid/linux-2.6/debian/patches/series/9 Thu Jan 4 20:28:47 2007
@@ -43,3 +43,5 @@
+ features/sound-detect-ALC883.patch
+ features/tulip-dmfe-disable.patch
+ bugfix/ia64-hardcode-arch-script-output.patch
++ bugfix/flush_anon_page-generic.patch
++ bugfix/flush_anon_page-arm.patch
More information about the Kernel-svn-changes
mailing list