Re: mlockall(MCL_CURRENT) blocking infinitely

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Here's one more dmesg output with more information captured in
__get_user_pages() as well. It basically confirms that
handle_mm_fault() returns VM_FAULT_RETRY.

I'm not sure where and what to change ("fix with a FOLL_TRIED
somewhere") to make it work. My (uneducated) impression is, that only
__get_user_pages() needs to be changed - but I might be wrong.

On Tue, 2019-11-05 at 21:05 +0100, Robert Stupp wrote:
> On Tue, 2019-11-05 at 13:22 -0500, Johannes Weiner wrote:
> > Judging from Robert's stack captures, the task is not hung but
> > busy-looping in __mm_populate(). AFAICS, the only way this can
> > occur
> > is if populate_vma_page_range() returns 0 and we don't advance the
> > iteration position (if it returned an error, we wouldn't reset nend
> > and move on to the next vma as ignore_errors is 1 for mlockall.)
> >
> > populate_vma_page_range() returns 0 when the first page is not
> > found
> > and faultin_page() returns -EBUSY (if it were processing pages, or
> > if
> > the error from faultin_page() would be a different one, we would
> > return the number of pages processed or -error).
> >
> > faultin_page() returns -EBUSY when VM_FAULT_RETRY is set, i.e. we
> > dropped the mmap_sem in order to initiate IO and require a retry.
> > That
> > is consistent with the bisect result (new VM_FAULT_RETRY
> > conditions).
> >
> > At this point, regular page fault would retry with FAULT_FLAG_TRIED
> > to
> > indicate that the mmap_sem cannot be dropped a second time. But
> > this
> > mlock path doesn't set that flag and we can loop repeatedly. That
> > is
> > something we probably need to fix with a FOLL_TRIED somewhere.
> >
> > What I don't quite understand yet is why the fault path doesn't
> > make
> > progress eventually. We must drop the mmap_sem without changing the
> > state in any way. How can we keep looping on the same page?
>
> I've played a bit around by adding some `printk` messages (see
> attached
> patch) and found exactly what you describe: it's busy-looping in
> __mm_populate(), because populate_vma_page_range returns 0.
>
> However, there's a slightly interesting thing in there. Before it
> loops
> forever, it processes
> 	nstart=5574d92e1000
> 	locked=1
> 	vma->vm_start=7f5e4bfec000
> 	vma->vm_end=  7f5e4c011000
> 	vma->vm_flags=8002071
> for which populate_vma_page_range() returns 1, then it processes this
> over and over again:
> 	nstart=7f5e4bfed000
> 	locked=0
> 	vma->vm_start=7f5e4bfec000  (same as before)
> 	vma->vm_end=  7f5e4c011000
> 	vma->vm_flags=8002071
> These are the additional dmesg messages with timestamp 105.x. At
> timestamp 106.x, I've hit ctrl-c (ret=-512).
>
> dmesg output with the patch applied (on top of the v5.3.8 git tag)
> attached.
>
[   84.533231] _mm_populate 0 7ffffffff000 7ffffffff000 1 ENTER
[   84.533235] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 0 0 0
[   84.533238] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=5626b4b8f000 vma->vm_end=5626b4b90000 vma->vm_flags=8002871
[   84.533240] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=5626b4b90000 7ffffffff000 5626b4b90000
[   84.533242] __get_user_pages start=5626b4b8f000 nr_pages=1 gup_flags=1052 ctx.page_mask=0
[   84.533243] __get_user_pages @1 vma==NULL
[   84.533245] __get_user_pages @2 start=5626b4b8f000 vma->vm_start=5626b4b8f000 vma->vm_end=5626b4b90000 vma->vm_flags=8002871
[   84.533250] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533251] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533253] __get_user_pages @10 i=1 start=5626b4b90000 nr_pages=0
[   84.533254] __get_user_pages LEAVE i=1 ret=0
[   84.533256] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-3 ret=1 nend=5626b4b90000
[   84.533258] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 5626b4b90000 1 0
[   84.533260] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=5626b4b90000 vma->vm_end=5626b4b91000 vma->vm_flags=8002875
[   84.533262] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=5626b4b91000 7ffffffff000 5626b4b91000
[   84.533263] __get_user_pages start=5626b4b90000 nr_pages=1 gup_flags=1052 ctx.page_mask=0
[   84.533264] __get_user_pages @1 vma==NULL
[   84.533266] __get_user_pages @2 start=5626b4b90000 vma->vm_start=5626b4b90000 vma->vm_end=5626b4b91000 vma->vm_flags=8002875
[   84.533268] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533269] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533270] __get_user_pages @10 i=1 start=5626b4b91000 nr_pages=0
[   84.533271] __get_user_pages LEAVE i=1 ret=0
[   84.533273] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-3 ret=1 nend=5626b4b91000
[   84.533275] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 5626b4b91000 1 0
[   84.533276] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=5626b4b91000 vma->vm_end=5626b4b92000 vma->vm_flags=8002871
[   84.533278] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=5626b4b92000 7ffffffff000 5626b4b92000
[   84.533280] __get_user_pages start=5626b4b91000 nr_pages=1 gup_flags=1052 ctx.page_mask=0
[   84.533280] __get_user_pages @1 vma==NULL
[   84.533282] __get_user_pages @2 start=5626b4b91000 vma->vm_start=5626b4b91000 vma->vm_end=5626b4b92000 vma->vm_flags=8002871
[   84.533284] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533285] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533286] __get_user_pages @10 i=1 start=5626b4b92000 nr_pages=0
[   84.533287] __get_user_pages LEAVE i=1 ret=0
[   84.533289] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-3 ret=1 nend=5626b4b92000
[   84.533290] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 5626b4b92000 1 0
[   84.533292] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=5626b4b92000 vma->vm_end=5626b4b93000 vma->vm_flags=8102871
[   84.533294] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=5626b4b93000 7ffffffff000 5626b4b93000
[   84.533295] __get_user_pages start=5626b4b92000 nr_pages=1 gup_flags=1052 ctx.page_mask=0
[   84.533296] __get_user_pages @1 vma==NULL
[   84.533298] __get_user_pages @2 start=5626b4b92000 vma->vm_start=5626b4b92000 vma->vm_end=5626b4b93000 vma->vm_flags=8102871
[   84.533300] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533301] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533302] __get_user_pages @10 i=1 start=5626b4b93000 nr_pages=0
[   84.533303] __get_user_pages LEAVE i=1 ret=0
[   84.533304] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-3 ret=1 nend=5626b4b93000
[   84.533306] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 5626b4b93000 1 0
[   84.533308] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=5626b4b93000 vma->vm_end=5626b4b94000 vma->vm_flags=8102873
[   84.533310] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=5626b4b94000 7ffffffff000 5626b4b94000
[   84.533311] __get_user_pages start=5626b4b93000 nr_pages=1 gup_flags=1053 ctx.page_mask=0
[   84.533312] __get_user_pages @1 vma==NULL
[   84.533313] __get_user_pages @2 start=5626b4b93000 vma->vm_start=5626b4b93000 vma->vm_end=5626b4b94000 vma->vm_flags=8102873
[   84.533315] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533316] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533317] __get_user_pages @10 i=1 start=5626b4b94000 nr_pages=0
[   84.533318] __get_user_pages LEAVE i=1 ret=0
[   84.533320] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-3 ret=1 nend=5626b4b94000
[   84.533322] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 5626b4b94000 1 0
[   84.533324] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=5626b5a54000 vma->vm_end=5626b5a75000 vma->vm_flags=8102073
[   84.533325] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=5626b5a75000 7ffffffff000 5626b5a75000
[   84.533327] __get_user_pages start=5626b5a54000 nr_pages=33 gup_flags=1053 ctx.page_mask=0
[   84.533328] __get_user_pages @1 vma==NULL
[   84.533329] __get_user_pages @2 start=5626b5a54000 vma->vm_start=5626b5a54000 vma->vm_end=5626b5a75000 vma->vm_flags=8102073
[   84.533331] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533332] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533333] __get_user_pages @10 i=1 start=5626b5a55000 nr_pages=32
[   84.533335] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533337] faultin_page handle_mm_fault --> ret = 0
[   84.533338] faultin_page-->0
[   84.533339] __get_user_pages @8 faultin_page --> 0
[   84.533341] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533342] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533343] __get_user_pages @10 i=2 start=5626b5a56000 nr_pages=31
[   84.533344] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533346] faultin_page handle_mm_fault --> ret = 0
[   84.533347] faultin_page-->0
[   84.533348] __get_user_pages @8 faultin_page --> 0
[   84.533349] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533350] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533351] __get_user_pages @10 i=3 start=5626b5a57000 nr_pages=30
[   84.533353] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533354] faultin_page handle_mm_fault --> ret = 0
[   84.533355] faultin_page-->0
[   84.533356] __get_user_pages @8 faultin_page --> 0
[   84.533357] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533358] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533360] __get_user_pages @10 i=4 start=5626b5a58000 nr_pages=29
[   84.533361] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533362] faultin_page handle_mm_fault --> ret = 0
[   84.533363] faultin_page-->0
[   84.533364] __get_user_pages @8 faultin_page --> 0
[   84.533366] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533366] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533368] __get_user_pages @10 i=5 start=5626b5a59000 nr_pages=28
[   84.533369] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533371] faultin_page handle_mm_fault --> ret = 0
[   84.533371] faultin_page-->0
[   84.533372] __get_user_pages @8 faultin_page --> 0
[   84.533374] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533374] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533376] __get_user_pages @10 i=6 start=5626b5a5a000 nr_pages=27
[   84.533377] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533379] faultin_page handle_mm_fault --> ret = 0
[   84.533379] faultin_page-->0
[   84.533380] __get_user_pages @8 faultin_page --> 0
[   84.533382] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533382] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533384] __get_user_pages @10 i=7 start=5626b5a5b000 nr_pages=26
[   84.533385] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533387] faultin_page handle_mm_fault --> ret = 0
[   84.533387] faultin_page-->0
[   84.533388] __get_user_pages @8 faultin_page --> 0
[   84.533390] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533391] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533392] __get_user_pages @10 i=8 start=5626b5a5c000 nr_pages=25
[   84.533393] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533395] faultin_page handle_mm_fault --> ret = 0
[   84.533396] faultin_page-->0
[   84.533397] __get_user_pages @8 faultin_page --> 0
[   84.533398] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533399] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533401] __get_user_pages @10 i=9 start=5626b5a5d000 nr_pages=24
[   84.533402] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533404] faultin_page handle_mm_fault --> ret = 0
[   84.533404] faultin_page-->0
[   84.533405] __get_user_pages @8 faultin_page --> 0
[   84.533407] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533408] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533409] __get_user_pages @10 i=10 start=5626b5a5e000 nr_pages=23
[   84.533410] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533412] faultin_page handle_mm_fault --> ret = 0
[   84.533413] faultin_page-->0
[   84.533414] __get_user_pages @8 faultin_page --> 0
[   84.533415] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533416] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533417] __get_user_pages @10 i=11 start=5626b5a5f000 nr_pages=22
[   84.533419] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533421] faultin_page handle_mm_fault --> ret = 0
[   84.533421] faultin_page-->0
[   84.533422] __get_user_pages @8 faultin_page --> 0
[   84.533424] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533425] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533426] __get_user_pages @10 i=12 start=5626b5a60000 nr_pages=21
[   84.533427] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533429] faultin_page handle_mm_fault --> ret = 0
[   84.533430] faultin_page-->0
[   84.533430] __get_user_pages @8 faultin_page --> 0
[   84.533432] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533433] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533434] __get_user_pages @10 i=13 start=5626b5a61000 nr_pages=20
[   84.533435] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533437] faultin_page handle_mm_fault --> ret = 0
[   84.533438] faultin_page-->0
[   84.533439] __get_user_pages @8 faultin_page --> 0
[   84.533440] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533441] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533442] __get_user_pages @10 i=14 start=5626b5a62000 nr_pages=19
[   84.533443] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533445] faultin_page handle_mm_fault --> ret = 0
[   84.533446] faultin_page-->0
[   84.533447] __get_user_pages @8 faultin_page --> 0
[   84.533448] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533449] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533451] __get_user_pages @10 i=15 start=5626b5a63000 nr_pages=18
[   84.533452] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533454] faultin_page handle_mm_fault --> ret = 0
[   84.533455] faultin_page-->0
[   84.533455] __get_user_pages @8 faultin_page --> 0
[   84.533457] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533458] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533459] __get_user_pages @10 i=16 start=5626b5a64000 nr_pages=17
[   84.533460] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533462] faultin_page handle_mm_fault --> ret = 0
[   84.533463] faultin_page-->0
[   84.533464] __get_user_pages @8 faultin_page --> 0
[   84.533465] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533466] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533467] __get_user_pages @10 i=17 start=5626b5a65000 nr_pages=16
[   84.533468] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533470] faultin_page handle_mm_fault --> ret = 0
[   84.533471] faultin_page-->0
[   84.533472] __get_user_pages @8 faultin_page --> 0
[   84.533473] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533474] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533476] __get_user_pages @10 i=18 start=5626b5a66000 nr_pages=15
[   84.533477] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533479] faultin_page handle_mm_fault --> ret = 0
[   84.533479] faultin_page-->0
[   84.533480] __get_user_pages @8 faultin_page --> 0
[   84.533482] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533483] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533484] __get_user_pages @10 i=19 start=5626b5a67000 nr_pages=14
[   84.533485] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533487] faultin_page handle_mm_fault --> ret = 0
[   84.533488] faultin_page-->0
[   84.533489] __get_user_pages @8 faultin_page --> 0
[   84.533490] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533491] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533492] __get_user_pages @10 i=20 start=5626b5a68000 nr_pages=13
[   84.533494] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533496] faultin_page handle_mm_fault --> ret = 0
[   84.533496] faultin_page-->0
[   84.533497] __get_user_pages @8 faultin_page --> 0
[   84.533499] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533500] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533501] __get_user_pages @10 i=21 start=5626b5a69000 nr_pages=12
[   84.533502] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533504] faultin_page handle_mm_fault --> ret = 0
[   84.533504] faultin_page-->0
[   84.533505] __get_user_pages @8 faultin_page --> 0
[   84.533507] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533508] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533509] __get_user_pages @10 i=22 start=5626b5a6a000 nr_pages=11
[   84.533510] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533512] faultin_page handle_mm_fault --> ret = 0
[   84.533512] faultin_page-->0
[   84.533513] __get_user_pages @8 faultin_page --> 0
[   84.533515] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533516] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533517] __get_user_pages @10 i=23 start=5626b5a6b000 nr_pages=10
[   84.533518] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533520] faultin_page handle_mm_fault --> ret = 0
[   84.533521] faultin_page-->0
[   84.533521] __get_user_pages @8 faultin_page --> 0
[   84.533523] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533524] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533525] __get_user_pages @10 i=24 start=5626b5a6c000 nr_pages=9
[   84.533526] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533528] faultin_page handle_mm_fault --> ret = 0
[   84.533529] faultin_page-->0
[   84.533530] __get_user_pages @8 faultin_page --> 0
[   84.533531] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533532] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533534] __get_user_pages @10 i=25 start=5626b5a6d000 nr_pages=8
[   84.533535] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533537] faultin_page handle_mm_fault --> ret = 0
[   84.533537] faultin_page-->0
[   84.533538] __get_user_pages @8 faultin_page --> 0
[   84.533540] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533541] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533542] __get_user_pages @10 i=26 start=5626b5a6e000 nr_pages=7
[   84.533543] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533545] faultin_page handle_mm_fault --> ret = 0
[   84.533545] faultin_page-->0
[   84.533546] __get_user_pages @8 faultin_page --> 0
[   84.533548] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533549] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533550] __get_user_pages @10 i=27 start=5626b5a6f000 nr_pages=6
[   84.533551] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533553] faultin_page handle_mm_fault --> ret = 0
[   84.533554] faultin_page-->0
[   84.533555] __get_user_pages @8 faultin_page --> 0
[   84.533557] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533558] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533559] __get_user_pages @10 i=28 start=5626b5a70000 nr_pages=5
[   84.533560] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533562] faultin_page handle_mm_fault --> ret = 0
[   84.533563] faultin_page-->0
[   84.533564] __get_user_pages @8 faultin_page --> 0
[   84.533565] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533566] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533567] __get_user_pages @10 i=29 start=5626b5a71000 nr_pages=4
[   84.533568] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533570] faultin_page handle_mm_fault --> ret = 0
[   84.533571] faultin_page-->0
[   84.533572] __get_user_pages @8 faultin_page --> 0
[   84.533573] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533574] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533576] __get_user_pages @10 i=30 start=5626b5a72000 nr_pages=3
[   84.533577] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533579] faultin_page handle_mm_fault --> ret = 0
[   84.533579] faultin_page-->0
[   84.533580] __get_user_pages @8 faultin_page --> 0
[   84.533582] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533583] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533584] __get_user_pages @10 i=31 start=5626b5a73000 nr_pages=2
[   84.533585] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533587] faultin_page handle_mm_fault --> ret = 0
[   84.533588] faultin_page-->0
[   84.533588] __get_user_pages @8 faultin_page --> 0
[   84.533590] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533591] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533592] __get_user_pages @10 i=32 start=5626b5a74000 nr_pages=1
[   84.533593] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533595] faultin_page handle_mm_fault --> ret = 0
[   84.533596] faultin_page-->0
[   84.533597] __get_user_pages @8 faultin_page --> 0
[   84.533598] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533599] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533600] __get_user_pages @10 i=33 start=5626b5a75000 nr_pages=0
[   84.533601] __get_user_pages LEAVE i=33 ret=0
[   84.533603] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-3 ret=33 nend=5626b5a75000
[   84.533605] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 5626b5a75000 1 0
[   84.533607] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e2be000 vma->vm_end=7f247e2e3000 vma->vm_flags=8002071
[   84.533608] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e2e3000 7ffffffff000 7f247e2e3000
[   84.533610] __get_user_pages start=7f247e2be000 nr_pages=37 gup_flags=1052 ctx.page_mask=0
[   84.533611] __get_user_pages @1 vma==NULL
[   84.533612] __get_user_pages @2 start=7f247e2be000 vma->vm_start=7f247e2be000 vma->vm_end=7f247e2e3000 vma->vm_flags=8002071
[   84.533613] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533617] faultin_page handle_mm_fault --> ret = 256
[   84.533618] faultin_page-->0
[   84.533619] __get_user_pages @8 faultin_page --> 0
[   84.533620] __get_user_pages @7 follow_page_mask --> 1  ctx.page_mask=0
[   84.533621] __get_user_pages @9 page_increm=1 ctx.page_mask=0
[   84.533622] __get_user_pages @10 i=1 start=7f247e2bf000 nr_pages=36
[   84.533624] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533627] faultin_page handle_mm_fault --> ret = 1024
[   84.533629] faultin_page-->EBUSY VM_FAULT_RETRY non-blocking?1 FAULT_FLAG_RETRY_NOWAIT?0
[   84.533630] __get_user_pages @8 faultin_page --> -16
[   84.533631] __get_user_pages LEAVE i=1 ret=0
[   84.533632] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-3 ret=1 nend=7f247e2bf000
[   84.533634] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e2bf000 0 0
[   84.533636] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e2be000 vma->vm_end=7f247e2e3000 vma->vm_flags=8002071
[   84.533638] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e2e3000 7ffffffff000 7f247e2e3000
[   84.533639] __get_user_pages start=7f247e2bf000 nr_pages=36 gup_flags=1052 ctx.page_mask=0
[   84.533640] __get_user_pages @1 vma==NULL
[   84.533642] __get_user_pages @2 start=7f247e2bf000 vma->vm_start=7f247e2be000 vma->vm_end=7f247e2e3000 vma->vm_flags=8002071
[   84.533643] __get_user_pages @7 follow_page_mask --> 0  ctx.page_mask=0
[   84.533646] faultin_page handle_mm_fault --> ret = 1024
[   84.533647] faultin_page-->EBUSY VM_FAULT_RETRY non-blocking?1 FAULT_FLAG_RETRY_NOWAIT?0
[   84.533648] __get_user_pages @8 faultin_page --> -16
[   84.533649] __get_user_pages LEAVE i=0 ret=0
[   84.533650] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-3 ret=0 nend=7f247e2bf000
[   94.274156] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e2e3000 1 0
[   94.274157] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e2e3000 vma->vm_end=7f247e45b000 vma->vm_flags=8002075
[   94.274158] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e45b000 7ffffffff000 7f247e45b000
[   94.274159] __get_user_pages start=7f247e2e3000 nr_pages=376 gup_flags=1052 ctx.page_mask=0
[   94.274159] __get_user_pages @1 vma==NULL
[   94.274160] __get_user_pages @2 start=7f247e2e3000 vma->vm_start=7f247e2e3000 vma->vm_end=7f247e45b000 vma->vm_flags=8002075
[   94.274161] __get_user_pages @6 ERESTARTSYS
[   94.274161] __get_user_pages LEAVE i=0 ret=-512
[   94.274162] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274162] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e45b000 1 0
[   94.274163] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e45b000 vma->vm_end=7f247e4a5000 vma->vm_flags=8002071
[   94.274164] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e4a5000 7ffffffff000 7f247e4a5000
[   94.274164] __get_user_pages start=7f247e45b000 nr_pages=74 gup_flags=1052 ctx.page_mask=0
[   94.274164] __get_user_pages @1 vma==NULL
[   94.274165] __get_user_pages @2 start=7f247e45b000 vma->vm_start=7f247e45b000 vma->vm_end=7f247e4a5000 vma->vm_flags=8002071
[   94.274165] __get_user_pages @6 ERESTARTSYS
[   94.274166] __get_user_pages LEAVE i=0 ret=-512
[   94.274166] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274167] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e4a5000 1 0
[   94.274167] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e4a5000 vma->vm_end=7f247e4a8000 vma->vm_flags=8102071
[   94.274168] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e4a8000 7ffffffff000 7f247e4a8000
[   94.274168] __get_user_pages start=7f247e4a5000 nr_pages=3 gup_flags=1052 ctx.page_mask=0
[   94.274169] __get_user_pages @1 vma==NULL
[   94.274169] __get_user_pages @2 start=7f247e4a5000 vma->vm_start=7f247e4a5000 vma->vm_end=7f247e4a8000 vma->vm_flags=8102071
[   94.274170] __get_user_pages @6 ERESTARTSYS
[   94.274170] __get_user_pages LEAVE i=0 ret=-512
[   94.274170] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274171] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e4a8000 1 0
[   94.274171] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e4a8000 vma->vm_end=7f247e4ab000 vma->vm_flags=8102073
[   94.274172] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e4ab000 7ffffffff000 7f247e4ab000
[   94.274172] __get_user_pages start=7f247e4a8000 nr_pages=3 gup_flags=1053 ctx.page_mask=0
[   94.274173] __get_user_pages @1 vma==NULL
[   94.274173] __get_user_pages @2 start=7f247e4a8000 vma->vm_start=7f247e4a8000 vma->vm_end=7f247e4ab000 vma->vm_flags=8102073
[   94.274174] __get_user_pages @6 ERESTARTSYS
[   94.274174] __get_user_pages LEAVE i=0 ret=-512
[   94.274174] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274175] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e4ab000 1 0
[   94.274175] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e4ab000 vma->vm_end=7f247e4b1000 vma->vm_flags=8102073
[   94.274176] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e4b1000 7ffffffff000 7f247e4b1000
[   94.274176] __get_user_pages start=7f247e4ab000 nr_pages=6 gup_flags=1053 ctx.page_mask=0
[   94.274177] __get_user_pages @1 vma==NULL
[   94.274177] __get_user_pages @2 start=7f247e4ab000 vma->vm_start=7f247e4ab000 vma->vm_end=7f247e4b1000 vma->vm_flags=8102073
[   94.274177] __get_user_pages @6 ERESTARTSYS
[   94.274178] __get_user_pages LEAVE i=0 ret=-512
[   94.274178] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274179] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e4b1000 1 0
[   94.274179] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e4dc000 vma->vm_end=7f247e4dd000 vma->vm_flags=8002871
[   94.274180] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e4dd000 7ffffffff000 7f247e4dd000
[   94.274180] __get_user_pages start=7f247e4dc000 nr_pages=1 gup_flags=1052 ctx.page_mask=0
[   94.274181] __get_user_pages @1 vma==NULL
[   94.274181] __get_user_pages @2 start=7f247e4dc000 vma->vm_start=7f247e4dc000 vma->vm_end=7f247e4dd000 vma->vm_flags=8002871
[   94.274181] __get_user_pages @6 ERESTARTSYS
[   94.274182] __get_user_pages LEAVE i=0 ret=-512
[   94.274182] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274183] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e4dd000 1 0
[   94.274183] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e4dd000 vma->vm_end=7f247e4ff000 vma->vm_flags=8002875
[   94.274184] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e4ff000 7ffffffff000 7f247e4ff000
[   94.274184] __get_user_pages start=7f247e4dd000 nr_pages=34 gup_flags=1052 ctx.page_mask=0
[   94.274185] __get_user_pages @1 vma==NULL
[   94.274185] __get_user_pages @2 start=7f247e4dd000 vma->vm_start=7f247e4dd000 vma->vm_end=7f247e4ff000 vma->vm_flags=8002875
[   94.274185] __get_user_pages @6 ERESTARTSYS
[   94.274186] __get_user_pages LEAVE i=0 ret=-512
[   94.274186] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274187] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e4ff000 1 0
[   94.274187] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e4ff000 vma->vm_end=7f247e507000 vma->vm_flags=8002871
[   94.274188] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e507000 7ffffffff000 7f247e507000
[   94.274188] __get_user_pages start=7f247e4ff000 nr_pages=8 gup_flags=1052 ctx.page_mask=0
[   94.274189] __get_user_pages @1 vma==NULL
[   94.274189] __get_user_pages @2 start=7f247e4ff000 vma->vm_start=7f247e4ff000 vma->vm_end=7f247e507000 vma->vm_flags=8002871
[   94.274189] __get_user_pages @6 ERESTARTSYS
[   94.274190] __get_user_pages LEAVE i=0 ret=-512
[   94.274190] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274191] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e507000 1 0
[   94.274191] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e508000 vma->vm_end=7f247e509000 vma->vm_flags=8102871
[   94.274192] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e509000 7ffffffff000 7f247e509000
[   94.274192] __get_user_pages start=7f247e508000 nr_pages=1 gup_flags=1052 ctx.page_mask=0
[   94.274192] __get_user_pages @1 vma==NULL
[   94.274193] __get_user_pages @2 start=7f247e508000 vma->vm_start=7f247e508000 vma->vm_end=7f247e509000 vma->vm_flags=8102871
[   94.274193] __get_user_pages @6 ERESTARTSYS
[   94.274193] __get_user_pages LEAVE i=0 ret=-512
[   94.274194] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274194] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e509000 1 0
[   94.274195] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e509000 vma->vm_end=7f247e50a000 vma->vm_flags=8102873
[   94.274196] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e50a000 7ffffffff000 7f247e50a000
[   94.274196] __get_user_pages start=7f247e509000 nr_pages=1 gup_flags=1053 ctx.page_mask=0
[   94.274196] __get_user_pages @1 vma==NULL
[   94.274197] __get_user_pages @2 start=7f247e509000 vma->vm_start=7f247e509000 vma->vm_end=7f247e50a000 vma->vm_flags=8102873
[   94.274197] __get_user_pages @6 ERESTARTSYS
[   94.274198] __get_user_pages LEAVE i=0 ret=-512
[   94.274198] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274199] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e50a000 1 0
[   94.274199] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7f247e50a000 vma->vm_end=7f247e50b000 vma->vm_flags=8102073
[   94.274200] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7f247e50b000 7ffffffff000 7f247e50b000
[   94.274200] __get_user_pages start=7f247e50a000 nr_pages=1 gup_flags=1053 ctx.page_mask=0
[   94.274200] __get_user_pages @1 vma==NULL
[   94.274201] __get_user_pages @2 start=7f247e50a000 vma->vm_start=7f247e50a000 vma->vm_end=7f247e50b000 vma->vm_flags=8102073
[   94.274201] __get_user_pages @6 ERESTARTSYS
[   94.274202] __get_user_pages LEAVE i=0 ret=-512
[   94.274202] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274203] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7f247e50b000 1 0
[   94.274203] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7ffe95c8c000 vma->vm_end=7ffe95cae000 vma->vm_flags=102173
[   94.274204] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7ffe95cae000 7ffffffff000 7ffe95cae000
[   94.274204] __get_user_pages start=7ffe95c8c000 nr_pages=34 gup_flags=1053 ctx.page_mask=0
[   94.274204] __get_user_pages @1 vma==NULL
[   94.274205] __get_user_pages @2 start=7ffe95c8c000 vma->vm_start=7ffe95c8c000 vma->vm_end=7ffe95cae000 vma->vm_flags=102173
[   94.274205] __get_user_pages @6 ERESTARTSYS
[   94.274206] __get_user_pages LEAVE i=0 ret=-512
[   94.274206] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274207] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7ffe95cae000 1 0
[   94.274207] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7ffe95db1000 vma->vm_end=7ffe95db4000 vma->vm_flags=c044411
[   94.274208] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7ffe95db4000 7ffffffff000 7ffe95db4000
[   94.274208] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-1 c044411
[   94.274209] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7ffe95db4000 1 0
[   94.274209] _mm_populate 0 7ffffffff000 7ffffffff000 1 vma->vm_start=7ffe95db4000 vma->vm_end=7ffe95db5000 vma->vm_flags=8040075
[   94.274210] _mm_populate 0 7ffffffff000 7ffffffff000 1 nend=7ffe95db5000 7ffffffff000 7ffe95db5000
[   94.274210] __get_user_pages start=7ffe95db4000 nr_pages=1 gup_flags=1052 ctx.page_mask=0
[   94.274211] __get_user_pages @1 vma==NULL
[   94.274211] __get_user_pages @2 start=7ffe95db4000 vma->vm_start=7ffe95db4000 vma->vm_end=7ffe95db5000 vma->vm_flags=8040075
[   94.274211] __get_user_pages @6 ERESTARTSYS
[   94.274212] __get_user_pages LEAVE i=0 ret=-512
[   94.274212] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP-2 -512
[   94.274213] _mm_populate 0 7ffffffff000 7ffffffff000 1 LOOP 7ffe95db5000 1 0
[   94.274213] _mm_populate END 0 140737488351232 1
diff --git a/mm/gup.c b/mm/gup.c
index 98f13ab37bac..5c9825745bb2 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -3,6 +3,7 @@
 #include <linux/errno.h>
 #include <linux/err.h>
 #include <linux/spinlock.h>
