All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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.