Previously, we noticed the one rpma example was failed[1] since 36f30e486d, where it will use ODP feature to do RDMA WRITE between fsdax files.
After digging into the code, we found hmm_vma_handle_pte() will still return EFAULT even though all the its requesting flags has been fulfilled. That's because a DAX page will be marked as (_PAGE_SPECIAL | PAGE_DEVMAP) by pte_mkdevmap().
[1]: https://github.com/pmem/rpma/issues/1142
CC: stable@vger.kernel.org Signed-off-by: Li Zhijian lizhijian@cn.fujitsu.com --- mm/hmm.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/mm/hmm.c b/mm/hmm.c index fad6be2bf072..4766bdefb6c3 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -294,6 +294,12 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr, if (required_fault) goto fault;
+ /* + * just bypass devmap pte such as DAX page when all pfn requested + * flags(pfn_req_flags) are fulfilled. + */ + if (pte_devmap(pte)) + goto out; /* * Since each architecture defines a struct page for the zero page, just * fall through and treat it like a normal page. @@ -307,6 +313,7 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr, return 0; }
+out: *hmm_pfn = pte_pfn(pte) | cpu_flags; return 0;
On Fri, Aug 27, 2021 at 10:45:00PM +0800, Li Zhijian wrote:
Previously, we noticed the one rpma example was failed[1] since 36f30e486d, where it will use ODP feature to do RDMA WRITE between fsdax files.
After digging into the code, we found hmm_vma_handle_pte() will still return EFAULT even though all the its requesting flags has been fulfilled. That's because a DAX page will be marked as (_PAGE_SPECIAL | PAGE_DEVMAP) by pte_mkdevmap().
CC: stable@vger.kernel.org Signed-off-by: Li Zhijian lizhijian@cn.fujitsu.com
You need to add a
Fixes: 405506274922 ("mm/hmm: add missing call to hmm_pte_need_fault in HMM_PFN_SPECIAL handling")
diff --git a/mm/hmm.c b/mm/hmm.c index fad6be2bf072..4766bdefb6c3 100644 +++ b/mm/hmm.c @@ -294,6 +294,12 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr, if (required_fault) goto fault;
- /*
* just bypass devmap pte such as DAX page when all pfn requested
* flags(pfn_req_flags) are fulfilled.
*/
- if (pte_devmap(pte))
goto out;
I liked your ealier version better where this was added to the pte_special test - logically this is about disambiguating the pte_special and the devmap case as they are different things.
Jason
On Fri, Aug 27, 2021 at 01:28:52PM -0300, Jason Gunthorpe wrote:
- /*
* just bypass devmap pte such as DAX page when all pfn requested
* flags(pfn_req_flags) are fulfilled.
*/
- if (pte_devmap(pte))
goto out;
I liked your ealier version better where this was added to the pte_special test - logically this is about disambiguating the pte_special and the devmap case as they are different things.
Yes, I think that is much more logical. Also please capitalize the first word in multi-line comments.
linux-stable-mirror@lists.linaro.org