+#include <linux/printk.h>
 
 #include <linux/mm.h>
 #include <linux/memremap.h>
@@ -626,8 +627,8 @@ static int get_gate_page(struct mm_struct *mm, unsigned long address,
  * *@flags does not include FOLL_NOWAIT, the mmap_sem may be released.
  * If it is, *@nonblocking will be set to 0 and -EBUSY returned.
  */
-static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma,
-		unsigned long address, unsigned int *flags, int *nonblocking)
+static int faultin_page_x(struct task_struct *tsk, struct vm_area_struct *vma,
+		unsigned long address, unsigned int *flags, int *nonblocking, int ign)
 {
 	unsigned int fault_flags = 0;
 	vm_fault_t ret;
@@ -649,8 +650,14 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma,
 	}
 
 	ret = handle_mm_fault(vma, address, fault_flags);
+    if (!ign) {
+        printk(KERN_WARNING "faultin_page handle_mm_fault --> ret = %u\n", ret);
+    }
 	if (ret & VM_FAULT_ERROR) {
 		int err = vm_fault_to_errno(ret, *flags);
+        if (!ign) {
+            printk(KERN_WARNING "faultin_page handle_mm_fault --> err = %d\n", err);
+        }
 
 		if (err)
 			return err;
@@ -665,6 +672,9 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma,
 	}
 
 	if (ret & VM_FAULT_RETRY) {
+	    if (!ign) {
+            printk(KERN_WARNING "faultin_page-->EBUSY VM_FAULT_RETRY non-blocking?%d FAULT_FLAG_RETRY_NOWAIT?%d\n", nonblocking?1:0, (fault_flags & FAULT_FLAG_RETRY_NOWAIT)?1:0);
+        }
 		if (nonblocking && !(fault_flags & FAULT_FLAG_RETRY_NOWAIT))
 			*nonblocking = 0;
 		return -EBUSY;
@@ -681,8 +691,16 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma,
 	 */
 	if ((ret & VM_FAULT_WRITE) && !(vma->vm_flags & VM_WRITE))
 		*flags |= FOLL_COW;
+    if (!ign) {
+        printk(KERN_WARNING "faultin_page-->0\n");
+    }
 	return 0;
 }
