All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <1564170120-11882-2-git-send-email-linux.bhar@gmail.com>

diff --git a/a/1.txt b/N1/1.txt
index 8c3a0e6..ef6a02e 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,181 +1,62 @@
-The *pte_lookup functions can be removed and be easily replaced with
-get_user_pages_fast functions. In the case of atomic lookup,
-__get_user_pages_fast is used which does not fall back to slow
-get_user_pages. get_user_pages_fast on the other hand tries to use
-__get_user_pages_fast but fallbacks to slow get_user_pages if
-__get_user_pages_fast fails.
 
-Also unnecessary ifdefs to check for CONFIG_HUGETLB is removed as the
-check is redundant.
+On Fri, 26 Jul 2019 12:42:26 -0700 (PDT) Bharath Vedartham wrote:
+> 
+>  static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr,
+>  		    int write, int atomic, unsigned long *gpa, int *pageshift)
+>  {
+>  	struct mm_struct *mm = gts->ts_mm;
+>  	struct vm_area_struct *vma;
+>  	unsigned long paddr;
+> -	int ret, ps;
+> +	int ret;
+> +	struct page *page;
+>  
+>  	vma = find_vma(mm, vaddr);
+>  	if (!vma)
+> @@ -263,21 +187,33 @@ static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr,
+>  
+>  	/*
+>  	 * Atomic lookup is faster & usually works even if called in non-atomic
+> -	 * context.
+> +	 * context. get_user_pages_fast does atomic lookup before falling back to
+> +	 * slow gup.
+>  	 */
+>  	rmb();	/* Must/check ms_range_active before loading PTEs */
+> -	ret = atomic_pte_lookup(vma, vaddr, write, &paddr, &ps);
+> -	if (ret) {
+> -		if (atomic)
+> +	if (atomic) {
+> +		ret = __get_user_pages_fast(vaddr, 1, write, &page);
+> +		if (!ret)
+>  			goto upm;
+> -		if (non_atomic_pte_lookup(vma, vaddr, write, &paddr, &ps))
+> +	} else {
+> +		ret = get_user_pages_fast(vaddr, 1, write, &page);
+> +		if (!ret)
+>  			goto inval;
+>  	}
+> +
+> +	paddr = page_to_phys(page);
 
-Cc: Ira Weiny <ira.weiny@intel.com>
-Cc: John Hubbard <jhubbard@nvidia.com>
-Cc: Jérôme Glisse <jglisse@redhat.com>
-Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Cc: Dimitri Sivanich <sivanich@sgi.com>
-Cc: Arnd Bergmann <arnd@arndb.de>
-Cc: William Kucharski <william.kucharski@oracle.com>
-Cc: Christoph Hellwig <hch@lst.de>
-Cc: linux-kernel@vger.kernel.org
-Cc: linux-mm@kvack.org
-Reviewed-by: Ira Weiny <ira.weiny@intel.com>
-Reviewed-by: John Hubbard <jhubbard@nvidia.com>
-Reviewed-by: William Kucharski <william.kucharski@oracle.com>
-Signed-off-by: Bharath Vedartham <linux.bhar@gmail.com>
----
-This is a fold of the 3 patches in the previous patch series.
-The review tags were given to the individual patches.
----
- drivers/misc/sgi-gru/grufault.c | 114 +++++++++-------------------------------
- 1 file changed, 25 insertions(+), 89 deletions(-)
+You may drop find_vma() above if PageHuge(page) makes sense here.
 
-diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c
-index 4b713a8..c1258ea 100644
---- a/drivers/misc/sgi-gru/grufault.c
-+++ b/drivers/misc/sgi-gru/grufault.c
-@@ -166,96 +166,20 @@ static void get_clear_fault_map(struct gru_state *gru,
- }
- 
- /*
-- * Atomic (interrupt context) & non-atomic (user context) functions to
-- * convert a vaddr into a physical address. The size of the page
-- * is returned in pageshift.
-- * 	returns:
-- * 		  0 - successful
-- * 		< 0 - error code
-- * 		  1 - (atomic only) try again in non-atomic context
-- */
--static int non_atomic_pte_lookup(struct vm_area_struct *vma,
--				 unsigned long vaddr, int write,
--				 unsigned long *paddr, int *pageshift)
--{
--	struct page *page;
--
--#ifdef CONFIG_HUGETLB_PAGE
--	*pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT;
--#else
--	*pageshift = PAGE_SHIFT;
--#endif
--	if (get_user_pages(vaddr, 1, write ? FOLL_WRITE : 0, &page, NULL) <= 0)
--		return -EFAULT;
--	*paddr = page_to_phys(page);
--	put_page(page);
--	return 0;
--}
--
--/*
-- * atomic_pte_lookup
-+ * mmap_sem is already helod on entry to this function. This guarantees
-+ * existence of the page tables.
-  *
-- * Convert a user virtual address to a physical address
-  * Only supports Intel large pages (2MB only) on x86_64.
-- *	ZZZ - hugepage support is incomplete
-- *
-- * NOTE: mmap_sem is already held on entry to this function. This
-- * guarantees existence of the page tables.
-+ *	ZZZ - hugepage support is incomplete.
-  */
--static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr,
--	int write, unsigned long *paddr, int *pageshift)
--{
--	pgd_t *pgdp;
--	p4d_t *p4dp;
--	pud_t *pudp;
--	pmd_t *pmdp;
--	pte_t pte;
--
--	pgdp = pgd_offset(vma->vm_mm, vaddr);
--	if (unlikely(pgd_none(*pgdp)))
--		goto err;
--
--	p4dp = p4d_offset(pgdp, vaddr);
--	if (unlikely(p4d_none(*p4dp)))
--		goto err;
--
--	pudp = pud_offset(p4dp, vaddr);
--	if (unlikely(pud_none(*pudp)))
--		goto err;
--
--	pmdp = pmd_offset(pudp, vaddr);
--	if (unlikely(pmd_none(*pmdp)))
--		goto err;
--#ifdef CONFIG_X86_64
--	if (unlikely(pmd_large(*pmdp)))
--		pte = *(pte_t *) pmdp;
--	else
--#endif
--		pte = *pte_offset_kernel(pmdp, vaddr);
--
--	if (unlikely(!pte_present(pte) ||
--		     (write && (!pte_write(pte) || !pte_dirty(pte)))))
--		return 1;
--
--	*paddr = pte_pfn(pte) << PAGE_SHIFT;
--#ifdef CONFIG_HUGETLB_PAGE
--	*pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT;
--#else
--	*pageshift = PAGE_SHIFT;
--#endif
--	return 0;
--
--err:
--	return 1;
--}
--
- static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr,
- 		    int write, int atomic, unsigned long *gpa, int *pageshift)
- {
- 	struct mm_struct *mm = gts->ts_mm;
- 	struct vm_area_struct *vma;
- 	unsigned long paddr;
--	int ret, ps;
-+	int ret;
-+	struct page *page;
- 
- 	vma = find_vma(mm, vaddr);
- 	if (!vma)
-@@ -263,21 +187,33 @@ static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr,
- 
- 	/*
- 	 * Atomic lookup is faster & usually works even if called in non-atomic
--	 * context.
-+	 * context. get_user_pages_fast does atomic lookup before falling back to
-+	 * slow gup.
- 	 */
- 	rmb();	/* Must/check ms_range_active before loading PTEs */
--	ret = atomic_pte_lookup(vma, vaddr, write, &paddr, &ps);
--	if (ret) {
--		if (atomic)
-+	if (atomic) {
-+		ret = __get_user_pages_fast(vaddr, 1, write, &page);
-+		if (!ret)
- 			goto upm;
--		if (non_atomic_pte_lookup(vma, vaddr, write, &paddr, &ps))
-+	} else {
-+		ret = get_user_pages_fast(vaddr, 1, write, &page);
-+		if (!ret)
- 			goto inval;
- 	}
-+
-+	paddr = page_to_phys(page);
-+	put_user_page(page);
-+
-+	if (unlikely(is_vm_hugetlb_page(vma)))
-+		*pageshift = HPAGE_SHIFT;
-+	else
-+		*pageshift = PAGE_SHIFT;
-+
- 	if (is_gru_paddr(paddr))
- 		goto inval;
--	paddr = paddr & ~((1UL << ps) - 1);
--	*gpa = uv_soc_phys_ram_to_gpa(paddr);
--	*pageshift = ps;
-+	paddr = paddr & ~((1UL << *pageshift) - 1);
-+	*gpa = uv_soc_phys_ram_to_gpa(paddr);
-+
- 	return VTOP_SUCCESS;
- 
- inval:
--- 
-2.7.4
+> +	put_user_page(page);
+> +
+> +	if (unlikely(is_vm_hugetlb_page(vma)))
+> +		*pageshift = HPAGE_SHIFT;
+> +	else
+> +		*pageshift = PAGE_SHIFT;
+> +
+>  	if (is_gru_paddr(paddr))
+>  		goto inval;
+> -	paddr = paddr & ~((1UL << ps) - 1);
+> -	*gpa = uv_soc_phys_ram_to_gpa(paddr);
+> -	*pageshift = ps;
+> +	paddr = paddr & ~((1UL << *pageshift) - 1);
+> +	*gpa = uv_soc_phys_ram_to_gpa(paddr);
+> +
+>  	return VTOP_SUCCESS;
+>  
+>  inval:
+> -- 
+> 2.7.4
diff --git a/a/content_digest b/N1/content_digest
index a8282f6..a6e16d9 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,200 +1,81 @@
  "ref\01564170120-11882-1-git-send-email-linux.bhar@gmail.com\0"
- "From\0Bharath Vedartham <linux.bhar@gmail.com>\0"
- "Subject\0[PATCH v3 1/1] sgi-gru: Remove *pte_lookup functions\0"
- "Date\0Sat, 27 Jul 2019 01:12:00 +0530\0"
- "To\0sivanich@sgi.com"
- " arnd@arndb.de\0"
- "Cc\0ira.weiny@intel.com"
+ "From\0Hillf Danton <hdanton@sina.com>\0"
+ "Subject\0Re: [PATCH v3 1/1] sgi-gru: Remove *pte_lookup functions\0"
+ "Date\0Sat, 27 Jul 2019 17:22:28 +0800\0"
+ "To\0Bharath Vedartham <linux.bhar@gmail.com>\0"
+ "Cc\0sivanich@sgi.com"
+  arnd@arndb.de
+  ira.weiny@intel.com
   jhubbard@nvidia.com
   jglisse@redhat.com
   gregkh@linuxfoundation.org
   william.kucharski@oracle.com
   hch@lst.de
   linux-kernel@vger.kernel.org
-  linux-mm@kvack.org
- " Bharath Vedartham <linux.bhar@gmail.com>\0"
+ " linux-mm@kvack.org\0"
  "\00:1\0"
  "b\0"
- "The *pte_lookup functions can be removed and be easily replaced with\n"
- "get_user_pages_fast functions. In the case of atomic lookup,\n"
- "__get_user_pages_fast is used which does not fall back to slow\n"
- "get_user_pages. get_user_pages_fast on the other hand tries to use\n"
- "__get_user_pages_fast but fallbacks to slow get_user_pages if\n"
- "__get_user_pages_fast fails.\n"
  "\n"
- "Also unnecessary ifdefs to check for CONFIG_HUGETLB is removed as the\n"
- "check is redundant.\n"
+ "On Fri, 26 Jul 2019 12:42:26 -0700 (PDT) Bharath Vedartham wrote:\n"
+ "> \n"
+ ">  static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr,\n"
+ ">  \t\t    int write, int atomic, unsigned long *gpa, int *pageshift)\n"
+ ">  {\n"
+ ">  \tstruct mm_struct *mm = gts->ts_mm;\n"
+ ">  \tstruct vm_area_struct *vma;\n"
+ ">  \tunsigned long paddr;\n"
+ "> -\tint ret, ps;\n"
+ "> +\tint ret;\n"
+ "> +\tstruct page *page;\n"
+ ">  \n"
+ ">  \tvma = find_vma(mm, vaddr);\n"
+ ">  \tif (!vma)\n"
+ "> @@ -263,21 +187,33 @@ static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr,\n"
+ ">  \n"
+ ">  \t/*\n"
+ ">  \t * Atomic lookup is faster & usually works even if called in non-atomic\n"
+ "> -\t * context.\n"
+ "> +\t * context. get_user_pages_fast does atomic lookup before falling back to\n"
+ "> +\t * slow gup.\n"
+ ">  \t */\n"
+ ">  \trmb();\t/* Must/check ms_range_active before loading PTEs */\n"
+ "> -\tret = atomic_pte_lookup(vma, vaddr, write, &paddr, &ps);\n"
+ "> -\tif (ret) {\n"
+ "> -\t\tif (atomic)\n"
+ "> +\tif (atomic) {\n"
+ "> +\t\tret = __get_user_pages_fast(vaddr, 1, write, &page);\n"
+ "> +\t\tif (!ret)\n"
+ ">  \t\t\tgoto upm;\n"
+ "> -\t\tif (non_atomic_pte_lookup(vma, vaddr, write, &paddr, &ps))\n"
+ "> +\t} else {\n"
+ "> +\t\tret = get_user_pages_fast(vaddr, 1, write, &page);\n"
+ "> +\t\tif (!ret)\n"
+ ">  \t\t\tgoto inval;\n"
+ ">  \t}\n"
+ "> +\n"
+ "> +\tpaddr = page_to_phys(page);\n"
  "\n"
- "Cc: Ira Weiny <ira.weiny@intel.com>\n"
- "Cc: John Hubbard <jhubbard@nvidia.com>\n"
- "Cc: J\303\251r\303\264me Glisse <jglisse@redhat.com>\n"
- "Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>\n"
- "Cc: Dimitri Sivanich <sivanich@sgi.com>\n"
- "Cc: Arnd Bergmann <arnd@arndb.de>\n"
- "Cc: William Kucharski <william.kucharski@oracle.com>\n"
- "Cc: Christoph Hellwig <hch@lst.de>\n"
- "Cc: linux-kernel@vger.kernel.org\n"
- "Cc: linux-mm@kvack.org\n"
- "Reviewed-by: Ira Weiny <ira.weiny@intel.com>\n"
- "Reviewed-by: John Hubbard <jhubbard@nvidia.com>\n"
- "Reviewed-by: William Kucharski <william.kucharski@oracle.com>\n"
- "Signed-off-by: Bharath Vedartham <linux.bhar@gmail.com>\n"
- "---\n"
- "This is a fold of the 3 patches in the previous patch series.\n"
- "The review tags were given to the individual patches.\n"
- "---\n"
- " drivers/misc/sgi-gru/grufault.c | 114 +++++++++-------------------------------\n"
- " 1 file changed, 25 insertions(+), 89 deletions(-)\n"
+ "You may drop find_vma() above if PageHuge(page) makes sense here.\n"
  "\n"
- "diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c\n"
- "index 4b713a8..c1258ea 100644\n"
- "--- a/drivers/misc/sgi-gru/grufault.c\n"
- "+++ b/drivers/misc/sgi-gru/grufault.c\n"
- "@@ -166,96 +166,20 @@ static void get_clear_fault_map(struct gru_state *gru,\n"
- " }\n"
- " \n"
- " /*\n"
- "- * Atomic (interrupt context) & non-atomic (user context) functions to\n"
- "- * convert a vaddr into a physical address. The size of the page\n"
- "- * is returned in pageshift.\n"
- "- * \treturns:\n"
- "- * \t\t  0 - successful\n"
- "- * \t\t< 0 - error code\n"
- "- * \t\t  1 - (atomic only) try again in non-atomic context\n"
- "- */\n"
- "-static int non_atomic_pte_lookup(struct vm_area_struct *vma,\n"
- "-\t\t\t\t unsigned long vaddr, int write,\n"
- "-\t\t\t\t unsigned long *paddr, int *pageshift)\n"
- "-{\n"
- "-\tstruct page *page;\n"
- "-\n"
- "-#ifdef CONFIG_HUGETLB_PAGE\n"
- "-\t*pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT;\n"
- "-#else\n"
- "-\t*pageshift = PAGE_SHIFT;\n"
- "-#endif\n"
- "-\tif (get_user_pages(vaddr, 1, write ? FOLL_WRITE : 0, &page, NULL) <= 0)\n"
- "-\t\treturn -EFAULT;\n"
- "-\t*paddr = page_to_phys(page);\n"
- "-\tput_page(page);\n"
- "-\treturn 0;\n"
- "-}\n"
- "-\n"
- "-/*\n"
- "- * atomic_pte_lookup\n"
- "+ * mmap_sem is already helod on entry to this function. This guarantees\n"
- "+ * existence of the page tables.\n"
- "  *\n"
- "- * Convert a user virtual address to a physical address\n"
- "  * Only supports Intel large pages (2MB only) on x86_64.\n"
- "- *\tZZZ - hugepage support is incomplete\n"
- "- *\n"
- "- * NOTE: mmap_sem is already held on entry to this function. This\n"
- "- * guarantees existence of the page tables.\n"
- "+ *\tZZZ - hugepage support is incomplete.\n"
- "  */\n"
- "-static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr,\n"
- "-\tint write, unsigned long *paddr, int *pageshift)\n"
- "-{\n"
- "-\tpgd_t *pgdp;\n"
- "-\tp4d_t *p4dp;\n"
- "-\tpud_t *pudp;\n"
- "-\tpmd_t *pmdp;\n"
- "-\tpte_t pte;\n"
- "-\n"
- "-\tpgdp = pgd_offset(vma->vm_mm, vaddr);\n"
- "-\tif (unlikely(pgd_none(*pgdp)))\n"
- "-\t\tgoto err;\n"
- "-\n"
- "-\tp4dp = p4d_offset(pgdp, vaddr);\n"
- "-\tif (unlikely(p4d_none(*p4dp)))\n"
- "-\t\tgoto err;\n"
- "-\n"
- "-\tpudp = pud_offset(p4dp, vaddr);\n"
- "-\tif (unlikely(pud_none(*pudp)))\n"
- "-\t\tgoto err;\n"
- "-\n"
- "-\tpmdp = pmd_offset(pudp, vaddr);\n"
- "-\tif (unlikely(pmd_none(*pmdp)))\n"
- "-\t\tgoto err;\n"
- "-#ifdef CONFIG_X86_64\n"
- "-\tif (unlikely(pmd_large(*pmdp)))\n"
- "-\t\tpte = *(pte_t *) pmdp;\n"
- "-\telse\n"
- "-#endif\n"
- "-\t\tpte = *pte_offset_kernel(pmdp, vaddr);\n"
- "-\n"
- "-\tif (unlikely(!pte_present(pte) ||\n"
- "-\t\t     (write && (!pte_write(pte) || !pte_dirty(pte)))))\n"
- "-\t\treturn 1;\n"
- "-\n"
- "-\t*paddr = pte_pfn(pte) << PAGE_SHIFT;\n"
- "-#ifdef CONFIG_HUGETLB_PAGE\n"
- "-\t*pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT;\n"
- "-#else\n"
- "-\t*pageshift = PAGE_SHIFT;\n"
- "-#endif\n"
- "-\treturn 0;\n"
- "-\n"
- "-err:\n"
- "-\treturn 1;\n"
- "-}\n"
- "-\n"
- " static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr,\n"
- " \t\t    int write, int atomic, unsigned long *gpa, int *pageshift)\n"
- " {\n"
- " \tstruct mm_struct *mm = gts->ts_mm;\n"
- " \tstruct vm_area_struct *vma;\n"
- " \tunsigned long paddr;\n"
- "-\tint ret, ps;\n"
- "+\tint ret;\n"
- "+\tstruct page *page;\n"
- " \n"
- " \tvma = find_vma(mm, vaddr);\n"
- " \tif (!vma)\n"
- "@@ -263,21 +187,33 @@ static int gru_vtop(struct gru_thread_state *gts, unsigned long vaddr,\n"
- " \n"
- " \t/*\n"
- " \t * Atomic lookup is faster & usually works even if called in non-atomic\n"
- "-\t * context.\n"
- "+\t * context. get_user_pages_fast does atomic lookup before falling back to\n"
- "+\t * slow gup.\n"
- " \t */\n"
- " \trmb();\t/* Must/check ms_range_active before loading PTEs */\n"
- "-\tret = atomic_pte_lookup(vma, vaddr, write, &paddr, &ps);\n"
- "-\tif (ret) {\n"
- "-\t\tif (atomic)\n"
- "+\tif (atomic) {\n"
- "+\t\tret = __get_user_pages_fast(vaddr, 1, write, &page);\n"
- "+\t\tif (!ret)\n"
- " \t\t\tgoto upm;\n"
- "-\t\tif (non_atomic_pte_lookup(vma, vaddr, write, &paddr, &ps))\n"
- "+\t} else {\n"
- "+\t\tret = get_user_pages_fast(vaddr, 1, write, &page);\n"
- "+\t\tif (!ret)\n"
- " \t\t\tgoto inval;\n"
- " \t}\n"
- "+\n"
- "+\tpaddr = page_to_phys(page);\n"
- "+\tput_user_page(page);\n"
- "+\n"
- "+\tif (unlikely(is_vm_hugetlb_page(vma)))\n"
- "+\t\t*pageshift = HPAGE_SHIFT;\n"
- "+\telse\n"
- "+\t\t*pageshift = PAGE_SHIFT;\n"
- "+\n"
- " \tif (is_gru_paddr(paddr))\n"
- " \t\tgoto inval;\n"
- "-\tpaddr = paddr & ~((1UL << ps) - 1);\n"
- "-\t*gpa = uv_soc_phys_ram_to_gpa(paddr);\n"
- "-\t*pageshift = ps;\n"
- "+\tpaddr = paddr & ~((1UL << *pageshift) - 1);\n"
- "+\t*gpa = uv_soc_phys_ram_to_gpa(paddr);\n"
- "+\n"
- " \treturn VTOP_SUCCESS;\n"
- " \n"
- " inval:\n"
- "-- \n"
- 2.7.4
+ "> +\tput_user_page(page);\n"
+ "> +\n"
+ "> +\tif (unlikely(is_vm_hugetlb_page(vma)))\n"
+ "> +\t\t*pageshift = HPAGE_SHIFT;\n"
+ "> +\telse\n"
+ "> +\t\t*pageshift = PAGE_SHIFT;\n"
+ "> +\n"
+ ">  \tif (is_gru_paddr(paddr))\n"
+ ">  \t\tgoto inval;\n"
+ "> -\tpaddr = paddr & ~((1UL << ps) - 1);\n"
+ "> -\t*gpa = uv_soc_phys_ram_to_gpa(paddr);\n"
+ "> -\t*pageshift = ps;\n"
+ "> +\tpaddr = paddr & ~((1UL << *pageshift) - 1);\n"
+ "> +\t*gpa = uv_soc_phys_ram_to_gpa(paddr);\n"
+ "> +\n"
+ ">  \treturn VTOP_SUCCESS;\n"
+ ">  \n"
+ ">  inval:\n"
+ "> -- \n"
+ > 2.7.4
 
-cda8fb7782f7590bdc03216978fa023dd86b6108a2b9402aa708c87e2f0b3896
+4f7ceaa2192ede5835cad11018cbcc4ae9e899cbde8a04dfe6a7e7e2aeda63d8

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.