On Fri, 19 May 2017, Xishi Qiu wrote: > On 2017/5/19 16:52, Xishi Qiu wrote: > > On 2017/5/18 17:46, Xishi Qiu wrote: > > > >> Hi, my system triggers this bug, and the vmcore shows the anon_vma seems be freed. > >> The kernel is RHEL 7.2, and the bug is hard to reproduce, so I don't know if it > >> exists in mainline, any reply is welcome! > >> > > > > When we alloc anon_vma, we will init the value of anon_vma->root, > > so can we set anon_vma->root to NULL when calling > > anon_vma_free -> kmem_cache_free(anon_vma_cachep, anon_vma); > > > > anon_vma_free() > > ... > > anon_vma->root = NULL; > > kmem_cache_free(anon_vma_cachep, anon_vma); > > > > I find if we do this above, system boot failed, why? > > > > If anon_vma was freed, we should not to access the root_anon_vma, because it maybe also > freed(e.g. anon_vma == root_anon_vma), right? > > page_lock_anon_vma_read() > ... > anon_vma = (struct anon_vma *) (anon_mapping - PAGE_MAPPING_ANON); > root_anon_vma = ACCESS_ONCE(anon_vma->root); > if (down_read_trylock(&root_anon_vma->rwsem)) { // it's not safe > ... > if (!atomic_inc_not_zero(&anon_vma->refcount)) { // check anon_vma was not freed > ... > anon_vma_lock_read(anon_vma); // it's safe > ... You're ignoring the rcu_read_lock() on entry to page_lock_anon_vma_read(), and the SLAB_DESTROY_BY_RCU (recently renamed SLAB_TYPESAFE_BY_RCU) nature of the anon_vma_cachep kmem cache. It is not safe to muck with anon_vma-> root in anon_vma_free(), others could still be looking at it. Hugh -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>