Re: [regression] Re: [PATCH v6 06/12] mm/gup: track FOLL_PIN pages

From: John Hubbard
Date: Fri Apr 24 2020 - 18:58:34 EST


On 2020-04-24 13:15, Alex Williamson wrote:
On Fri, 24 Apr 2020 12:20:03 -0700
John Hubbard <jhubbard@xxxxxxxxxx> wrote:

On 2020-04-24 11:18, Alex Williamson wrote:
...
Hi John,

I'm seeing a regression bisected back to this commit (3faa52c03f44
mm/gup: track FOLL_PIN pages). I've attached some vfio-pci test code
that reproduces this by mmap'ing a page of MMIO space of a device and
then tries to map that through the IOMMU, so this should be attempting
a gup/pin of a PFNMAP page. Previously this failed gracefully (-EFAULT),
but now results in:


Hi Alex,

Thanks for this report, and especially for source code to test it,
seeing as how I can't immediately spot the problem just from the crash
data so far. I'll get set up and attempt a repro.

Actually this looks like it should be relatively easier than the usual
sort of "oops, we leaked a pin_user_pages() or unpin_user_pages() call,
good luck finding which one" report that I fear the most. :) This one
looks more like a crash that happens directly, when calling into the
pin_user_pages_remote() code. Which should be a lot easier to solve...

btw, if you are set up for it, it would be nice to know what source file
and line number corresponds to the RIP (get_pfnblock_flags_mask+0x22)
below. But if not, no problem, because I've likely got to do the repro
in any case.

Hey John,

TBH I'm feeling a lot less confident about this bisect. This was
readily reproducible to me on a clean tree a bit ago, but now it
eludes me. Let me go back and figure out what's going on before you
spend any more time on it. Thanks,


OK. But I'm keeping the repro program! :) It made it quick and easy to
set up a vfio test, so it was worth doing in any case.

Anyway, I wanted to double check this just out of paranoia, and so
now I have a data point for you: your test program runs and passes for
me using today's linux.git kernel, with an NVIDIA GPU as the vfio
device, and the kernel log is clean. No hint of any problems.

I traced it a little bit:

# sudo bpftrace -e kprobe:__get_user_pages { @[kstack()] = count(); }
Attaching 1 probe...
^C
...
@[
__get_user_pages+1
__gup_longterm_locked+176
vaddr_get_pfn+104
vfio_pin_pages_remote+113
vfio_dma_do_map+760
vfio_iommu_type1_ioctl+761
ksys_ioctl+135
__x64_sys_ioctl+22
do_syscall_64+90
entry_SYSCALL_64_after_hwframe+73
]: 1

...and also verified that it's not actually pinning any pages with that
path:

$ grep foll_pin /proc/vmstat
nr_foll_pin_acquired 0
nr_foll_pin_released 0


Good luck and let me know if it starts pointing to FOLL_PIN or gup, etc.

thanks,
--
John Hubbard
NVIDIA