kernel: remove full cache flush in fuse_copy_do() for MIPS
This patch was introduced in commit r16412 for the brcm47xx target only and then moved to generic in commit r32395. It was initially added because of ticket #5186 and should fix some problems with fuse file systems and MIPS caches. The commit comment in r32395 says that this a generic problem in MIPS CPUs, but does not name any specifics about that. There was a fix added to kernel 2.6.21 in commit commit 7575a49f20 "[MIPS] Implement flush_anon_page()." that should fix this problem, but that was already available before both commits were done to OpenWrt. I just tested fuse with ntfs.3g without this patch on a BCM4704 (BMIPS3300 V0.6) SoC and haven't seen any problems. Someone reported that removing this patch improves some fuse operations by 5 times on some modern MIPS cores. My test was only a simple "dd if=/dev/zero of=/mnt/zero bs=5000" to an USB stick. This patch removes the patch to OpenWrt, because I assume that it is not needed any more and Felix, the orginal author, also thinks so. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
parent
2abb02419d
commit
bf32177a1d
4 changed files with 1 additions and 97 deletions
|
@ -1,32 +0,0 @@
|
||||||
--- a/arch/mips/mm/cache.c
|
|
||||||
+++ b/arch/mips/mm/cache.c
|
|
||||||
@@ -38,6 +38,7 @@ void (*__flush_cache_vunmap)(void);
|
|
||||||
|
|
||||||
void (*__flush_kernel_vmap_range)(unsigned long vaddr, int size);
|
|
||||||
EXPORT_SYMBOL_GPL(__flush_kernel_vmap_range);
|
|
||||||
+EXPORT_SYMBOL(__flush_cache_all);
|
|
||||||
void (*__invalidate_kernel_vmap_range)(unsigned long vaddr, int size);
|
|
||||||
|
|
||||||
/* MIPS specific cache operations */
|
|
||||||
--- a/fs/fuse/dev.c
|
|
||||||
+++ b/fs/fuse/dev.c
|
|
||||||
@@ -20,6 +20,9 @@
|
|
||||||
#include <linux/swap.h>
|
|
||||||
#include <linux/splice.h>
|
|
||||||
#include <linux/aio.h>
|
|
||||||
+#ifdef CONFIG_MIPS
|
|
||||||
+#include <asm/cacheflush.h>
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
MODULE_ALIAS_MISCDEV(FUSE_MINOR);
|
|
||||||
MODULE_ALIAS("devname:fuse");
|
|
||||||
@@ -749,6 +752,9 @@ static int fuse_copy_fill(struct fuse_co
|
|
||||||
static int fuse_copy_do(struct fuse_copy_state *cs, void **val, unsigned *size)
|
|
||||||
{
|
|
||||||
unsigned ncpy = min(*size, cs->len);
|
|
||||||
+#ifdef CONFIG_MIPS
|
|
||||||
+ __flush_cache_all();
|
|
||||||
+#endif
|
|
||||||
if (val) {
|
|
||||||
void *pgaddr = kmap_atomic(cs->pg);
|
|
||||||
void *buf = pgaddr + cs->offset;
|
|
|
@ -1,32 +0,0 @@
|
||||||
--- a/arch/mips/mm/cache.c
|
|
||||||
+++ b/arch/mips/mm/cache.c
|
|
||||||
@@ -38,6 +38,7 @@ void (*__flush_cache_vunmap)(void);
|
|
||||||
|
|
||||||
void (*__flush_kernel_vmap_range)(unsigned long vaddr, int size);
|
|
||||||
EXPORT_SYMBOL_GPL(__flush_kernel_vmap_range);
|
|
||||||
+EXPORT_SYMBOL(__flush_cache_all);
|
|
||||||
void (*__invalidate_kernel_vmap_range)(unsigned long vaddr, int size);
|
|
||||||
|
|
||||||
/* MIPS specific cache operations */
|
|
||||||
--- a/fs/fuse/dev.c
|
|
||||||
+++ b/fs/fuse/dev.c
|
|
||||||
@@ -19,6 +19,9 @@
|
|
||||||
#include <linux/pipe_fs_i.h>
|
|
||||||
#include <linux/swap.h>
|
|
||||||
#include <linux/splice.h>
|
|
||||||
+#ifdef CONFIG_MIPS
|
|
||||||
+#include <asm/cacheflush.h>
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
MODULE_ALIAS_MISCDEV(FUSE_MINOR);
|
|
||||||
MODULE_ALIAS("devname:fuse");
|
|
||||||
@@ -816,6 +819,9 @@ static int fuse_copy_fill(struct fuse_co
|
|
||||||
static int fuse_copy_do(struct fuse_copy_state *cs, void **val, unsigned *size)
|
|
||||||
{
|
|
||||||
unsigned ncpy = min(*size, cs->len);
|
|
||||||
+#ifdef CONFIG_MIPS
|
|
||||||
+ __flush_cache_all();
|
|
||||||
+#endif
|
|
||||||
if (val) {
|
|
||||||
void *pgaddr = kmap_atomic(cs->pg);
|
|
||||||
void *buf = pgaddr + cs->offset;
|
|
|
@ -1,32 +0,0 @@
|
||||||
--- a/arch/mips/mm/cache.c
|
|
||||||
+++ b/arch/mips/mm/cache.c
|
|
||||||
@@ -39,6 +39,7 @@ void (*__flush_cache_vunmap)(void);
|
|
||||||
|
|
||||||
void (*__flush_kernel_vmap_range)(unsigned long vaddr, int size);
|
|
||||||
EXPORT_SYMBOL_GPL(__flush_kernel_vmap_range);
|
|
||||||
+EXPORT_SYMBOL(__flush_cache_all);
|
|
||||||
void (*__invalidate_kernel_vmap_range)(unsigned long vaddr, int size);
|
|
||||||
|
|
||||||
/* MIPS specific cache operations */
|
|
||||||
--- a/fs/fuse/dev.c
|
|
||||||
+++ b/fs/fuse/dev.c
|
|
||||||
@@ -19,6 +19,9 @@
|
|
||||||
#include <linux/pipe_fs_i.h>
|
|
||||||
#include <linux/swap.h>
|
|
||||||
#include <linux/splice.h>
|
|
||||||
+#ifdef CONFIG_MIPS
|
|
||||||
+#include <asm/cacheflush.h>
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
MODULE_ALIAS_MISCDEV(FUSE_MINOR);
|
|
||||||
MODULE_ALIAS("devname:fuse");
|
|
||||||
@@ -802,6 +805,9 @@ static int fuse_copy_fill(struct fuse_co
|
|
||||||
static int fuse_copy_do(struct fuse_copy_state *cs, void **val, unsigned *size)
|
|
||||||
{
|
|
||||||
unsigned ncpy = min(*size, cs->len);
|
|
||||||
+#ifdef CONFIG_MIPS
|
|
||||||
+ __flush_cache_all();
|
|
||||||
+#endif
|
|
||||||
if (val) {
|
|
||||||
void *pgaddr = kmap_atomic(cs->pg);
|
|
||||||
void *buf = pgaddr + cs->offset;
|
|
|
@ -441,7 +441,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||||
{
|
{
|
||||||
--- a/arch/mips/mm/cache.c
|
--- a/arch/mips/mm/cache.c
|
||||||
+++ b/arch/mips/mm/cache.c
|
+++ b/arch/mips/mm/cache.c
|
||||||
@@ -60,6 +60,8 @@ void (*_dma_cache_wback)(unsigned long s
|
@@ -59,6 +59,8 @@ void (*_dma_cache_wback)(unsigned long s
|
||||||
void (*_dma_cache_inv)(unsigned long start, unsigned long size);
|
void (*_dma_cache_inv)(unsigned long start, unsigned long size);
|
||||||
|
|
||||||
EXPORT_SYMBOL(_dma_cache_wback_inv);
|
EXPORT_SYMBOL(_dma_cache_wback_inv);
|
||||||
|
|
Loading…
Reference in a new issue