+static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma,
+		unsigned long address, unsigned int *flags, int *nonblocking)
+{
+    return faultin_page_x(tsk, vma, address, flags, nonblocking, 1);
+}
 
 static int check_vma_flags(struct vm_area_struct *vma, unsigned long gup_flags)
 {
@@ -787,15 +805,18 @@ static int check_vma_flags(struct vm_area_struct *vma, unsigned long gup_flags)
  * instead of __get_user_pages. __get_user_pages should be used only if
  * you need some special @gup_flags.
  */
-static long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
+static long __get_user_pages_x(struct task_struct *tsk, struct mm_struct *mm,
 		unsigned long start, unsigned long nr_pages,
 		unsigned int gup_flags, struct page **pages,
-		struct vm_area_struct **vmas, int *nonblocking)
+		struct vm_area_struct **vmas, int *nonblocking, int ign)
 {
 	long ret = 0, i = 0;
 	struct vm_area_struct *vma = NULL;
 	struct follow_page_context ctx = { NULL };
 
+	if (!ign)
+	    printk(KERN_WARNING "__get_user_pages start=%lx nr_pages=%lu gup_flags=%x ctx.page_mask=%u\n", start, nr_pages, gup_flags, ctx.page_mask);
+
 	if (!nr_pages)
 		return 0;
 
@@ -816,11 +837,25 @@ static long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 
 		/* first iteration or cross vma bound */
 		if (!vma || start >= vma->vm_end) {
+            if (!ign) {
+                if (!vma)
+                    printk(KERN_WARNING "__get_user_pages @1 vma==NULL\n");
+                else
+                    printk(KERN_WARNING "__get_user_pages @1 start=%lx vma->vm_start=%lx vma->vm_end=%lx vma->vm_flags=%lx\n", start, vma->vm_start, vma->vm_end, vma->vm_flags);
+            }
 			vma = find_extend_vma(mm, start);
+            if (!ign) {
+                if (!vma)
+                    printk(KERN_WARNING "__get_user_pages @2 vma==NULL\n");
+                else
+                    printk(KERN_WARNING "__get_user_pages @2 start=%lx vma->vm_start=%lx vma->vm_end=%lx vma->vm_flags=%lx\n", start, vma->vm_start, vma->vm_end, vma->vm_flags);
+            }
 			if (!vma && in_gate_area(mm, start)) {
 				ret = get_gate_page(mm, start & PAGE_MASK,
 						gup_flags, &vma,
 						pages ? &pages[i] : NULL);
+                if (!ign)
+                    printk(KERN_WARNING "__get_user_pages @3 get_gate_page --> %ld\n", ret);
 				if (ret)
 					goto out;
 				ctx.page_mask = 0;
@@ -828,6 +863,8 @@ static long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 			}
 
 			if (!vma || check_vma_flags(vma, gup_flags)) {
+                if (!ign)
+                    printk(KERN_WARNING "__get_user_pages @4 EFAULT\n");
 				ret = -EFAULT;
 				goto out;
 			}
@@ -835,6 +872,8 @@ static long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 				i = follow_hugetlb_page(mm, vma, pages, vmas,
 						&start, &nr_pages, i,
 						gup_flags, nonblocking);
+                if (!ign)
+                    printk(KERN_WARNING "__get_user_pages @5 follow_hugetlb_page --> %ld\n", i);
 				continue;
 			}
 		}
