Messages in this thread | | | Date | Thu, 10 Sep 2020 10:02:33 -0300 | From | Jason Gunthorpe <> | Subject | Re: [RFC PATCH v2 1/3] mm/gup: fix gup_fast with dynamic page table folding |
| |
On Thu, Sep 10, 2020 at 11:39:25AM +0200, Alexander Gordeev wrote:
> As Gerald mentioned, it is very difficult to explain in a clear way. > Hopefully, one could make sense ot of it.
I would say the page table API requires this invariant:
pud = pud_offset(p4d, addr); do { WARN_ON(pud != pud_offset(p4d, addr); next = pud_addr_end(addr, end); } while (pud++, addr = next, addr != end);
ie pud++ is supposed to be a shortcut for pud_offset(p4d, next)
While S390 does not follow this. Fixing addr_end brings it into alignment by preventing pud++ from happening.
The only currently known side effect is that gup_fast crashes, but it sure is an unexpected thing.
This suggests another fix, which is to say that pud++ is undefined and pud_offset() must always be called, but I think that would cause worse codegen on all other archs.
Jason
| |