zfs: mmu: take vma_list_mutex before tearing down PT during ARC buffer eviction
Without the lock page mapping and buffer eviction can run in parallel which may cause following race: page mapper thread thread calling arc_evict() map_addr() { page = arc_get_page(); add_mapping(page, ptep); evict(page) { ptep = get_mapping(page); ptep.write(0); free(page); } ptep.write(page); } ARC code has no well defined order for taking its mutexes. It uses trylock() and skips a buffer if required locks cannot be acquired. This patch uses same approach for vma_list_mutex: if evicted buffer is shared try to lock vma_list_mutex and skip the buffer if this fails. Signed-off-by:Gleb Natapov <gleb@cloudius-systems.com> Signed-off-by:
Avi Kivity <avi@cloudius-systems.com>
Showing
- bsd/porting/mmu.cc 14 additions, 0 deletionsbsd/porting/mmu.cc
- bsd/porting/mmu.h 3 additions, 0 deletionsbsd/porting/mmu.h
- bsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c 11 additions, 4 deletionsbsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
- core/mmu.cc 1 addition, 0 deletionscore/mmu.cc
Loading
Please register or sign in to comment