From: Ingo Molnar The attached patch, written by Andrew Morton, fixes long scheduling latencies in filemap_sync(). Has been tested as part of the -VP patchset. Signed-off-by: Ingo Molnar Signed-off-by: Andrew Morton --- 25-akpm/mm/msync.c | 29 +++++++++++++++++++++++++++-- 1 files changed, 27 insertions(+), 2 deletions(-) diff -puN mm/msync.c~sched-mm-fix-scheduling-latencies-in-filemap_sync mm/msync.c --- 25/mm/msync.c~sched-mm-fix-scheduling-latencies-in-filemap_sync Wed Nov 3 14:23:07 2004 +++ 25-akpm/mm/msync.c Wed Nov 3 14:23:07 2004 @@ -117,8 +117,8 @@ static inline int filemap_sync_pgd_range return error; } -static int filemap_sync(struct vm_area_struct * vma, unsigned long address, - size_t size, unsigned int flags) +static int __filemap_sync(struct vm_area_struct *vma, unsigned long address, + size_t size, unsigned int flags) { pml4_t *pml4; unsigned long end = address + size; @@ -161,6 +161,31 @@ static int filemap_sync(struct vm_area_s return error; } +#ifdef CONFIG_PREEMPT +static int filemap_sync(struct vm_area_struct *vma, unsigned long address, + size_t size, unsigned int flags) +{ + const size_t chunk = 64 * 1024; /* bytes */ + int error = 0; + + while (size) { + size_t sz = min(size, chunk); + + error |= __filemap_sync(vma, address, sz, flags); + cond_resched(); + address += sz; + size -= sz; + } + return error; +} +#else +static int filemap_sync(struct vm_area_struct *vma, unsigned long address, + size_t size, unsigned int flags) +{ + return __filemap_sync(vma, address, size, flags); +} +#endif + /* * MS_SYNC syncs the entire file - including mappings. * _