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

Reply via email to