commit 7a9cdebdcc17e426fb5287e4a82db1dfe86339b2 upstream. Jann Horn points out that the vmacache_flush_all() function is not only potentially expensive, it's buggy too. It also happens to be entirely unnecessary, because the sequence number overflow case can be avoided by simply making the sequence number be 64-bit. That doesn't even grow the data structures in question, because the other adjacent fields are already 64-bit. So simplify the whole thing by just making the sequence number overflow case go away entirely, which gets rid of all the complications and makes the code faster too. Win-win. [ Oleg Nesterov points out that the VMACACHE_FULL_FLUSHES statistics also just goes away entirely with this ] Change-Id: Ib485c9f33638e844f2378a1ec376e64200d30fd2 Reported-by: Jann Horn <jannh@google.com> Suggested-by: Will Deacon <will.deacon@arm.com> Acked-by: Davidlohr Bueso <dave@stgolabs.net> Cc: Oleg Nesterov <oleg@redhat.com> Cc: stable@kernel.org Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Git-commit: 84580567f1f856d2c7a610273315852e345bc3ac Git-repo: https://android.googlesource.com/kernel/common/ Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
33 lines
883 B
C
33 lines
883 B
C
#ifndef __LINUX_VMACACHE_H
|
|
#define __LINUX_VMACACHE_H
|
|
|
|
#include <linux/sched.h>
|
|
#include <linux/mm.h>
|
|
|
|
/*
|
|
* Hash based on the page number. Provides a good hit rate for
|
|
* workloads with good locality and those with random accesses as well.
|
|
*/
|
|
#define VMACACHE_HASH(addr) ((addr >> PAGE_SHIFT) & VMACACHE_MASK)
|
|
|
|
static inline void vmacache_flush(struct task_struct *tsk)
|
|
{
|
|
memset(tsk->vmacache, 0, sizeof(tsk->vmacache));
|
|
}
|
|
|
|
extern void vmacache_update(unsigned long addr, struct vm_area_struct *newvma);
|
|
extern struct vm_area_struct *vmacache_find(struct mm_struct *mm,
|
|
unsigned long addr);
|
|
|
|
#ifndef CONFIG_MMU
|
|
extern struct vm_area_struct *vmacache_find_exact(struct mm_struct *mm,
|
|
unsigned long start,
|
|
unsigned long end);
|
|
#endif
|
|
|
|
static inline void vmacache_invalidate(struct mm_struct *mm)
|
|
{
|
|
mm->vmacache_seqnum++;
|
|
}
|
|
|
|
#endif /* __LINUX_VMACACHE_H */
|