On (06/03/16 10:29), Sergey Senozhatsky wrote: > > if (allocstall == curr_allocstall && swap != 0) { > > if (!__collapse_huge_page_swapin(mm, vma, address, pmd)) { > > { > > : if (ret & VM_FAULT_RETRY) { > > : down_read(&mm->mmap_sem); > > : ^^^^^^^^^ > > oh... it's in a loop > > for (_address = address; _address < address + HPAGE_PMD_NR*PAGE_SIZE; > pte++, _address += PAGE_SIZE) { > ret = do_swap_page() > if (ret & VM_FAULT_RETRY) { > down_read(&mm->mmap_sem); > ^^^^^^^^^ > ... > } > } > > so there can be multiple sem->count++ in __collapse_huge_page_swapin(), > and you don't know how many sem->count-- you need to do later? is this > correct or am I hallucinating? No, I was wrong, sorry for the noise. it's getting unlocked in __collapse_huge_page_swapin() do_swap_page() lock_page_or_retry() if (flags & FAULT_FLAG_ALLOW_RETRY) up_read(&mm->mmap_sem); return VM_FAULT_RETRY -ss -- 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>