FOLL_NOWAIT and get_user_pages_unlocked
Subsystems (2)
cover FOLL_NOWAIT and get_user_pages_unlocked
Hello,
KVM is hanging on postcopy live migration.
David tracked it down to commit ce53053ce378c21e7ffc45241fd67d6ee79daa2b and the problem is pretty obvious then.
Either we teach get_user_pages_locked/unlocked to handle FOLL_NOWAIT (so faultin_nopage works right even when the nonblocking pointer is not NULL) or we need to revert part of commit ce53053ce378c21e7ffc45241fd67d6ee79daa2b and keep using FOLL_NOWAIT only as parameter to get_user_pages (which won't ever set nonblocking pointer to non-NULL). I suppose the former approach is preferred to be more robust.
Thanks,
Andrea
Andrea Arcangeli (1):
mm: gup: teach get_user_pages_unlocked to handle FOLL_NOWAIT
mm/gup.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 1/1 mm: gup: teach get_user_pages_unlocked to handle FOLL_NOWAIT
KVM is hanging during postcopy live migration with userfaultfd because get_user_pages_unlocked is not capable to handle FOLL_NOWAIT.
Earlier FOLL_NOWAIT was only ever passed to get_user_pages.
Specifically faultin_page (the callee of get_user_pages_unlocked caller) doesn't know that if FAULT_FLAG_RETRY_NOWAIT was set in the page fault flags, when VM_FAULT_RETRY is returned, the mmap_sem wasn't actually released (even if nonblocking is not NULL). So it sets *nonblocking to zero and the caller won't release the mmap_sem thinking it was already released, but it wasn't because of FOLL_NOWAIT.
--- mm/gup.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
mm/gup.c +5 -2
@@ -516,7 +516,7 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, }if (ret &VM_FAULT_RETRY ) { -if (nonblocking) +if (nonblocking && !(fault_flags &FAULT_FLAG_RETRY_NOWAIT )) *nonblocking =0 ;return -EBUSY ; }
@@ -890,7 +890,10 @@ static __always_inline long __get_user_pages_locked(struct task_struct *tsk,break ; }if (*locked) { -/* VM_FAULT_RETRY didn't trigger */ +/* +* VM_FAULT_RETRY didn't trigger or it was a +* FOLL_NOWAIT. +*/ if (!pages_done) pages_done = ret;break ;
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Andrew Morton
maintainerRe: [PATCH 1/1] mm: gup: teach get_user_pages_unlocked to handle FOLL_NOWAIT
Quoted 13 lines · On Fri, 2 Mar 2018 18:43:43 +0100 Andrea Arcangeli <[email protected]> wrote:
KVM is hanging during postcopy live migration with userfaultfd because
get_user_pages_unlockedis not capable to handleFOLL_NOWAIT.Earlier
FOLL_NOWAITwas only ever passed toget_user_pages.Specifically
faultin_page(the callee ofget_user_pages_unlockedcaller) doesn't know that ifFAULT_FLAG_RETRY_NOWAITwas set in the page fault flags, whenVM_FAULT_RETRYis returned, themmap_semwasn't actually released (even if nonblocking is not NULL). So it sets *nonblocking to zero and the caller won't release themmap_semthinking it was already released, but it wasn't because ofFOLL_NOWAIT.
Quoted 3 lines
Reported-by Dr. David Alan Gilbert <[email protected]>Signed-off-by Andrea Arcangeli <[email protected]>
I added
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>