Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1633566

Re: [PATCH v2] mm, zone_device: replace {get, put}_zone_device_page() with a single reference

From Ingo Molnar <mingo@kernel.org>
Newsgroups linux.kernel
Subject Re: [PATCH v2] mm, zone_device: replace {get, put}_zone_device_page() with a single reference
Date 2017-05-01 09:20 +0200
Message-ID <tCdMK-626-9@gated-at.bofh.it> (permalink)
References <tB7Jn-3F8-9@gated-at.bofh.it> <tBhSp-272-11@gated-at.bofh.it> <tBBo5-7iD-1@gated-at.bofh.it> <tC9zs-3ad-7@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


* Dan Williams <dan.j.williams@intel.com> wrote:

> On Sat, Apr 29, 2017 at 7:18 AM, Ingo Molnar <mingo@kernel.org> wrote:
> >
> > * Dan Williams <dan.j.williams@intel.com> wrote:
> >
> >> Kirill points out that the calls to {get,put}_dev_pagemap() can be
> >> removed from the mm fast path if we take a single get_dev_pagemap()
> >> reference to signify that the page is alive and use the final put of the
> >> page to drop that reference.
> >>
> >> This does require some care to make sure that any waits for the
> >> percpu_ref to drop to zero occur *after* devm_memremap_page_release(),
> >> since it now maintains its own elevated reference.
> >>
> >> Cc: Ingo Molnar <mingo@redhat.com>
> >> Cc: Jérôme Glisse <jglisse@redhat.com>
> >> Cc: Andrew Morton <akpm@linux-foundation.org>
> >> Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
> >> Suggested-by: Kirill Shutemov <kirill.shutemov@linux.intel.com>
> >> Tested-by: Kirill Shutemov <kirill.shutemov@linux.intel.com>
> >> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
> >
> > This changelog is lacking an explanation about how this solves the crashes you
> > were seeing.
> 
> Kirill? It wasn't clear to me why the conversion to generic 
> get_user_pages_fast() caused the reference counts to be off.

Ok, the merge window is open and we really need this fix for x86/mm, so this is 
what I've decoded:

 The x86 conversion to the generic GUP code included a small change which causes
 crashes and data corruption in the pmem code - not good.

 The root cause is that the /dev/pmem driver code implicitly relies on the x86
 get_user_pages() implementation doing a get_page() on the page refcount, because
 get_page() does a get_zone_device_page() which properly refcounts pmem's separate
 page struct arrays that are not present in the regular page struct structures.
 (The pmem driver does this because it can cover huge memory areas.)

 But the x86 conversion to the generic GUP code changed the get_page() to
 page_cache_get_speculative() which is faster but doesn't do the
 get_zone_device_page() call the pmem code relies on.

 One way to solve the regression would be to change the generic GUP code to use 
 get_page(), but that would slow things down a bit and punish other generic-GUP 
 using architectures for an x86-ism they did not care about. (Arguably the pmem 
 driver was probably not working reliably for them: but nvdimm is an Intel
 feature, so non-x86 exposure is probably still limited.)

 So restructure the pmem code's interface with the MM instead: get rid of the 
 get/put_zone_device_page() distinction, integrate put_zone_device_page() into 
 __put_page() and and restructure the pmem completion-wait and teardown machinery.

 This speeds up things while also making the pmem refcounting more robust going 
 forward.

... is this extension to the changelog correct?

I'll apply this for the time being - but can still amend the text before sending 
it to Linus later today.

Thanks,

	Ingo

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-04-27 03:10 +0200
  Re: [PATCH] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference "Kirill A. Shutemov" <kirill@shutemov.name> - 2017-04-27 10:40 +0200
    Re: [PATCH] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Ingo Molnar <mingo@kernel.org> - 2017-04-28 08:40 +0200
      [PATCH] mm, zone_device: Replace {get, put}_zone_device_page() with a single reference "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> - 2017-04-28 10:20 +0200
      [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-04-28 19:30 +0200
        Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Jerome Glisse <jglisse@redhat.com> - 2017-04-28 19:40 +0200
          Re: [PATCH v2] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-04-28 19:50 +0200
            Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Jerome Glisse <jglisse@redhat.com> - 2017-04-28 20:10 +0200
              Re: [PATCH v2] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-04-28 21:10 +0200
                Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Jerome Glisse <jglisse@redhat.com> - 2017-04-28 21:20 +0200
                Re: [PATCH v2] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-04-28 21:30 +0200
                Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Jerome Glisse <jglisse@redhat.com> - 2017-04-28 21:40 +0200
                Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference "Kirill A. Shutemov" <kirill@shutemov.name> - 2017-04-29 12:20 +0200
                Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Jerome Glisse <jglisse@redhat.com> - 2017-05-01 01:20 +0200
                Re: [PATCH v2] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-05-01 03:50 +0200
                Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Jerome Glisse <jglisse@redhat.com> - 2017-05-01 04:00 +0200
                Re: [PATCH v2] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-05-01 04:50 +0200
                Re: [PATCH v2] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Logan Gunthorpe <logang@deltatee.com> - 2017-05-01 05:50 +0200
                Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference "Kirill A. Shutemov" <kirill@shutemov.name> - 2017-05-01 12:50 +0200
                Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Jerome Glisse <jglisse@redhat.com> - 2017-05-01 16:00 +0200
                Re: [PATCH v2] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-05-01 22:30 +0200
                Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Jerome Glisse <jglisse@redhat.com> - 2017-05-01 22:40 +0200
                Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference "Kirill A. Shutemov" <kirill@shutemov.name> - 2017-05-02 13:50 +0200
                Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Jerome Glisse <jglisse@redhat.com> - 2017-05-02 15:30 +0200
        Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Ingo Molnar <mingo@kernel.org> - 2017-04-29 16:20 +0200
          Re: [PATCH v2] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-05-01 04:50 +0200
            Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference Ingo Molnar <mingo@kernel.org> - 2017-05-01 09:20 +0200
              Re: [PATCH v2] mm, zone_device: replace {get,  put}_zone_device_page() with a single reference "Kirill A. Shutemov" <kirill@shutemov.name> - 2017-05-01 11:40 +0200
        [tip:x86/mm] mm, zone_device: Replace {get, put}_zone_device_page()  with a single reference to fix pmem crash tip-bot for Dan Williams <tipbot@zytor.com> - 2017-05-01 10:40 +0200
  Re: [PATCH] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-04-27 18:20 +0200
    Re: [PATCH] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Logan Gunthorpe <logang@deltatee.com> - 2017-04-27 18:40 +0200
      Re: [PATCH] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-04-27 18:40 +0200
        Re: [PATCH] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Dan Williams <dan.j.williams@intel.com> - 2017-04-27 18:50 +0200
        Re: [PATCH] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Logan Gunthorpe <logang@deltatee.com> - 2017-04-27 18:50 +0200
  Re: [PATCH] mm, zone_device: replace {get, put}_zone_device_page()  with a single reference Logan Gunthorpe <logang@deltatee.com> - 2017-04-27 18:20 +0200

csiph-web