@@ -844,15 +883,21 @@ static long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 		 * potentially allocating memory.
 		 */
 		if (fatal_signal_pending(current)) {
+            if (!ign)
+                printk(KERN_WARNING "__get_user_pages @6 ERESTARTSYS\n");
 			ret = -ERESTARTSYS;
 			goto out;
 		}
 		cond_resched();
 
 		page = follow_page_mask(vma, start, foll_flags, &ctx);
+        if (!ign)
+            printk(KERN_WARNING "__get_user_pages @7 follow_page_mask --> %d  ctx.page_mask=%u\n", page ? 1 : 0, ctx.page_mask);
 		if (!page) {
-			ret = faultin_page(tsk, vma, start, &foll_flags,
-					nonblocking);
+			ret = faultin_page_x(tsk, vma, start, &foll_flags,
+					nonblocking, ign);
+            if (!ign)
+                printk(KERN_WARNING "__get_user_pages @8 faultin_page --> %ld\n", ret);
 			switch (ret) {
 			case 0:
 				goto retry;
@@ -868,6 +913,8 @@ static long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 			}
 			BUG();
 		} else if (PTR_ERR(page) == -EEXIST) {
+            if (!ign)
+                printk(KERN_WARNING "__get_user_pages @8 EEXIST\n");
 			/*
 			 * Proper page table entry exists, but no corresponding
 			 * struct page.
@@ -875,6 +922,8 @@ static long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 			goto next_page;
 		} else if (IS_ERR(page)) {
 			ret = PTR_ERR(page);
+			if (!ign)
+                printk(KERN_WARNING "__get_user_pages @8 IS_ERR -> ret=%ld\n", ret);
 			goto out;
 		}
 		if (pages) {
@@ -889,17 +938,31 @@ static long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 			ctx.page_mask = 0;
 		}
 		page_increm = 1 + (~(start >> PAGE_SHIFT) & ctx.page_mask);
+        if (!ign)
+            printk(KERN_WARNING "__get_user_pages @9 page_increm=%u ctx.page_mask=%u\n", page_increm, ctx.page_mask);
 		if (page_increm > nr_pages)
 			page_increm = nr_pages;
 		i += page_increm;
 		start += page_increm * PAGE_SIZE;
 		nr_pages -= page_increm;
+        if (!ign)
+            printk(KERN_WARNING "__get_user_pages @10 i=%ld start=%lx nr_pages=%ld\n", i, start, nr_pages);
 	} while (nr_pages);
 out:
 	if (ctx.pgmap)
 		put_dev_pagemap(ctx.pgmap);
+    if (!ign) {
+        printk(KERN_WARNING "__get_user_pages LEAVE i=%ld ret=%ld\n", i, ret);
+    }
 	return i ? i : ret;
 }
+static long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
+		unsigned long start, unsigned long nr_pages,
+		unsigned int gup_flags, struct page **pages,
+		struct vm_area_struct **vmas, int *nonblocking)
+{
+    return __get_user_pages_x(tsk, mm, start, nr_pages, gup_flags, pages, vmas, nonblocking, 1);
+}
 
 static bool vma_permits_fault(struct vm_area_struct *vma,
 			      unsigned int fault_flags)
@@ -1192,8 +1255,9 @@ EXPORT_SYMBOL(get_user_pages_remote);
  * If @nonblocking is non-NULL, it must held for read only and may be
  * released.  If it's released, *@nonblocking will be set to 0.
  */
-long populate_vma_page_range(struct vm_area_struct *vma,
-		unsigned long start, unsigned long end, int *nonblocking)
+long populate_vma_page_range_x(struct vm_area_struct *vma,
+		unsigned long start, unsigned long end, int *nonblocking,
+		int ign)
 {
 	struct mm_struct *mm = vma->vm_mm;
 	unsigned long nr_pages = (end - start) / PAGE_SIZE;
@@ -1227,8 +1291,13 @@ long populate_vma_page_range(struct vm_area_struct *vma,
 	 * We made sure addr is within a VMA, so the following will
 	 * not result in a stack expansion that recurses back here.
 	 */
-	return __get_user_pages(current, mm, start, nr_pages, gup_flags,
-				NULL, NULL, nonblocking);
+	return __get_user_pages_x(current, mm, start, nr_pages, gup_flags,
+				NULL, NULL, nonblocking, ign);
+}
+long populate_vma_page_range(struct vm_area_struct *vma,
+		unsigned long start, unsigned long end, int *nonblocking)
+{
+    return populate_vma_page_range_x(vma, start, end, nonblocking, 1);
 }
 
 /*
@@ -1241,14 +1310,23 @@ long populate_vma_page_range(struct vm_area_struct *vma,
 int __mm_populate(unsigned long start, unsigned long len, int ignore_errors)
 {
 	struct mm_struct *mm = current->mm;
-	unsigned long end, nstart, nend;
+	unsigned long end, nstart, nend = 0L;
 	struct vm_area_struct *vma = NULL;
 	int locked = 0;
 	long ret = 0;
+	unsigned long nstart_prev = 0L - 1L, nend_prev = 0L - 1L;
+	int ign;
 
 	end = start + len;
 
+	printk(KERN_WARNING "_mm_populate %lx %lx %lx %d ENTER\n", start, len, end, ignore_errors);
+
 	for (nstart = start; nstart < end; nstart = nend) {
+	    ign = nstart == nstart_prev && nend == nend_prev;
+	    nstart_prev = nstart;
+	    nend_prev = nend;
+        if (!ign)
+            printk(KERN_WARNING "_mm_populate %lx %lx %lx %d LOOP %lx %d %ld\n", start, len, end, ignore_errors, nstart, locked, ret);
 		/*
 		 * We want to fault in pages for [nstart; end) address range.
 		 * Find first corresponding VMA.
@@ -1259,6 +1337,8 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors)
 			vma = find_vma(mm, nstart);
 		} else if (nstart >= vma->vm_end)
 			vma = vma->vm_next;
+		if (!ign && vma)
+		    printk(KERN_WARNING "_mm_populate %lx %lx %lx %d vma->vm_start=%lx vma->vm_end=%lx vma->vm_flags=%lx\n", start, len, end, ignore_errors, vma->vm_start, vma->vm_end, vma->vm_flags);
 		if (!vma || vma->vm_start >= end)
 			break;
 		/*
@@ -1266,8 +1346,13 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors)
 		 * range with the first VMA. Also, skip undesirable VMA types.
 		 */
 		nend = min(end, vma->vm_end);
-		if (vma->vm_flags & (VM_IO | VM_PFNMAP))
-			continue;
+        if (!ign)
+            printk(KERN_WARNING "_mm_populate %lx %lx %lx %d nend=%lx %lx %lx\n", start, len, end, ignore_errors, nend, end, vma->vm_end);
+		if (vma->vm_flags & (VM_IO | VM_PFNMAP)) {
+            if (!ign)
+                printk(KERN_WARNING "_mm_populate %lx %lx %lx %d LOOP-1 %lx\n", start, len, end, ignore_errors, vma->vm_flags);
+            continue;
+        }
 		if (nstart < vma->vm_start)
 			nstart = vma->vm_start;
 		/*
@@ -1275,8 +1360,10 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors)
 		 * double checks the vma flags, so that it won't mlock pages
 		 * if the vma was already munlocked.
 		 */
-		ret = populate_vma_page_range(vma, nstart, nend, &locked);
+		ret = populate_vma_page_range_x(vma, nstart, nend, &locked, ign);
 		if (ret < 0) {
+            if (!ign)
+                printk(KERN_WARNING "_mm_populate %lx %lx %lx %d LOOP-2 %ld\n", start, len, end, ignore_errors, ret);
 			if (ignore_errors) {
 				ret = 0;
 				continue;	/* continue at next VMA */
@@ -1284,8 +1371,11 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors)
 			break;
 		}
 		nend = nstart + ret * PAGE_SIZE;
+        if (!ign)
+            printk(KERN_WARNING "_mm_populate %lx %lx %lx %d LOOP-3 ret=%ld nend=%lx\n", start, len, end, ignore_errors, ret, nend);
 		ret = 0;
 	}
+    printk(KERN_WARNING "_mm_populate END %lu %lu %d\n", start, len, locked);
 	if (locked)
 		up_read(&mm->mmap_sem);
 	return ret;	/* 0 or negative error code */

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux