From: kernel test robot <lkp@intel.com>
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 20:40:02 +0800 [thread overview]
Message-ID: <202112022004.7fjmbELe-lkp@intel.com> (raw)
In-Reply-To: <20211201193750.2097885-3-catalin.marinas@arm.com>
[-- Attachment #1: Type: text/plain, Size: 6552 bytes --]
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-20211202]
[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 next
config: i386-randconfig-s001-20211128 (https://download.01.org/0day-ci/archive/20211202/202112022004.7fjmbELe-lkp(a)intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.4-dirty
# https://github.com/0day-ci/linux/commit/a25817805b46cbc8d2d7e9d36dfa91e5f8dbf5df
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
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
sparse warnings: (new ones prefixed by >>)
>> mm/gup.c:1764:55: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void [noderef] __user *uaddr @@ got char const [noderef] __user *uaddr @@
mm/gup.c:1764:55: sparse: expected void [noderef] __user *uaddr
mm/gup.c:1764:55: sparse: got char const [noderef] __user *uaddr
>> mm/gup.c:1807:49: sparse: sparse: incorrect type in argument 1 (different modifiers) @@ expected void [noderef] __user *uaddr @@ got char const [noderef] __user *start @@
mm/gup.c:1807:49: sparse: expected void [noderef] __user *uaddr
mm/gup.c:1807:49: sparse: got char const [noderef] __user *start
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 triggering
1708 * hardware page faults. This is primarily useful when we already know 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 that we fault
1714 * in. There's no guarantee that they'll stay in memory for any duration of
1715 * time.
1716 *
1717 * Returns the number of bytes not faulted in, like copy_to_user() and
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 = (unsigned long)untagged_addr(uaddr);
1724 unsigned long end, nstart, nend;
1725 struct mm_struct *mm = current->mm;
1726 struct vm_area_struct *vma = NULL;
1727 int locked = 0;
1728 size_t faulted_in = size;
1729
1730 nstart = start & PAGE_MASK;
1731 end = PAGE_ALIGN(start + size);
1732 if (end < nstart)
1733 end = 0;
1734 for (; nstart != end; nstart = nend) {
1735 unsigned long nr_pages;
1736 long ret;
1737
1738 if (!locked) {
1739 locked = 1;
1740 mmap_read_lock(mm);
1741 vma = find_vma(mm, nstart);
1742 } else if (nstart >= vma->vm_end)
1743 vma = vma->vm_next;
1744 if (!vma || vma->vm_start >= end)
1745 break;
1746 nend = 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 = vma->vm_start;
1751 nr_pages = (nend - nstart) / PAGE_SIZE;
1752 ret = __get_user_pages_locked(mm, nstart, nr_pages,
1753 NULL, NULL, &locked,
1754 FOLL_TOUCH | FOLL_WRITE);
1755 if (ret <= 0)
1756 break;
1757 nend = nstart + ret * PAGE_SIZE;
1758 }
1759 if (locked)
1760 mmap_read_unlock(mm);
1761 if (nstart != end)
1762 faulted_in = 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() and
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 = uaddr, *end;
1783 volatile char c;
1784 size_t faulted_in = size;
1785
1786 if (unlikely(size == 0))
1787 return 0;
1788 if (!PAGE_ALIGNED(uaddr)) {
1789 if (unlikely(__get_user(c, uaddr) != 0))
1790 return size;
1791 uaddr = (const char __user *)PAGE_ALIGN((unsigned long)uaddr);
1792 }
1793 end = (const char __user *)PAGE_ALIGN((unsigned long)start + size);
1794 if (unlikely(end < start))
1795 end = NULL;
1796 while (uaddr != end) {
1797 if (unlikely(__get_user(c, uaddr) != 0))
1798 goto out;
1799 uaddr += PAGE_SIZE;
1800 }
1801
1802 out:
1803 (void)c;
1804 if (size > uaddr - start)
1805 faulted_in = 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
next prev parent reply other threads:[~2021-12-02 12:40 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-01 19:37 [PATCH v2 0/4] Avoid live-lock in fault-in+uaccess loops with sub-page faults Catalin Marinas
2021-12-01 19:37 ` Catalin Marinas
2021-12-01 19:37 ` [PATCH v2 1/4] mm: Introduce a 'min_size' argument to fault_in_*() Catalin Marinas
2021-12-01 19:37 ` Catalin Marinas
2021-12-01 19:37 ` [PATCH v2 2/4] mm: Probe for sub-page faults in fault_in_*() Catalin Marinas
2021-12-01 19:37 ` Catalin Marinas
2021-12-02 3:38 ` kernel test robot
2021-12-02 5:10 ` kernel test robot
2021-12-02 5:10 ` kernel test robot
2021-12-02 12:40 ` kernel test robot [this message]
2021-12-01 19:37 ` [PATCH v2 3/4] arm64: Add support for user sub-page fault probing Catalin Marinas
2021-12-01 19:37 ` Catalin Marinas
2021-12-01 20:29 ` Mark Rutland
2021-12-01 20:29 ` Mark Rutland
2021-12-02 16:09 ` Catalin Marinas
2021-12-02 16:09 ` Catalin Marinas
2021-12-01 19:37 ` [PATCH v2 4/4] btrfs: Avoid live-lock in search_ioctl() on hardware with sub-page faults Catalin Marinas
2021-12-01 19:37 ` Catalin Marinas
2021-12-03 15:29 ` [PATCH v2 0/4] Avoid live-lock in fault-in+uaccess loops " Andreas Gruenbacher
2021-12-03 15:29 ` Andreas Gruenbacher
2021-12-03 17:57 ` Linus Torvalds
2021-12-03 17:57 ` Linus Torvalds
2021-12-03 18:11 ` Andreas Gruenbacher
2021-12-03 18:11 ` Andreas Gruenbacher
2021-12-03 18:25 ` Linus Torvalds
2021-12-03 18:25 ` Linus Torvalds
2021-12-03 19:51 ` Catalin Marinas
2021-12-03 19:51 ` Catalin Marinas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202112022004.7fjmbELe-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild-all@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.