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.