All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
  2018-07-04 15:30   ` Zhang Yi
  (?)
@ 2018-07-04 14:50     ` Dan Williams
  -1 siblings, 0 replies; 36+ messages in thread
From: Dan Williams @ 2018-07-04 14:50 UTC (permalink / raw)
  To: Zhang Yi
  Cc: Jan Kara, Zhang, Yu C, KVM list, linux-nvdimm, rkrcmar,
	Linux Kernel Mailing List, Linux MM, Jérôme Glisse,
	Paolo Bonzini, Christoph Hellwig

[ adding Jerome ]

On Wed, Jul 4, 2018 at 8:30 AM, Zhang Yi <yi.z.zhang@linux.intel.com> wrote:
> For device specific memory space, when we move these area of pfn to
> memory zone, we will set the page reserved flag at that time, some of
> these reserved for device mmio, and some of these are not, such as
> NVDIMM pmem.
>
> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
> backend, since these pages are reserved. the check of
> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
> to indentify these pages are from NVDIMM pmem. and let kvm treat these
> as normal pages.
>
> Without this patch, Many operations will be missed due to this
> mistreatment to pmem pages. For example, a page may not have chance to
> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
>
> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
> ---
>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index afb2e6e..1365d18 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
>  {
>  }
>
> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
> +{
> +       struct page *page = pfn_to_page(pfn);
> +
> +       return is_zone_device_page(page) &&
> +               ((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
> +                (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));

Jerome, might there be any use case to pass MEMORY_DEVICE_PUBLIC
memory to a guest vm?

> +}
> +
>  bool kvm_is_reserved_pfn(kvm_pfn_t pfn)
>  {
> -       if (pfn_valid(pfn))
> -               return PageReserved(pfn_to_page(pfn));
> +       struct page *page;
> +
> +       if (pfn_valid(pfn)) {
> +               page = pfn_to_page(pfn);
> +               return kvm_is_nd_pfn(pfn) ? false : PageReserved(page);
> +       }
>
>         return true;
>  }
> --
> 2.7.4
>
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-04 14:50     ` Dan Williams
  0 siblings, 0 replies; 36+ messages in thread
From: Dan Williams @ 2018-07-04 14:50 UTC (permalink / raw)
  To: Zhang Yi
  Cc: KVM list, Linux Kernel Mailing List, linux-nvdimm, Paolo Bonzini,
	Jan Kara, Christoph Hellwig, Zhang, Yu C, Linux MM, rkrcmar,
	Zhang, Yi Z, Jérôme Glisse

[ adding Jerome ]

On Wed, Jul 4, 2018 at 8:30 AM, Zhang Yi <yi.z.zhang@linux.intel.com> wrote:
> For device specific memory space, when we move these area of pfn to
> memory zone, we will set the page reserved flag at that time, some of
> these reserved for device mmio, and some of these are not, such as
> NVDIMM pmem.
>
> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
> backend, since these pages are reserved. the check of
> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
> to indentify these pages are from NVDIMM pmem. and let kvm treat these
> as normal pages.
>
> Without this patch, Many operations will be missed due to this
> mistreatment to pmem pages. For example, a page may not have chance to
> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
>
> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
> ---
>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index afb2e6e..1365d18 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
>  {
>  }
>
> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
> +{
> +       struct page *page = pfn_to_page(pfn);
> +
> +       return is_zone_device_page(page) &&
> +               ((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
> +                (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));

Jerome, might there be any use case to pass MEMORY_DEVICE_PUBLIC
memory to a guest vm?

> +}
> +
>  bool kvm_is_reserved_pfn(kvm_pfn_t pfn)
>  {
> -       if (pfn_valid(pfn))
> -               return PageReserved(pfn_to_page(pfn));
> +       struct page *page;
> +
> +       if (pfn_valid(pfn)) {
> +               page = pfn_to_page(pfn);
> +               return kvm_is_nd_pfn(pfn) ? false : PageReserved(page);
> +       }
>
>         return true;
>  }
> --
> 2.7.4
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-04 14:50     ` Dan Williams
  0 siblings, 0 replies; 36+ messages in thread
From: Dan Williams @ 2018-07-04 14:50 UTC (permalink / raw)
  To: Zhang Yi
  Cc: Jan Kara, Zhang, Yu C, KVM list, linux-nvdimm,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA, Linux Kernel Mailing List,
	Linux MM, Jérôme Glisse, Paolo Bonzini,
	Christoph Hellwig, Zhang, Yi Z

[ adding Jerome ]

On Wed, Jul 4, 2018 at 8:30 AM, Zhang Yi <yi.z.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> wrote:
> For device specific memory space, when we move these area of pfn to
> memory zone, we will set the page reserved flag at that time, some of
> these reserved for device mmio, and some of these are not, such as
> NVDIMM pmem.
>
> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
> backend, since these pages are reserved. the check of
> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
> to indentify these pages are from NVDIMM pmem. and let kvm treat these
> as normal pages.
>
> Without this patch, Many operations will be missed due to this
> mistreatment to pmem pages. For example, a page may not have chance to
> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
>
> Signed-off-by: Zhang Yi <yi.z.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> Signed-off-by: Zhang Yu <yu.c.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> ---
>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index afb2e6e..1365d18 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
>  {
>  }
>
> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
> +{
> +       struct page *page = pfn_to_page(pfn);
> +
> +       return is_zone_device_page(page) &&
> +               ((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
> +                (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));

Jerome, might there be any use case to pass MEMORY_DEVICE_PUBLIC
memory to a guest vm?

> +}
> +
>  bool kvm_is_reserved_pfn(kvm_pfn_t pfn)
>  {
> -       if (pfn_valid(pfn))
> -               return PageReserved(pfn_to_page(pfn));
> +       struct page *page;
> +
> +       if (pfn_valid(pfn)) {
> +               page = pfn_to_page(pfn);
> +               return kvm_is_nd_pfn(pfn) ? false : PageReserved(page);
> +       }
>
>         return true;
>  }
> --
> 2.7.4
>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX
  2018-07-04 15:30   ` Zhang Yi
  (?)
@ 2018-07-04 14:50     ` Dan Williams
  -1 siblings, 0 replies; 36+ messages in thread
From: Dan Williams @ 2018-07-04 14:50 UTC (permalink / raw)
  To: Zhang Yi
  Cc: Jan Kara, Zhang, Yu C, KVM list, linux-nvdimm, rkrcmar,
	Linux Kernel Mailing List, Linux MM, Paolo Bonzini,
	Christoph Hellwig, Zhang, Yi Z

On Wed, Jul 4, 2018 at 8:30 AM, Zhang Yi <yi.z.zhang@linux.intel.com> wrote:
> Currently, NVDIMM pages will be marked 'PageReserved'. However, unlike
> other reserved PFNs, pages on NVDIMM shall still behave like normal ones
> in many cases, i.e. when used as backend memory of KVM guest. This patch
> introduces a new memory type, MEMORY_DEVICE_DEV_DAX. Together with the
> existing type MEMORY_DEVICE_FS_DAX, we can differentiate the pages on
> NVDIMM with the normal reserved pages.
>
> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
> ---
>  drivers/dax/pmem.c       | 1 +
>  include/linux/memremap.h | 1 +
>  2 files changed, 2 insertions(+)
>
> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
> index fd49b24..fb3f363 100644
> --- a/drivers/dax/pmem.c
> +++ b/drivers/dax/pmem.c
> @@ -111,6 +111,7 @@ static int dax_pmem_probe(struct device *dev)
>                 return rc;
>
>         dax_pmem->pgmap.ref = &dax_pmem->ref;
> +       dax_pmem->pgmap.type = MEMORY_DEVICE_DEV_DAX;
>         addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
>         if (IS_ERR(addr))
>                 return PTR_ERR(addr);
> diff --git a/include/linux/memremap.h b/include/linux/memremap.h
> index 5ebfff6..4127bf7 100644
> --- a/include/linux/memremap.h
> +++ b/include/linux/memremap.h
> @@ -58,6 +58,7 @@ enum memory_type {
>         MEMORY_DEVICE_PRIVATE = 1,
>         MEMORY_DEVICE_PUBLIC,
>         MEMORY_DEVICE_FS_DAX,
> +       MEMORY_DEVICE_DEV_DAX,

Please add documentation for this new type to the comment block about
this definition.
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX
@ 2018-07-04 14:50     ` Dan Williams
  0 siblings, 0 replies; 36+ messages in thread
From: Dan Williams @ 2018-07-04 14:50 UTC (permalink / raw)
  To: Zhang Yi
  Cc: KVM list, Linux Kernel Mailing List, linux-nvdimm, Paolo Bonzini,
	Jan Kara, Christoph Hellwig, Zhang, Yu C, Linux MM, rkrcmar,
	Zhang, Yi Z

On Wed, Jul 4, 2018 at 8:30 AM, Zhang Yi <yi.z.zhang@linux.intel.com> wrote:
> Currently, NVDIMM pages will be marked 'PageReserved'. However, unlike
> other reserved PFNs, pages on NVDIMM shall still behave like normal ones
> in many cases, i.e. when used as backend memory of KVM guest. This patch
> introduces a new memory type, MEMORY_DEVICE_DEV_DAX. Together with the
> existing type MEMORY_DEVICE_FS_DAX, we can differentiate the pages on
> NVDIMM with the normal reserved pages.
>
> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
> ---
>  drivers/dax/pmem.c       | 1 +
>  include/linux/memremap.h | 1 +
>  2 files changed, 2 insertions(+)
>
> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
> index fd49b24..fb3f363 100644
> --- a/drivers/dax/pmem.c
> +++ b/drivers/dax/pmem.c
> @@ -111,6 +111,7 @@ static int dax_pmem_probe(struct device *dev)
>                 return rc;
>
>         dax_pmem->pgmap.ref = &dax_pmem->ref;
> +       dax_pmem->pgmap.type = MEMORY_DEVICE_DEV_DAX;
>         addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
>         if (IS_ERR(addr))
>                 return PTR_ERR(addr);
> diff --git a/include/linux/memremap.h b/include/linux/memremap.h
> index 5ebfff6..4127bf7 100644
> --- a/include/linux/memremap.h
> +++ b/include/linux/memremap.h
> @@ -58,6 +58,7 @@ enum memory_type {
>         MEMORY_DEVICE_PRIVATE = 1,
>         MEMORY_DEVICE_PUBLIC,
>         MEMORY_DEVICE_FS_DAX,
> +       MEMORY_DEVICE_DEV_DAX,

Please add documentation for this new type to the comment block about
this definition.

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX
@ 2018-07-04 14:50     ` Dan Williams
  0 siblings, 0 replies; 36+ messages in thread
From: Dan Williams @ 2018-07-04 14:50 UTC (permalink / raw)
  To: Zhang Yi
  Cc: Jan Kara, Zhang, Yu C, KVM list, linux-nvdimm,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA, Linux Kernel Mailing List,
	Linux MM, Paolo Bonzini, Christoph Hellwig, Zhang, Yi Z

On Wed, Jul 4, 2018 at 8:30 AM, Zhang Yi <yi.z.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> wrote:
> Currently, NVDIMM pages will be marked 'PageReserved'. However, unlike
> other reserved PFNs, pages on NVDIMM shall still behave like normal ones
> in many cases, i.e. when used as backend memory of KVM guest. This patch
> introduces a new memory type, MEMORY_DEVICE_DEV_DAX. Together with the
> existing type MEMORY_DEVICE_FS_DAX, we can differentiate the pages on
> NVDIMM with the normal reserved pages.
>
> Signed-off-by: Zhang Yi <yi.z.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> Signed-off-by: Zhang Yu <yu.c.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> ---
>  drivers/dax/pmem.c       | 1 +
>  include/linux/memremap.h | 1 +
>  2 files changed, 2 insertions(+)
>
> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
> index fd49b24..fb3f363 100644
> --- a/drivers/dax/pmem.c
> +++ b/drivers/dax/pmem.c
> @@ -111,6 +111,7 @@ static int dax_pmem_probe(struct device *dev)
>                 return rc;
>
>         dax_pmem->pgmap.ref = &dax_pmem->ref;
> +       dax_pmem->pgmap.type = MEMORY_DEVICE_DEV_DAX;
>         addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
>         if (IS_ERR(addr))
>                 return PTR_ERR(addr);
> diff --git a/include/linux/memremap.h b/include/linux/memremap.h
> index 5ebfff6..4127bf7 100644
> --- a/include/linux/memremap.h
> +++ b/include/linux/memremap.h
> @@ -58,6 +58,7 @@ enum memory_type {
>         MEMORY_DEVICE_PRIVATE = 1,
>         MEMORY_DEVICE_PUBLIC,
>         MEMORY_DEVICE_FS_DAX,
> +       MEMORY_DEVICE_DEV_DAX,

Please add documentation for this new type to the comment block about
this definition.

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
  2018-07-04 15:30   ` Zhang Yi
  (?)
@ 2018-07-04 15:25     ` Paolo Bonzini
  -1 siblings, 0 replies; 36+ messages in thread
From: Paolo Bonzini @ 2018-07-04 15:25 UTC (permalink / raw)
  To: Zhang Yi, kvm, linux-kernel, linux-nvdimm, dan.j.williams, jack,
	hch, yu.c.zhang
  Cc: linux-mm, yi.z.zhang, rkrcmar

On 04/07/2018 17:30, Zhang Yi wrote:
> For device specific memory space, when we move these area of pfn to
> memory zone, we will set the page reserved flag at that time, some of
> these reserved for device mmio, and some of these are not, such as
> NVDIMM pmem.
> 
> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
> backend, since these pages are reserved. the check of
> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
> to indentify these pages are from NVDIMM pmem. and let kvm treat these
> as normal pages.
> 
> Without this patch, Many operations will be missed due to this
> mistreatment to pmem pages. For example, a page may not have chance to
> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
> 
> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
> ---
>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index afb2e6e..1365d18 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
>  {
>  }
>  
> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
> +{
> +	struct page *page = pfn_to_page(pfn);
> +
> +	return is_zone_device_page(page) &&
> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
> +}

If the mm people agree, I'd prefer something that takes a struct page *
and is exported by include/linux/mm.h.  Then KVM can just do something like

	struct page *page;
	if (!pfn_valid(pfn))
		return true;

	page = pfn_to_page(pfn);
	return PageReserved(page) && !is_dax_page(page);

Thanks,

Paolo
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-04 15:25     ` Paolo Bonzini
  0 siblings, 0 replies; 36+ messages in thread
From: Paolo Bonzini @ 2018-07-04 15:25 UTC (permalink / raw)
  To: Zhang Yi, kvm, linux-kernel, linux-nvdimm, dan.j.williams, jack,
	hch, yu.c.zhang
  Cc: linux-mm, rkrcmar, yi.z.zhang

On 04/07/2018 17:30, Zhang Yi wrote:
> For device specific memory space, when we move these area of pfn to
> memory zone, we will set the page reserved flag at that time, some of
> these reserved for device mmio, and some of these are not, such as
> NVDIMM pmem.
> 
> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
> backend, since these pages are reserved. the check of
> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
> to indentify these pages are from NVDIMM pmem. and let kvm treat these
> as normal pages.
> 
> Without this patch, Many operations will be missed due to this
> mistreatment to pmem pages. For example, a page may not have chance to
> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
> 
> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
> ---
>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index afb2e6e..1365d18 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
>  {
>  }
>  
> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
> +{
> +	struct page *page = pfn_to_page(pfn);
> +
> +	return is_zone_device_page(page) &&
> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
> +}

If the mm people agree, I'd prefer something that takes a struct page *
and is exported by include/linux/mm.h.  Then KVM can just do something like

	struct page *page;
	if (!pfn_valid(pfn))
		return true;

	page = pfn_to_page(pfn);
	return PageReserved(page) && !is_dax_page(page);

Thanks,

Paolo

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-04 15:25     ` Paolo Bonzini
  0 siblings, 0 replies; 36+ messages in thread
From: Paolo Bonzini @ 2018-07-04 15:25 UTC (permalink / raw)
  To: Zhang Yi, kvm-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
	dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, jack-AlSwsSmVLrQ,
	hch-jcswGhMUV9g, yu.c.zhang-ral2JQCrhuEAvxtiuMwx3w
  Cc: linux-mm-Bw31MaZKKs3YtjvyW6yDsg,
	yi.z.zhang-ral2JQCrhuEAvxtiuMwx3w,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA

On 04/07/2018 17:30, Zhang Yi wrote:
> For device specific memory space, when we move these area of pfn to
> memory zone, we will set the page reserved flag at that time, some of
> these reserved for device mmio, and some of these are not, such as
> NVDIMM pmem.
> 
> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
> backend, since these pages are reserved. the check of
> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
> to indentify these pages are from NVDIMM pmem. and let kvm treat these
> as normal pages.
> 
> Without this patch, Many operations will be missed due to this
> mistreatment to pmem pages. For example, a page may not have chance to
> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
> 
> Signed-off-by: Zhang Yi <yi.z.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> Signed-off-by: Zhang Yu <yu.c.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> ---
>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index afb2e6e..1365d18 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
>  {
>  }
>  
> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
> +{
> +	struct page *page = pfn_to_page(pfn);
> +
> +	return is_zone_device_page(page) &&
> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
> +}

If the mm people agree, I'd prefer something that takes a struct page *
and is exported by include/linux/mm.h.  Then KVM can just do something like

	struct page *page;
	if (!pfn_valid(pfn))
		return true;

	page = pfn_to_page(pfn);
	return PageReserved(page) && !is_dax_page(page);

Thanks,

Paolo

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
  2018-07-04 14:50     ` Dan Williams
  (?)
@ 2018-07-04 15:27       ` Paolo Bonzini
  -1 siblings, 0 replies; 36+ messages in thread
From: Paolo Bonzini @ 2018-07-04 15:27 UTC (permalink / raw)
  To: Dan Williams, Zhang Yi; +Cc: Jan Kara, KVM list

On 04/07/2018 16:50, Dan Williams wrote:
>> +       return is_zone_device_page(page) &&
>> +               ((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
>> +                (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
> Jerome, might there be any use case to pass MEMORY_DEVICE_PUBLIC
> memory to a guest vm?
> 

An even better reason to place this in mm.h. :)  There should be an
function to tell you if a reserved page has accessed/dirty bits etc.,
that's all that KVM needs to know.

Paolo
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-04 15:27       ` Paolo Bonzini
  0 siblings, 0 replies; 36+ messages in thread
From: Paolo Bonzini @ 2018-07-04 15:27 UTC (permalink / raw)
  To: Dan Williams, Zhang Yi
  Cc: KVM list, Linux Kernel Mailing List, linux-nvdimm, Jan Kara,
	Christoph Hellwig, Zhang, Yu C, Linux MM, rkrcmar, Zhang, Yi Z,
	Jérôme Glisse

On 04/07/2018 16:50, Dan Williams wrote:
>> +       return is_zone_device_page(page) &&
>> +               ((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
>> +                (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
> Jerome, might there be any use case to pass MEMORY_DEVICE_PUBLIC
> memory to a guest vm?
> 

An even better reason to place this in mm.h. :)  There should be an
function to tell you if a reserved page has accessed/dirty bits etc.,
that's all that KVM needs to know.

Paolo

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-04 15:27       ` Paolo Bonzini
  0 siblings, 0 replies; 36+ messages in thread
From: Paolo Bonzini @ 2018-07-04 15:27 UTC (permalink / raw)
  To: Dan Williams, Zhang Yi
  Cc: Jan Kara, KVM list, Zhang, Yu C, linux-nvdimm,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA, Linux Kernel Mailing List,
	Linux MM, Jérôme Glisse, Christoph Hellwig, Zhang,
	Yi Z

On 04/07/2018 16:50, Dan Williams wrote:
>> +       return is_zone_device_page(page) &&
>> +               ((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
>> +                (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
> Jerome, might there be any use case to pass MEMORY_DEVICE_PUBLIC
> memory to a guest vm?
> 

An even better reason to place this in mm.h. :)  There should be an
function to tell you if a reserved page has accessed/dirty bits etc.,
that's all that KVM needs to know.

Paolo

^ permalink raw reply	[flat|nested] 36+ messages in thread

* [PATCH 0/3] Fix kvm misconceives NVDIMM pages as reserved mmio
@ 2018-07-04 15:30 ` Zhang Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm, linux-kernel, linux-nvdimm, pbonzini, dan.j.williams, jack,
	hch, yu.c.zhang
  Cc: linux-mm, yi.z.zhang, rkrcmar

For device specific memory space, when we move these area of pfn to
memory zone, we will set the page reserved flag at that time, some of
these reserved for device mmio, and some of these are not, such as
NVDIMM pmem.

Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
backend, since these pages are reserved. the check of
kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
to indentify these pages are from NVDIMM pmem. and let kvm treat these
as normal pages.

Without this patch, Many operations will be missed due to this
mistreatment to pmem pages. For example, a page may not have chance to
be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.

Zhang Yi (3):
  kvm: remove redundant reserved page check
  mm: introduce memory type MEMORY_DEVICE_DEV_DAX
  kvm: add a function to check if page is from NVDIMM pmem.

 drivers/dax/pmem.c       |  1 +
 include/linux/memremap.h |  1 +
 virt/kvm/kvm_main.c      | 25 +++++++++++++++++--------
 3 files changed, 19 insertions(+), 8 deletions(-)

-- 
2.7.4

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* [PATCH 0/3] Fix kvm misconceives NVDIMM pages as reserved mmio
@ 2018-07-04 15:30 ` Zhang Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm, linux-kernel, linux-nvdimm, pbonzini, dan.j.williams, jack,
	hch, yu.c.zhang
  Cc: linux-mm, rkrcmar, yi.z.zhang, Zhang Yi

For device specific memory space, when we move these area of pfn to
memory zone, we will set the page reserved flag at that time, some of
these reserved for device mmio, and some of these are not, such as
NVDIMM pmem.

Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
backend, since these pages are reserved. the check of
kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
to indentify these pages are from NVDIMM pmem. and let kvm treat these
as normal pages.

Without this patch, Many operations will be missed due to this
mistreatment to pmem pages. For example, a page may not have chance to
be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.

Zhang Yi (3):
  kvm: remove redundant reserved page check
  mm: introduce memory type MEMORY_DEVICE_DEV_DAX
  kvm: add a function to check if page is from NVDIMM pmem.

 drivers/dax/pmem.c       |  1 +
 include/linux/memremap.h |  1 +
 virt/kvm/kvm_main.c      | 25 +++++++++++++++++--------
 3 files changed, 19 insertions(+), 8 deletions(-)

-- 
2.7.4


^ permalink raw reply	[flat|nested] 36+ messages in thread

* [PATCH 0/3] Fix kvm misconceives NVDIMM pages as reserved mmio
@ 2018-07-04 15:30 ` Zhang Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
	pbonzini-H+wXaHxf7aLQT0dZR+AlfA,
	dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, jack-AlSwsSmVLrQ,
	hch-jcswGhMUV9g, yu.c.zhang-ral2JQCrhuEAvxtiuMwx3w
  Cc: linux-mm-Bw31MaZKKs3YtjvyW6yDsg,
	yi.z.zhang-ral2JQCrhuEAvxtiuMwx3w,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA

For device specific memory space, when we move these area of pfn to
memory zone, we will set the page reserved flag at that time, some of
these reserved for device mmio, and some of these are not, such as
NVDIMM pmem.

Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
backend, since these pages are reserved. the check of
kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
to indentify these pages are from NVDIMM pmem. and let kvm treat these
as normal pages.

Without this patch, Many operations will be missed due to this
mistreatment to pmem pages. For example, a page may not have chance to
be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.

Zhang Yi (3):
  kvm: remove redundant reserved page check
  mm: introduce memory type MEMORY_DEVICE_DEV_DAX
  kvm: add a function to check if page is from NVDIMM pmem.

 drivers/dax/pmem.c       |  1 +
 include/linux/memremap.h |  1 +
 virt/kvm/kvm_main.c      | 25 +++++++++++++++++--------
 3 files changed, 19 insertions(+), 8 deletions(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 36+ messages in thread

* [PATCH 1/3] kvm: remove redundant reserved page check
  2018-07-04 15:30 ` Zhang Yi
  (?)
@ 2018-07-04 15:30   ` Zhang Yi
  -1 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm, linux-kernel, linux-nvdimm, pbonzini, dan.j.williams, jack,
	hch, yu.c.zhang
  Cc: linux-mm, yi.z.zhang, rkrcmar

PageReserved() is already checked inside kvm_is_reserved_pfn(),
remove it from kvm_set_pfn_dirty().

Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
---
 virt/kvm/kvm_main.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index c7b2e92..afb2e6e 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1673,12 +1673,8 @@ EXPORT_SYMBOL_GPL(kvm_release_pfn_dirty);
 
 void kvm_set_pfn_dirty(kvm_pfn_t pfn)
 {
-	if (!kvm_is_reserved_pfn(pfn)) {
-		struct page *page = pfn_to_page(pfn);
-
-		if (!PageReserved(page))
-			SetPageDirty(page);
-	}
+	if (!kvm_is_reserved_pfn(pfn))
+		SetPageDirty(pfn_to_page(pfn));
 }
 EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty);
 
-- 
2.7.4

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 1/3] kvm: remove redundant reserved page check
@ 2018-07-04 15:30   ` Zhang Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm, linux-kernel, linux-nvdimm, pbonzini, dan.j.williams, jack,
	hch, yu.c.zhang
  Cc: linux-mm, rkrcmar, yi.z.zhang, Zhang Yi

PageReserved() is already checked inside kvm_is_reserved_pfn(),
remove it from kvm_set_pfn_dirty().

Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
---
 virt/kvm/kvm_main.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index c7b2e92..afb2e6e 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1673,12 +1673,8 @@ EXPORT_SYMBOL_GPL(kvm_release_pfn_dirty);
 
 void kvm_set_pfn_dirty(kvm_pfn_t pfn)
 {
-	if (!kvm_is_reserved_pfn(pfn)) {
-		struct page *page = pfn_to_page(pfn);
-
-		if (!PageReserved(page))
-			SetPageDirty(page);
-	}
+	if (!kvm_is_reserved_pfn(pfn))
+		SetPageDirty(pfn_to_page(pfn));
 }
 EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty);
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 1/3] kvm: remove redundant reserved page check
@ 2018-07-04 15:30   ` Zhang Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
	pbonzini-H+wXaHxf7aLQT0dZR+AlfA,
	dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, jack-AlSwsSmVLrQ,
	hch-jcswGhMUV9g, yu.c.zhang-ral2JQCrhuEAvxtiuMwx3w
  Cc: linux-mm-Bw31MaZKKs3YtjvyW6yDsg,
	yi.z.zhang-ral2JQCrhuEAvxtiuMwx3w,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA

PageReserved() is already checked inside kvm_is_reserved_pfn(),
remove it from kvm_set_pfn_dirty().

Signed-off-by: Zhang Yi <yi.z.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Signed-off-by: Zhang Yu <yu.c.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
---
 virt/kvm/kvm_main.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index c7b2e92..afb2e6e 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1673,12 +1673,8 @@ EXPORT_SYMBOL_GPL(kvm_release_pfn_dirty);
 
 void kvm_set_pfn_dirty(kvm_pfn_t pfn)
 {
-	if (!kvm_is_reserved_pfn(pfn)) {
-		struct page *page = pfn_to_page(pfn);
-
-		if (!PageReserved(page))
-			SetPageDirty(page);
-	}
+	if (!kvm_is_reserved_pfn(pfn))
+		SetPageDirty(pfn_to_page(pfn));
 }
 EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty);
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX
  2018-07-04 15:30 ` Zhang Yi
  (?)
@ 2018-07-04 15:30   ` Zhang Yi
  -1 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm, linux-kernel, linux-nvdimm, pbonzini, dan.j.williams, jack,
	hch, yu.c.zhang
  Cc: linux-mm, yi.z.zhang, rkrcmar

Currently, NVDIMM pages will be marked 'PageReserved'. However, unlike
other reserved PFNs, pages on NVDIMM shall still behave like normal ones
in many cases, i.e. when used as backend memory of KVM guest. This patch
introduces a new memory type, MEMORY_DEVICE_DEV_DAX. Together with the
existing type MEMORY_DEVICE_FS_DAX, we can differentiate the pages on
NVDIMM with the normal reserved pages.

Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
---
 drivers/dax/pmem.c       | 1 +
 include/linux/memremap.h | 1 +
 2 files changed, 2 insertions(+)

diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
index fd49b24..fb3f363 100644
--- a/drivers/dax/pmem.c
+++ b/drivers/dax/pmem.c
@@ -111,6 +111,7 @@ static int dax_pmem_probe(struct device *dev)
 		return rc;
 
 	dax_pmem->pgmap.ref = &dax_pmem->ref;
+	dax_pmem->pgmap.type = MEMORY_DEVICE_DEV_DAX;
 	addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
 	if (IS_ERR(addr))
 		return PTR_ERR(addr);
diff --git a/include/linux/memremap.h b/include/linux/memremap.h
index 5ebfff6..4127bf7 100644
--- a/include/linux/memremap.h
+++ b/include/linux/memremap.h
@@ -58,6 +58,7 @@ enum memory_type {
 	MEMORY_DEVICE_PRIVATE = 1,
 	MEMORY_DEVICE_PUBLIC,
 	MEMORY_DEVICE_FS_DAX,
+	MEMORY_DEVICE_DEV_DAX,
 };
 
 /*
-- 
2.7.4

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX
@ 2018-07-04 15:30   ` Zhang Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm, linux-kernel, linux-nvdimm, pbonzini, dan.j.williams, jack,
	hch, yu.c.zhang
  Cc: linux-mm, rkrcmar, yi.z.zhang, Zhang Yi

Currently, NVDIMM pages will be marked 'PageReserved'. However, unlike
other reserved PFNs, pages on NVDIMM shall still behave like normal ones
in many cases, i.e. when used as backend memory of KVM guest. This patch
introduces a new memory type, MEMORY_DEVICE_DEV_DAX. Together with the
existing type MEMORY_DEVICE_FS_DAX, we can differentiate the pages on
NVDIMM with the normal reserved pages.

Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
---
 drivers/dax/pmem.c       | 1 +
 include/linux/memremap.h | 1 +
 2 files changed, 2 insertions(+)

diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
index fd49b24..fb3f363 100644
--- a/drivers/dax/pmem.c
+++ b/drivers/dax/pmem.c
@@ -111,6 +111,7 @@ static int dax_pmem_probe(struct device *dev)
 		return rc;
 
 	dax_pmem->pgmap.ref = &dax_pmem->ref;
+	dax_pmem->pgmap.type = MEMORY_DEVICE_DEV_DAX;
 	addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
 	if (IS_ERR(addr))
 		return PTR_ERR(addr);
diff --git a/include/linux/memremap.h b/include/linux/memremap.h
index 5ebfff6..4127bf7 100644
--- a/include/linux/memremap.h
+++ b/include/linux/memremap.h
@@ -58,6 +58,7 @@ enum memory_type {
 	MEMORY_DEVICE_PRIVATE = 1,
 	MEMORY_DEVICE_PUBLIC,
 	MEMORY_DEVICE_FS_DAX,
+	MEMORY_DEVICE_DEV_DAX,
 };
 
 /*
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX
@ 2018-07-04 15:30   ` Zhang Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
	pbonzini-H+wXaHxf7aLQT0dZR+AlfA,
	dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, jack-AlSwsSmVLrQ,
	hch-jcswGhMUV9g, yu.c.zhang-ral2JQCrhuEAvxtiuMwx3w
  Cc: linux-mm-Bw31MaZKKs3YtjvyW6yDsg,
	yi.z.zhang-ral2JQCrhuEAvxtiuMwx3w,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA

Currently, NVDIMM pages will be marked 'PageReserved'. However, unlike
other reserved PFNs, pages on NVDIMM shall still behave like normal ones
in many cases, i.e. when used as backend memory of KVM guest. This patch
introduces a new memory type, MEMORY_DEVICE_DEV_DAX. Together with the
existing type MEMORY_DEVICE_FS_DAX, we can differentiate the pages on
NVDIMM with the normal reserved pages.

Signed-off-by: Zhang Yi <yi.z.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Signed-off-by: Zhang Yu <yu.c.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
---
 drivers/dax/pmem.c       | 1 +
 include/linux/memremap.h | 1 +
 2 files changed, 2 insertions(+)

diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
index fd49b24..fb3f363 100644
--- a/drivers/dax/pmem.c
+++ b/drivers/dax/pmem.c
@@ -111,6 +111,7 @@ static int dax_pmem_probe(struct device *dev)
 		return rc;
 
 	dax_pmem->pgmap.ref = &dax_pmem->ref;
+	dax_pmem->pgmap.type = MEMORY_DEVICE_DEV_DAX;
 	addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
 	if (IS_ERR(addr))
 		return PTR_ERR(addr);
diff --git a/include/linux/memremap.h b/include/linux/memremap.h
index 5ebfff6..4127bf7 100644
--- a/include/linux/memremap.h
+++ b/include/linux/memremap.h
@@ -58,6 +58,7 @@ enum memory_type {
 	MEMORY_DEVICE_PRIVATE = 1,
 	MEMORY_DEVICE_PUBLIC,
 	MEMORY_DEVICE_FS_DAX,
+	MEMORY_DEVICE_DEV_DAX,
 };
 
 /*
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
  2018-07-04 15:30 ` Zhang Yi
  (?)
@ 2018-07-04 15:30   ` Zhang Yi
  -1 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm, linux-kernel, linux-nvdimm, pbonzini, dan.j.williams, jack,
	hch, yu.c.zhang
  Cc: linux-mm, yi.z.zhang, rkrcmar

For device specific memory space, when we move these area of pfn to
memory zone, we will set the page reserved flag at that time, some of
these reserved for device mmio, and some of these are not, such as
NVDIMM pmem.

Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
backend, since these pages are reserved. the check of
kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
to indentify these pages are from NVDIMM pmem. and let kvm treat these
as normal pages.

Without this patch, Many operations will be missed due to this
mistreatment to pmem pages. For example, a page may not have chance to
be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.

Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
---
 virt/kvm/kvm_main.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index afb2e6e..1365d18 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
 {
 }
 
+static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
+{
+	struct page *page = pfn_to_page(pfn);
+
+	return is_zone_device_page(page) &&
+		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
+		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
+}
+
 bool kvm_is_reserved_pfn(kvm_pfn_t pfn)
 {
-	if (pfn_valid(pfn))
-		return PageReserved(pfn_to_page(pfn));
+	struct page *page;
+
+	if (pfn_valid(pfn)) {
+		page = pfn_to_page(pfn);
+		return kvm_is_nd_pfn(pfn) ? false : PageReserved(page);
+	}
 
 	return true;
 }
-- 
2.7.4

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-04 15:30   ` Zhang Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm, linux-kernel, linux-nvdimm, pbonzini, dan.j.williams, jack,
	hch, yu.c.zhang
  Cc: linux-mm, rkrcmar, yi.z.zhang, Zhang Yi

For device specific memory space, when we move these area of pfn to
memory zone, we will set the page reserved flag at that time, some of
these reserved for device mmio, and some of these are not, such as
NVDIMM pmem.

Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
backend, since these pages are reserved. the check of
kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
to indentify these pages are from NVDIMM pmem. and let kvm treat these
as normal pages.

Without this patch, Many operations will be missed due to this
mistreatment to pmem pages. For example, a page may not have chance to
be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.

Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
---
 virt/kvm/kvm_main.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index afb2e6e..1365d18 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
 {
 }
 
+static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
+{
+	struct page *page = pfn_to_page(pfn);
+
+	return is_zone_device_page(page) &&
+		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
+		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
+}
+
 bool kvm_is_reserved_pfn(kvm_pfn_t pfn)
 {
-	if (pfn_valid(pfn))
-		return PageReserved(pfn_to_page(pfn));
+	struct page *page;
+
+	if (pfn_valid(pfn)) {
+		page = pfn_to_page(pfn);
+		return kvm_is_nd_pfn(pfn) ? false : PageReserved(page);
+	}
 
 	return true;
 }
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-04 15:30   ` Zhang Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang Yi @ 2018-07-04 15:30 UTC (permalink / raw)
  To: kvm-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
	pbonzini-H+wXaHxf7aLQT0dZR+AlfA,
	dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, jack-AlSwsSmVLrQ,
	hch-jcswGhMUV9g, yu.c.zhang-ral2JQCrhuEAvxtiuMwx3w
  Cc: linux-mm-Bw31MaZKKs3YtjvyW6yDsg,
	yi.z.zhang-ral2JQCrhuEAvxtiuMwx3w,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA

For device specific memory space, when we move these area of pfn to
memory zone, we will set the page reserved flag at that time, some of
these reserved for device mmio, and some of these are not, such as
NVDIMM pmem.

Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
backend, since these pages are reserved. the check of
kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
to indentify these pages are from NVDIMM pmem. and let kvm treat these
as normal pages.

Without this patch, Many operations will be missed due to this
mistreatment to pmem pages. For example, a page may not have chance to
be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.

Signed-off-by: Zhang Yi <yi.z.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Signed-off-by: Zhang Yu <yu.c.zhang-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
---
 virt/kvm/kvm_main.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index afb2e6e..1365d18 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
 {
 }
 
+static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
+{
+	struct page *page = pfn_to_page(pfn);
+
+	return is_zone_device_page(page) &&
+		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
+		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
+}
+
 bool kvm_is_reserved_pfn(kvm_pfn_t pfn)
 {
-	if (pfn_valid(pfn))
-		return PageReserved(pfn_to_page(pfn));
+	struct page *page;
+
+	if (pfn_valid(pfn)) {
+		page = pfn_to_page(pfn);
+		return kvm_is_nd_pfn(pfn) ? false : PageReserved(page);
+	}
 
 	return true;
 }
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
  2018-07-04 15:25     ` Paolo Bonzini
  (?)
  (?)
@ 2018-07-05 13:19       ` Zhang,Yi
  -1 siblings, 0 replies; 36+ messages in thread
From: Zhang,Yi @ 2018-07-05 13:19 UTC (permalink / raw)
  To: Paolo Bonzini, kvm, linux-kernel, linux-nvdimm, dan.j.williams,
	jack, hch, yu.c.zhang
  Cc: linux-mm, yi.z.zhang, rkrcmar



On 2018年07月04日 23:25, Paolo Bonzini wrote:
> On 04/07/2018 17:30, Zhang Yi wrote:
>> For device specific memory space, when we move these area of pfn to
>> memory zone, we will set the page reserved flag at that time, some of
>> these reserved for device mmio, and some of these are not, such as
>> NVDIMM pmem.
>>
>> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
>> backend, since these pages are reserved. the check of
>> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
>> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
>> to indentify these pages are from NVDIMM pmem. and let kvm treat these
>> as normal pages.
>>
>> Without this patch, Many operations will be missed due to this
>> mistreatment to pmem pages. For example, a page may not have chance to
>> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
>> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
>>
>> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
>> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
>> ---
>>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
>>  1 file changed, 15 insertions(+), 2 deletions(-)
>>
>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
>> index afb2e6e..1365d18 100644
>> --- a/virt/kvm/kvm_main.c
>> +++ b/virt/kvm/kvm_main.c
>> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
>>  {
>>  }
>>  
>> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
>> +{
>> +	struct page *page = pfn_to_page(pfn);
>> +
>> +	return is_zone_device_page(page) &&
>> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
>> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
>> +}
> If the mm people agree, I'd prefer something that takes a struct page *
> and is exported by include/linux/mm.h.  Then KVM can just do something like
>
> 	struct page *page;
> 	if (!pfn_valid(pfn))
> 		return true;
>
> 	page = pfn_to_page(pfn);
> 	return PageReserved(page) && !is_dax_page(page);
>
> Thanks,
>
> Paolo
Yeah, that could be much better. Thanks for your comments Paolo.

Hi Kara, Do u have Any opinions/ideas to add such definition in mm?

Regards,
Yi
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-05 13:19       ` Zhang,Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang,Yi @ 2018-07-05 13:19 UTC (permalink / raw)
  To: Paolo Bonzini, kvm, linux-kernel, linux-nvdimm, dan.j.williams,
	jack, hch, yu.c.zhang
  Cc: linux-mm, rkrcmar, yi.z.zhang



On 2018年07月04日 23:25, Paolo Bonzini wrote:
> On 04/07/2018 17:30, Zhang Yi wrote:
>> For device specific memory space, when we move these area of pfn to
>> memory zone, we will set the page reserved flag at that time, some of
>> these reserved for device mmio, and some of these are not, such as
>> NVDIMM pmem.
>>
>> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
>> backend, since these pages are reserved. the check of
>> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
>> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
>> to indentify these pages are from NVDIMM pmem. and let kvm treat these
>> as normal pages.
>>
>> Without this patch, Many operations will be missed due to this
>> mistreatment to pmem pages. For example, a page may not have chance to
>> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
>> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
>>
>> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
>> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
>> ---
>>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
>>  1 file changed, 15 insertions(+), 2 deletions(-)
>>
>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
>> index afb2e6e..1365d18 100644
>> --- a/virt/kvm/kvm_main.c
>> +++ b/virt/kvm/kvm_main.c
>> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
>>  {
>>  }
>>  
>> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
>> +{
>> +	struct page *page = pfn_to_page(pfn);
>> +
>> +	return is_zone_device_page(page) &&
>> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
>> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
>> +}
> If the mm people agree, I'd prefer something that takes a struct page *
> and is exported by include/linux/mm.h.  Then KVM can just do something like
>
> 	struct page *page;
> 	if (!pfn_valid(pfn))
> 		return true;
>
> 	page = pfn_to_page(pfn);
> 	return PageReserved(page) && !is_dax_page(page);
>
> Thanks,
>
> Paolo
Yeah, that could be much better. Thanks for your comments Paolo.

Hi Kara, Do u have Any opinions/ideas to add such definition in mm?

Regards,
Yi

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-05 13:19       ` Zhang,Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang,Yi @ 2018-07-05 13:19 UTC (permalink / raw)
  To: Paolo Bonzini, kvm-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
	dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, jack-AlSwsSmVLrQ,
	hch-jcswGhMUV9g, yu.c.zhang-ral2JQCrhuEAvxtiuMwx3w
  Cc: linux-mm-Bw31MaZKKs3YtjvyW6yDsg,
	yi.z.zhang-ral2JQCrhuEAvxtiuMwx3w,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA



On 2018年07月04日 23:25, Paolo Bonzini wrote:
> On 04/07/2018 17:30, Zhang Yi wrote:
>> For device specific memory space, when we move these area of pfn to
>> memory zone, we will set the page reserved flag at that time, some of
>> these reserved for device mmio, and some of these are not, such as
>> NVDIMM pmem.
>>
>> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
>> backend, since these pages are reserved. the check of
>> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
>> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
>> to indentify these pages are from NVDIMM pmem. and let kvm treat these
>> as normal pages.
>>
>> Without this patch, Many operations will be missed due to this
>> mistreatment to pmem pages. For example, a page may not have chance to
>> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
>> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
>>
>> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
>> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
>> ---
>>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
>>  1 file changed, 15 insertions(+), 2 deletions(-)
>>
>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
>> index afb2e6e..1365d18 100644
>> --- a/virt/kvm/kvm_main.c
>> +++ b/virt/kvm/kvm_main.c
>> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
>>  {
>>  }
>>  
>> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
>> +{
>> +	struct page *page = pfn_to_page(pfn);
>> +
>> +	return is_zone_device_page(page) &&
>> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
>> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
>> +}
> If the mm people agree, I'd prefer something that takes a struct page *
> and is exported by include/linux/mm.h.  Then KVM can just do something like
>
> 	struct page *page;
> 	if (!pfn_valid(pfn))
> 		return true;
>
> 	page = pfn_to_page(pfn);
> 	return PageReserved(page) && !is_dax_page(page);
>
> Thanks,
>
> Paolo
Yeah, that could be much better. Thanks for your comments Paolo.

Hi Kara, Do u have Any opinions/ideas to add such definition in mm?

Regards,
Yi
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-05 13:19       ` Zhang,Yi
  0 siblings, 0 replies; 36+ messages in thread
From: Zhang,Yi @ 2018-07-05 13:19 UTC (permalink / raw)
  To: Paolo Bonzini, kvm, linux-kernel, linux-nvdimm, dan.j.williams,
	jack, hch, yu.c.zhang
  Cc: linux-mm, rkrcmar, yi.z.zhang



On 2018a1'07ae??04ae?JPY 23:25, Paolo Bonzini wrote:
> On 04/07/2018 17:30, Zhang Yi wrote:
>> For device specific memory space, when we move these area of pfn to
>> memory zone, we will set the page reserved flag at that time, some of
>> these reserved for device mmio, and some of these are not, such as
>> NVDIMM pmem.
>>
>> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
>> backend, since these pages are reserved. the check of
>> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
>> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
>> to indentify these pages are from NVDIMM pmem. and let kvm treat these
>> as normal pages.
>>
>> Without this patch, Many operations will be missed due to this
>> mistreatment to pmem pages. For example, a page may not have chance to
>> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
>> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
>>
>> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
>> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
>> ---
>>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
>>  1 file changed, 15 insertions(+), 2 deletions(-)
>>
>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
>> index afb2e6e..1365d18 100644
>> --- a/virt/kvm/kvm_main.c
>> +++ b/virt/kvm/kvm_main.c
>> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
>>  {
>>  }
>>  
>> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
>> +{
>> +	struct page *page = pfn_to_page(pfn);
>> +
>> +	return is_zone_device_page(page) &&
>> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
>> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
>> +}
> If the mm people agree, I'd prefer something that takes a struct page *
> and is exported by include/linux/mm.h.  Then KVM can just do something like
>
> 	struct page *page;
> 	if (!pfn_valid(pfn))
> 		return true;
>
> 	page = pfn_to_page(pfn);
> 	return PageReserved(page) && !is_dax_page(page);
>
> Thanks,
>
> Paolo
Yeah, that could be much better. Thanks for your comments Paolo.

Hi Kara, Do u have Any opinions/ideas to add such definition in mm?

Regards,
Yi

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX
  2018-07-04 14:50     ` Dan Williams
  (?)
  (?)
@ 2018-07-05 13:20       ` zhangyi6
  -1 siblings, 0 replies; 36+ messages in thread
From: zhangyi6 @ 2018-07-05 13:20 UTC (permalink / raw)
  To: Dan Williams, Zhang Yi
  Cc: Jan Kara, Zhang, Yu C, KVM list, linux-nvdimm, rkrcmar,
	Linux Kernel Mailing List, Linux MM, Paolo Bonzini,
	Christoph Hellwig



On 2018年07月04日 22:50, Dan Williams wrote:
> On Wed, Jul 4, 2018 at 8:30 AM, Zhang Yi <yi.z.zhang@linux.intel.com> wrote:
>> Currently, NVDIMM pages will be marked 'PageReserved'. However, unlike
>> other reserved PFNs, pages on NVDIMM shall still behave like normal ones
>> in many cases, i.e. when used as backend memory of KVM guest. This patch
>> introduces a new memory type, MEMORY_DEVICE_DEV_DAX. Together with the
>> existing type MEMORY_DEVICE_FS_DAX, we can differentiate the pages on
>> NVDIMM with the normal reserved pages.
>>
>> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
>> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
>> ---
>>  drivers/dax/pmem.c       | 1 +
>>  include/linux/memremap.h | 1 +
>>  2 files changed, 2 insertions(+)
>>
>> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
>> index fd49b24..fb3f363 100644
>> --- a/drivers/dax/pmem.c
>> +++ b/drivers/dax/pmem.c
>> @@ -111,6 +111,7 @@ static int dax_pmem_probe(struct device *dev)
>>                 return rc;
>>
>>         dax_pmem->pgmap.ref = &dax_pmem->ref;
>> +       dax_pmem->pgmap.type = MEMORY_DEVICE_DEV_DAX;
>>         addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
>>         if (IS_ERR(addr))
>>                 return PTR_ERR(addr);
>> diff --git a/include/linux/memremap.h b/include/linux/memremap.h
>> index 5ebfff6..4127bf7 100644
>> --- a/include/linux/memremap.h
>> +++ b/include/linux/memremap.h
>> @@ -58,6 +58,7 @@ enum memory_type {
>>         MEMORY_DEVICE_PRIVATE = 1,
>>         MEMORY_DEVICE_PUBLIC,
>>         MEMORY_DEVICE_FS_DAX,
>> +       MEMORY_DEVICE_DEV_DAX,
> Please add documentation for this new type to the comment block about
> this definition.
Thanks for your comments Dan, Will add it in next version,
Regards
Yi.
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX
@ 2018-07-05 13:20       ` zhangyi6
  0 siblings, 0 replies; 36+ messages in thread
From: zhangyi6 @ 2018-07-05 13:20 UTC (permalink / raw)
  To: Dan Williams, Zhang Yi
  Cc: KVM list, Linux Kernel Mailing List, linux-nvdimm, Paolo Bonzini,
	Jan Kara, Christoph Hellwig, Zhang, Yu C, Linux MM, rkrcmar



On 2018年07月04日 22:50, Dan Williams wrote:
> On Wed, Jul 4, 2018 at 8:30 AM, Zhang Yi <yi.z.zhang@linux.intel.com> wrote:
>> Currently, NVDIMM pages will be marked 'PageReserved'. However, unlike
>> other reserved PFNs, pages on NVDIMM shall still behave like normal ones
>> in many cases, i.e. when used as backend memory of KVM guest. This patch
>> introduces a new memory type, MEMORY_DEVICE_DEV_DAX. Together with the
>> existing type MEMORY_DEVICE_FS_DAX, we can differentiate the pages on
>> NVDIMM with the normal reserved pages.
>>
>> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
>> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
>> ---
>>  drivers/dax/pmem.c       | 1 +
>>  include/linux/memremap.h | 1 +
>>  2 files changed, 2 insertions(+)
>>
>> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
>> index fd49b24..fb3f363 100644
>> --- a/drivers/dax/pmem.c
>> +++ b/drivers/dax/pmem.c
>> @@ -111,6 +111,7 @@ static int dax_pmem_probe(struct device *dev)
>>                 return rc;
>>
>>         dax_pmem->pgmap.ref = &dax_pmem->ref;
>> +       dax_pmem->pgmap.type = MEMORY_DEVICE_DEV_DAX;
>>         addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
>>         if (IS_ERR(addr))
>>                 return PTR_ERR(addr);
>> diff --git a/include/linux/memremap.h b/include/linux/memremap.h
>> index 5ebfff6..4127bf7 100644
>> --- a/include/linux/memremap.h
>> +++ b/include/linux/memremap.h
>> @@ -58,6 +58,7 @@ enum memory_type {
>>         MEMORY_DEVICE_PRIVATE = 1,
>>         MEMORY_DEVICE_PUBLIC,
>>         MEMORY_DEVICE_FS_DAX,
>> +       MEMORY_DEVICE_DEV_DAX,
> Please add documentation for this new type to the comment block about
> this definition.
Thanks for your comments Dan, Will add it in next version,
Regards
Yi.

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX
@ 2018-07-05 13:20       ` zhangyi6
  0 siblings, 0 replies; 36+ messages in thread
From: zhangyi6 @ 2018-07-05 13:20 UTC (permalink / raw)
  To: Dan Williams, Zhang Yi
  Cc: Jan Kara, Zhang, Yu C, KVM list, linux-nvdimm,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA, Linux Kernel Mailing List,
	Linux MM, Paolo Bonzini, Christoph Hellwig



On 2018年07月04日 22:50, Dan Williams wrote:
> On Wed, Jul 4, 2018 at 8:30 AM, Zhang Yi <yi.z.zhang@linux.intel.com> wrote:
>> Currently, NVDIMM pages will be marked 'PageReserved'. However, unlike
>> other reserved PFNs, pages on NVDIMM shall still behave like normal ones
>> in many cases, i.e. when used as backend memory of KVM guest. This patch
>> introduces a new memory type, MEMORY_DEVICE_DEV_DAX. Together with the
>> existing type MEMORY_DEVICE_FS_DAX, we can differentiate the pages on
>> NVDIMM with the normal reserved pages.
>>
>> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
>> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
>> ---
>>  drivers/dax/pmem.c       | 1 +
>>  include/linux/memremap.h | 1 +
>>  2 files changed, 2 insertions(+)
>>
>> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
>> index fd49b24..fb3f363 100644
>> --- a/drivers/dax/pmem.c
>> +++ b/drivers/dax/pmem.c
>> @@ -111,6 +111,7 @@ static int dax_pmem_probe(struct device *dev)
>>                 return rc;
>>
>>         dax_pmem->pgmap.ref = &dax_pmem->ref;
>> +       dax_pmem->pgmap.type = MEMORY_DEVICE_DEV_DAX;
>>         addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
>>         if (IS_ERR(addr))
>>                 return PTR_ERR(addr);
>> diff --git a/include/linux/memremap.h b/include/linux/memremap.h
>> index 5ebfff6..4127bf7 100644
>> --- a/include/linux/memremap.h
>> +++ b/include/linux/memremap.h
>> @@ -58,6 +58,7 @@ enum memory_type {
>>         MEMORY_DEVICE_PRIVATE = 1,
>>         MEMORY_DEVICE_PUBLIC,
>>         MEMORY_DEVICE_FS_DAX,
>> +       MEMORY_DEVICE_DEV_DAX,
> Please add documentation for this new type to the comment block about
> this definition.
Thanks for your comments Dan, Will add it in next version,
Regards
Yi.
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX
@ 2018-07-05 13:20       ` zhangyi6
  0 siblings, 0 replies; 36+ messages in thread
From: zhangyi6 @ 2018-07-05 13:20 UTC (permalink / raw)
  To: Dan Williams, Zhang Yi
  Cc: KVM list, Linux Kernel Mailing List, linux-nvdimm, Paolo Bonzini,
	Jan Kara, Christoph Hellwig, Zhang, Yu C, Linux MM, rkrcmar



On 2018a1'07ae??04ae?JPY 22:50, Dan Williams wrote:
> On Wed, Jul 4, 2018 at 8:30 AM, Zhang Yi <yi.z.zhang@linux.intel.com> wrote:
>> Currently, NVDIMM pages will be marked 'PageReserved'. However, unlike
>> other reserved PFNs, pages on NVDIMM shall still behave like normal ones
>> in many cases, i.e. when used as backend memory of KVM guest. This patch
>> introduces a new memory type, MEMORY_DEVICE_DEV_DAX. Together with the
>> existing type MEMORY_DEVICE_FS_DAX, we can differentiate the pages on
>> NVDIMM with the normal reserved pages.
>>
>> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
>> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
>> ---
>>  drivers/dax/pmem.c       | 1 +
>>  include/linux/memremap.h | 1 +
>>  2 files changed, 2 insertions(+)
>>
>> diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
>> index fd49b24..fb3f363 100644
>> --- a/drivers/dax/pmem.c
>> +++ b/drivers/dax/pmem.c
>> @@ -111,6 +111,7 @@ static int dax_pmem_probe(struct device *dev)
>>                 return rc;
>>
>>         dax_pmem->pgmap.ref = &dax_pmem->ref;
>> +       dax_pmem->pgmap.type = MEMORY_DEVICE_DEV_DAX;
>>         addr = devm_memremap_pages(dev, &dax_pmem->pgmap);
>>         if (IS_ERR(addr))
>>                 return PTR_ERR(addr);
>> diff --git a/include/linux/memremap.h b/include/linux/memremap.h
>> index 5ebfff6..4127bf7 100644
>> --- a/include/linux/memremap.h
>> +++ b/include/linux/memremap.h
>> @@ -58,6 +58,7 @@ enum memory_type {
>>         MEMORY_DEVICE_PRIVATE = 1,
>>         MEMORY_DEVICE_PUBLIC,
>>         MEMORY_DEVICE_FS_DAX,
>> +       MEMORY_DEVICE_DEV_DAX,
> Please add documentation for this new type to the comment block about
> this definition.
Thanks for your comments Dan, Will add it in next version,
Regards
Yi.

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
  2018-07-05 13:19       ` Zhang,Yi
  (?)
  (?)
@ 2018-07-09 12:36         ` Jan Kara
  -1 siblings, 0 replies; 36+ messages in thread
From: Jan Kara @ 2018-07-09 12:36 UTC (permalink / raw)
  To: Zhang,Yi
  Cc: jack, yu.c.zhang, kvm, linux-nvdimm, rkrcmar, linux-kernel,
	linux-mm, Paolo Bonzini, hch, yi.z.zhang

On Thu 05-07-18 21:19:30, Zhang,Yi wrote:
> 
> 
> On 2018年07月04日 23:25, Paolo Bonzini wrote:
> > On 04/07/2018 17:30, Zhang Yi wrote:
> >> For device specific memory space, when we move these area of pfn to
> >> memory zone, we will set the page reserved flag at that time, some of
> >> these reserved for device mmio, and some of these are not, such as
> >> NVDIMM pmem.
> >>
> >> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
> >> backend, since these pages are reserved. the check of
> >> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
> >> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
> >> to indentify these pages are from NVDIMM pmem. and let kvm treat these
> >> as normal pages.
> >>
> >> Without this patch, Many operations will be missed due to this
> >> mistreatment to pmem pages. For example, a page may not have chance to
> >> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
> >> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
> >>
> >> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
> >> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
> >> ---
> >>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
> >>  1 file changed, 15 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> >> index afb2e6e..1365d18 100644
> >> --- a/virt/kvm/kvm_main.c
> >> +++ b/virt/kvm/kvm_main.c
> >> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
> >>  {
> >>  }
> >>  
> >> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
> >> +{
> >> +	struct page *page = pfn_to_page(pfn);
> >> +
> >> +	return is_zone_device_page(page) &&
> >> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
> >> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
> >> +}
> > If the mm people agree, I'd prefer something that takes a struct page *
> > and is exported by include/linux/mm.h.  Then KVM can just do something like
> >
> > 	struct page *page;
> > 	if (!pfn_valid(pfn))
> > 		return true;
> >
> > 	page = pfn_to_page(pfn);
> > 	return PageReserved(page) && !is_dax_page(page);
> >
> > Thanks,
> >
> > Paolo
> Yeah, that could be much better. Thanks for your comments Paolo.
> 
> Hi Kara, Do u have Any opinions/ideas to add such definition in mm?

What Paolo suggests sounds good to me.

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-09 12:36         ` Jan Kara
  0 siblings, 0 replies; 36+ messages in thread
From: Jan Kara @ 2018-07-09 12:36 UTC (permalink / raw)
  To: Zhang,Yi
  Cc: Paolo Bonzini, kvm, linux-kernel, linux-nvdimm, dan.j.williams,
	jack, hch, yu.c.zhang, linux-mm, rkrcmar, yi.z.zhang

On Thu 05-07-18 21:19:30, Zhang,Yi wrote:
> 
> 
> On 2018年07月04日 23:25, Paolo Bonzini wrote:
> > On 04/07/2018 17:30, Zhang Yi wrote:
> >> For device specific memory space, when we move these area of pfn to
> >> memory zone, we will set the page reserved flag at that time, some of
> >> these reserved for device mmio, and some of these are not, such as
> >> NVDIMM pmem.
> >>
> >> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
> >> backend, since these pages are reserved. the check of
> >> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
> >> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
> >> to indentify these pages are from NVDIMM pmem. and let kvm treat these
> >> as normal pages.
> >>
> >> Without this patch, Many operations will be missed due to this
> >> mistreatment to pmem pages. For example, a page may not have chance to
> >> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
> >> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
> >>
> >> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
> >> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
> >> ---
> >>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
> >>  1 file changed, 15 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> >> index afb2e6e..1365d18 100644
> >> --- a/virt/kvm/kvm_main.c
> >> +++ b/virt/kvm/kvm_main.c
> >> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
> >>  {
> >>  }
> >>  
> >> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
> >> +{
> >> +	struct page *page = pfn_to_page(pfn);
> >> +
> >> +	return is_zone_device_page(page) &&
> >> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
> >> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
> >> +}
> > If the mm people agree, I'd prefer something that takes a struct page *
> > and is exported by include/linux/mm.h.  Then KVM can just do something like
> >
> > 	struct page *page;
> > 	if (!pfn_valid(pfn))
> > 		return true;
> >
> > 	page = pfn_to_page(pfn);
> > 	return PageReserved(page) && !is_dax_page(page);
> >
> > Thanks,
> >
> > Paolo
> Yeah, that could be much better. Thanks for your comments Paolo.
> 
> Hi Kara, Do u have Any opinions/ideas to add such definition in mm?

What Paolo suggests sounds good to me.

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-09 12:36         ` Jan Kara
  0 siblings, 0 replies; 36+ messages in thread
From: Jan Kara @ 2018-07-09 12:36 UTC (permalink / raw)
  To: Zhang,Yi
  Cc: jack-AlSwsSmVLrQ, yu.c.zhang-ral2JQCrhuEAvxtiuMwx3w,
	kvm-u79uwXL29TY76Z2rM5mHXA, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw,
	rkrcmar-H+wXaHxf7aLQT0dZR+AlfA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-mm-Bw31MaZKKs3YtjvyW6yDsg, Paolo Bonzini, hch-jcswGhMUV9g,
	yi.z.zhang-ral2JQCrhuEAvxtiuMwx3w

On Thu 05-07-18 21:19:30, Zhang,Yi wrote:
> 
> 
> On 2018年07月04日 23:25, Paolo Bonzini wrote:
> > On 04/07/2018 17:30, Zhang Yi wrote:
> >> For device specific memory space, when we move these area of pfn to
> >> memory zone, we will set the page reserved flag at that time, some of
> >> these reserved for device mmio, and some of these are not, such as
> >> NVDIMM pmem.
> >>
> >> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
> >> backend, since these pages are reserved. the check of
> >> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
> >> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
> >> to indentify these pages are from NVDIMM pmem. and let kvm treat these
> >> as normal pages.
> >>
> >> Without this patch, Many operations will be missed due to this
> >> mistreatment to pmem pages. For example, a page may not have chance to
> >> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
> >> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
> >>
> >> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
> >> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
> >> ---
> >>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
> >>  1 file changed, 15 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> >> index afb2e6e..1365d18 100644
> >> --- a/virt/kvm/kvm_main.c
> >> +++ b/virt/kvm/kvm_main.c
> >> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
> >>  {
> >>  }
> >>  
> >> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
> >> +{
> >> +	struct page *page = pfn_to_page(pfn);
> >> +
> >> +	return is_zone_device_page(page) &&
> >> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
> >> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
> >> +}
> > If the mm people agree, I'd prefer something that takes a struct page *
> > and is exported by include/linux/mm.h.  Then KVM can just do something like
> >
> > 	struct page *page;
> > 	if (!pfn_valid(pfn))
> > 		return true;
> >
> > 	page = pfn_to_page(pfn);
> > 	return PageReserved(page) && !is_dax_page(page);
> >
> > Thanks,
> >
> > Paolo
> Yeah, that could be much better. Thanks for your comments Paolo.
> 
> Hi Kara, Do u have Any opinions/ideas to add such definition in mm?

What Paolo suggests sounds good to me.

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem.
@ 2018-07-09 12:36         ` Jan Kara
  0 siblings, 0 replies; 36+ messages in thread
From: Jan Kara @ 2018-07-09 12:36 UTC (permalink / raw)
  To: Zhang,Yi
  Cc: Paolo Bonzini, kvm, linux-kernel, linux-nvdimm, dan.j.williams,
	jack, hch, yu.c.zhang, linux-mm, rkrcmar, yi.z.zhang

On Thu 05-07-18 21:19:30, Zhang,Yi wrote:
> 
> 
> On 2018a1'07ae??04ae?JPY 23:25, Paolo Bonzini wrote:
> > On 04/07/2018 17:30, Zhang Yi wrote:
> >> For device specific memory space, when we move these area of pfn to
> >> memory zone, we will set the page reserved flag at that time, some of
> >> these reserved for device mmio, and some of these are not, such as
> >> NVDIMM pmem.
> >>
> >> Now, we map these dev_dax or fs_dax pages to kvm for DIMM/NVDIMM
> >> backend, since these pages are reserved. the check of
> >> kvm_is_reserved_pfn() misconceives those pages as MMIO. Therefor, we
> >> introduce 2 page map types, MEMORY_DEVICE_FS_DAX/MEMORY_DEVICE_DEV_DAX,
> >> to indentify these pages are from NVDIMM pmem. and let kvm treat these
> >> as normal pages.
> >>
> >> Without this patch, Many operations will be missed due to this
> >> mistreatment to pmem pages. For example, a page may not have chance to
> >> be unpinned for KVM guest(in kvm_release_pfn_clean); not able to be
> >> marked as dirty/accessed(in kvm_set_pfn_dirty/accessed) etc.
> >>
> >> Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com>
> >> Signed-off-by: Zhang Yu <yu.c.zhang@linux.intel.com>
> >> ---
> >>  virt/kvm/kvm_main.c | 17 +++++++++++++++--
> >>  1 file changed, 15 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> >> index afb2e6e..1365d18 100644
> >> --- a/virt/kvm/kvm_main.c
> >> +++ b/virt/kvm/kvm_main.c
> >> @@ -140,10 +140,23 @@ __weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
> >>  {
> >>  }
> >>  
> >> +static bool kvm_is_nd_pfn(kvm_pfn_t pfn)
> >> +{
> >> +	struct page *page = pfn_to_page(pfn);
> >> +
> >> +	return is_zone_device_page(page) &&
> >> +		((page->pgmap->type == MEMORY_DEVICE_FS_DAX) ||
> >> +		 (page->pgmap->type == MEMORY_DEVICE_DEV_DAX));
> >> +}
> > If the mm people agree, I'd prefer something that takes a struct page *
> > and is exported by include/linux/mm.h.  Then KVM can just do something like
> >
> > 	struct page *page;
> > 	if (!pfn_valid(pfn))
> > 		return true;
> >
> > 	page = pfn_to_page(pfn);
> > 	return PageReserved(page) && !is_dax_page(page);
> >
> > Thanks,
> >
> > Paolo
> Yeah, that could be much better. Thanks for your comments Paolo.
> 
> Hi Kara, Do u have Any opinions/ideas to add such definition in mm?

What Paolo suggests sounds good to me.

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 36+ messages in thread

end of thread, other threads:[~2018-07-09 12:36 UTC | newest]

Thread overview: 36+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-04 15:30 [PATCH 0/3] Fix kvm misconceives NVDIMM pages as reserved mmio Zhang Yi
2018-07-04 15:30 ` Zhang Yi
2018-07-04 15:30 ` Zhang Yi
2018-07-04 15:30 ` [PATCH 1/3] kvm: remove redundant reserved page check Zhang Yi
2018-07-04 15:30   ` Zhang Yi
2018-07-04 15:30   ` Zhang Yi
2018-07-04 15:30 ` [PATCH 2/3] mm: introduce memory type MEMORY_DEVICE_DEV_DAX Zhang Yi
2018-07-04 15:30   ` Zhang Yi
2018-07-04 15:30   ` Zhang Yi
2018-07-04 14:50   ` Dan Williams
2018-07-04 14:50     ` Dan Williams
2018-07-04 14:50     ` Dan Williams
2018-07-05 13:20     ` zhangyi6
2018-07-05 13:20       ` zhangyi6
2018-07-05 13:20       ` zhangyi6
2018-07-05 13:20       ` zhangyi6
2018-07-04 15:30 ` [PATCH 3/3] kvm: add a function to check if page is from NVDIMM pmem Zhang Yi
2018-07-04 15:30   ` Zhang Yi
2018-07-04 15:30   ` Zhang Yi
2018-07-04 14:50   ` Dan Williams
2018-07-04 14:50     ` Dan Williams
2018-07-04 14:50     ` Dan Williams
2018-07-04 15:27     ` Paolo Bonzini
2018-07-04 15:27       ` Paolo Bonzini
2018-07-04 15:27       ` Paolo Bonzini
2018-07-04 15:25   ` Paolo Bonzini
2018-07-04 15:25     ` Paolo Bonzini
2018-07-04 15:25     ` Paolo Bonzini
2018-07-05 13:19     ` Zhang,Yi
2018-07-05 13:19       ` Zhang,Yi
2018-07-05 13:19       ` Zhang,Yi
2018-07-05 13:19       ` Zhang,Yi
2018-07-09 12:36       ` Jan Kara
2018-07-09 12:36         ` Jan Kara
2018-07-09 12:36         ` Jan Kara
2018-07-09 12:36         ` Jan Kara

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.