From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============5694559350237897531==" MIME-Version: 1.0 From: kernel test robot To: kbuild-all@lists.01.org Subject: Re: [PATCH v2 2/4] mm: Probe for sub-page faults in fault_in_*() Date: Thu, 02 Dec 2021 11:38:29 +0800 Message-ID: <202112021112.CL3RLNi7-lkp@intel.com> In-Reply-To: <20211201193750.2097885-3-catalin.marinas@arm.com> List-Id: --===============5694559350237897531== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi Catalin, I love your patch! Perhaps something to improve: [auto build test WARNING on powerpc/next] [also build test WARNING on arm64/for-next/core linus/master v5.16-rc3] [cannot apply to hnaz-mm/master kdave/for-next next-20211201] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Catalin-Marinas/Avoid-live= -lock-in-fault-in-uaccess-loops-with-sub-page-faults/20211202-034030 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git n= ext config: arc-randconfig-r043-20211129 (https://download.01.org/0day-ci/archi= ve/20211202/202112021112.CL3RLNi7-lkp(a)intel.com/config) compiler: arc-elf-gcc (GCC) 11.2.0 reproduce (this is a W=3D1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/= make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/a25817805b46cbc8d2d7e9d36= dfa91e5f8dbf5df git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Catalin-Marinas/Avoid-live-lock-in= -fault-in-uaccess-loops-with-sub-page-faults/20211202-034030 git checkout a25817805b46cbc8d2d7e9d36dfa91e5f8dbf5df # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=3D$HOME/0day COMPILER=3Dgcc-11.2.0 make.cross= O=3Dbuild_dir ARCH=3Darc SHELL=3D/bin/bash If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All warnings (new ones prefixed by >>): mm/gup.c: In function 'fault_in_safe_writeable': >> mm/gup.c:1764:55: warning: passing argument 1 of 'probe_subpage_safe_wri= teable' discards 'const' qualifier from pointer target type [-Wdiscarded-qu= alifiers] 1764 | (min_size && probe_subpage_safe_writeable(uaddr, min= _size))) | ^~~~~ In file included from include/linux/sched/task.h:11, from include/linux/sched/signal.h:9, from include/linux/rcuwait.h:6, from include/linux/percpu-rwsem.h:7, from include/linux/fs.h:33, from include/linux/huge_mm.h:8, from include/linux/mm.h:717, from mm/gup.c:7: include/linux/uaccess.h:306:64: note: expected 'void *' but argument is = of type 'const char *' 306 | static inline size_t probe_subpage_safe_writeable(void __user *u= addr, | ~~~~~~~~~~~~~^= ~~~~ mm/gup.c: In function 'fault_in_readable': >> mm/gup.c:1807:49: warning: passing argument 1 of 'probe_subpage_readable= ' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifie= rs] 1807 | (min_size && probe_subpage_readable(start, min_size)= )) | ^~~~~ In file included from include/linux/sched/task.h:11, from include/linux/sched/signal.h:9, from include/linux/rcuwait.h:6, from include/linux/percpu-rwsem.h:7, from include/linux/fs.h:33, from include/linux/huge_mm.h:8, from include/linux/mm.h:717, from mm/gup.c:7: include/linux/uaccess.h:320:58: note: expected 'void *' but argument is = of type 'const char *' 320 | static inline size_t probe_subpage_readable(void __user *uaddr, = size_t size) | ~~~~~~~~~~~~~^~~~~ vim +1764 mm/gup.c 1700 = 1701 /* 1702 * fault_in_safe_writeable - fault in an address range for writing 1703 * @uaddr: start of address range 1704 * @size: length of address range 1705 * @min_size: minimum size to be faulted in 1706 * 1707 * Faults in an address range using get_user_pages, i.e., without tr= iggering 1708 * hardware page faults. This is primarily useful when we already k= now that 1709 * some or all of the pages in the address range aren't in memory. 1710 * 1711 * Other than fault_in_writeable(), this function is non-destructive. 1712 * 1713 * Note that we don't pin or otherwise hold the pages referenced tha= t we fault 1714 * in. There's no guarantee that they'll stay in memory for any dur= ation of 1715 * time. 1716 * 1717 * Returns the number of bytes not faulted in, like copy_to_user() a= nd 1718 * copy_from_user(). 1719 */ 1720 size_t fault_in_safe_writeable(const char __user *uaddr, size_t size, 1721 size_t min_size) 1722 { 1723 unsigned long start =3D (unsigned long)untagged_addr(uaddr); 1724 unsigned long end, nstart, nend; 1725 struct mm_struct *mm =3D current->mm; 1726 struct vm_area_struct *vma =3D NULL; 1727 int locked =3D 0; 1728 size_t faulted_in =3D size; 1729 = 1730 nstart =3D start & PAGE_MASK; 1731 end =3D PAGE_ALIGN(start + size); 1732 if (end < nstart) 1733 end =3D 0; 1734 for (; nstart !=3D end; nstart =3D nend) { 1735 unsigned long nr_pages; 1736 long ret; 1737 = 1738 if (!locked) { 1739 locked =3D 1; 1740 mmap_read_lock(mm); 1741 vma =3D find_vma(mm, nstart); 1742 } else if (nstart >=3D vma->vm_end) 1743 vma =3D vma->vm_next; 1744 if (!vma || vma->vm_start >=3D end) 1745 break; 1746 nend =3D end ? min(end, vma->vm_end) : vma->vm_end; 1747 if (vma->vm_flags & (VM_IO | VM_PFNMAP)) 1748 continue; 1749 if (nstart < vma->vm_start) 1750 nstart =3D vma->vm_start; 1751 nr_pages =3D (nend - nstart) / PAGE_SIZE; 1752 ret =3D __get_user_pages_locked(mm, nstart, nr_pages, 1753 NULL, NULL, &locked, 1754 FOLL_TOUCH | FOLL_WRITE); 1755 if (ret <=3D 0) 1756 break; 1757 nend =3D nstart + ret * PAGE_SIZE; 1758 } 1759 if (locked) 1760 mmap_read_unlock(mm); 1761 if (nstart !=3D end) 1762 faulted_in =3D min_t(size_t, nstart - start, size); 1763 if (faulted_in < min_size || > 1764 (min_size && probe_subpage_safe_writeable(uaddr, min_size))) 1765 return size; 1766 return size - faulted_in; 1767 } 1768 EXPORT_SYMBOL(fault_in_safe_writeable); 1769 = 1770 /** 1771 * fault_in_readable - fault in userspace address range for reading 1772 * @uaddr: start of user address range 1773 * @size: size of user address range 1774 * @min_size: minimum size to be faulted in 1775 * 1776 * Returns the number of bytes not faulted in (like copy_to_user() a= nd 1777 * copy_from_user()). 1778 */ 1779 size_t fault_in_readable(const char __user *uaddr, size_t size, 1780 size_t min_size) 1781 { 1782 const char __user *start =3D uaddr, *end; 1783 volatile char c; 1784 size_t faulted_in =3D size; 1785 = 1786 if (unlikely(size =3D=3D 0)) 1787 return 0; 1788 if (!PAGE_ALIGNED(uaddr)) { 1789 if (unlikely(__get_user(c, uaddr) !=3D 0)) 1790 return size; 1791 uaddr =3D (const char __user *)PAGE_ALIGN((unsigned long)uaddr); 1792 } 1793 end =3D (const char __user *)PAGE_ALIGN((unsigned long)start + size= ); 1794 if (unlikely(end < start)) 1795 end =3D NULL; 1796 while (uaddr !=3D end) { 1797 if (unlikely(__get_user(c, uaddr) !=3D 0)) 1798 goto out; 1799 uaddr +=3D PAGE_SIZE; 1800 } 1801 = 1802 out: 1803 (void)c; 1804 if (size > uaddr - start) 1805 faulted_in =3D uaddr - start; 1806 if (faulted_in < min_size || > 1807 (min_size && probe_subpage_readable(start, min_size))) 1808 return size; 1809 return size - faulted_in; 1810 } 1811 EXPORT_SYMBOL(fault_in_readable); 1812 = --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org --===============5694559350237897531==--