Message ID | 20210119043920.155044-9-pasha.tatashin@soleen.com |
---|---|
State | New |
Headers | show |
Series | None | expand |
On Mon, Jan 18, 2021 at 11:39:14PM -0500, Pavel Tatashin wrote: > Zero page should not be used for long term pinned pages. Once pages > are pinned their physical addresses cannot changed until they are unpinned. > > Guarantee to always return real pages when they are pinned by adding > FOLL_WRITE. > > Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com> > --- > mm/gup.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) No, this will definitely break things Why does the zero page have to be movable? Jason
On Tue, Jan 19, 2021 at 01:34:26PM -0500, Pavel Tatashin wrote: > On Tue, Jan 19, 2021 at 1:30 PM Jason Gunthorpe <jgg@ziepe.ca> wrote: > > > > On Mon, Jan 18, 2021 at 11:39:14PM -0500, Pavel Tatashin wrote: > > > Zero page should not be used for long term pinned pages. Once pages > > > are pinned their physical addresses cannot changed until they are unpinned. > > > > > > Guarantee to always return real pages when they are pinned by adding > > > FOLL_WRITE. > > > > > > Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com> > > > mm/gup.c | 10 +++++++++- > > > 1 file changed, 9 insertions(+), 1 deletion(-) > > > > No, this will definitely break things > > What will break Things assuming GUP doesn't break COW, making all GUP WRITE was already tried and revered for some other reason > > Why does the zero page have to be movable? > > It is not even about being movable, we can't cow pinned pages returned > by GUP call, how can we use zero page for that? The zero page is always zero, it is never written to. What does cow matter? Jason
diff --git a/mm/gup.c b/mm/gup.c index 857b273e32ac..9a817652f501 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1668,8 +1668,16 @@ static long __gup_longterm_locked(struct mm_struct *mm, unsigned long flags = 0; long rc; - if (gup_flags & FOLL_LONGTERM) + if (gup_flags & FOLL_LONGTERM) { + /* + * We are long term pinning pages and their PA's should not + * change until unpinned. Without FOLL_WRITE we might get zero + * page which we do not want. Force creating normal + * pages by adding FOLL_WRITE. + */ + gup_flags |= FOLL_WRITE; flags = memalloc_pin_save(); + } rc = __get_user_pages_locked(mm, start, nr_pages, pages, vmas, NULL, gup_flags);
Zero page should not be used for long term pinned pages. Once pages are pinned their physical addresses cannot changed until they are unpinned. Guarantee to always return real pages when they are pinned by adding FOLL_WRITE. Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com> --- mm/gup.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)