Skip to content
  1. Apr 20, 2022
    • Miaohe Lin's avatar
      mm/mempolicy: fix mpol_new leak in shared_policy_replace · 5e16dc53
      Miaohe Lin authored
      commit 4ad09955 upstream.
      
      If mpol_new is allocated but not used in restart loop, mpol_new will be
      freed via mpol_put before returning to the caller.  But refcnt is not
      initialized yet, so mpol_put could not do the right things and might
      leak the unused mpol_new.  This would happen if mempolicy was updated on
      the shared shmem file while the sp->lock has been dropped during the
      memory allocation.
      
      This issue could be triggered easily with the below code snippet if
      there are many processes doing the below work at the same time:
      
        shmid = shmget((key_t)5566, 1024 * PAGE_SIZE, 0666|IPC_CREAT);
        shm = shmat(shmid, 0, 0);
        loop many times {
          mbind(shm, 1024 * PAGE_SIZE, MPOL_LOCAL, mask, maxnode, 0);
          mbind(shm + 128 * PAGE_SIZE, 128 * PAGE_SIZE, MPOL_DEFAULT, mask,
                maxnode, 0);
        }
      
      Link: https://lkml.kernel.org/r/20220329111416.27954-1-linmiaohe@huawei.com
      Fixes: 42288fe3
      
       ("mm: mempolicy: Convert shared_policy mutex to spinlock")
      Signed-off-by: default avatarMiaohe Lin <linmiaohe@huawei.com>
      Acked-by: default avatarMichal Hocko <mhocko@suse.com>
      Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
      Cc: Mel Gorman <mgorman@suse.de>
      Cc: <stable@vger.kernel.org>	[3.8]
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5e16dc53
    • Paolo Bonzini's avatar
      mmmremap.c: avoid pointless invalidate_range_start/end on mremap(old_size=0) · eeaf28e2
      Paolo Bonzini authored
      commit 01e67e04
      
       upstream.
      
      If an mremap() syscall with old_size=0 ends up in move_page_tables(), it
      will call invalidate_range_start()/invalidate_range_end() unnecessarily,
      i.e.  with an empty range.
      
      This causes a WARN in KVM's mmu_notifier.  In the past, empty ranges
      have been diagnosed to be off-by-one bugs, hence the WARNing.  Given the
      low (so far) number of unique reports, the benefits of detecting more
      buggy callers seem to outweigh the cost of having to fix cases such as
      this one, where userspace is doing something silly.  In this particular
      case, an early return from move_page_tables() is enough to fix the
      issue.
      
      Link: https://lkml.kernel.org/r/20220329173155.172439-1-pbonzini@redhat.com
      Reported-by: default avatar <syzbot+6bde52d89cfdf9f61425@syzkaller.appspotmail.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Cc: Sean Christopherson <seanjc@google.com>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      eeaf28e2
    • Pali Rohár's avatar
      Revert "mmc: sdhci-xenon: fix annoying 1.8V regulator warning" · 05343514
      Pali Rohár authored
      commit 7e2646ed upstream.
      
      This reverts commit bb32e198.
      
      Commit 1a3ed0dc ("mmc: sdhci-xenon: fix 1.8v regulator stabilization")
      contains proper fix for the issue described in commit bb32e198 ("mmc:
      sdhci-xenon: fix annoying 1.8V regulator warning").
      
      Fixes: 8d876bf4 ("mmc: sdhci-xenon: wait 5ms after set 1.8V signal enable")
      Cc: stable@vger.kernel.org # 1a3ed0dc
      
       ("mmc: sdhci-xenon: fix 1.8v regulator stabilization")
      Signed-off-by: default avatarPali Rohár <pali@kernel.org>
      Reviewed-by: default avatarMarek Behún <kabel@kernel.org>
      Reviewed-by: default avatarMarcin Wojtas <mw@semihalf.com>
      Link: https://lore.kernel.org/r/20220318141441.32329-1-pali@kernel.org
      Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      05343514
    • Lv Yunlong's avatar
      drbd: Fix five use after free bugs in get_initial_state · dcf6be17
      Lv Yunlong authored
      [ Upstream commit aadb22ba ]
      
      In get_initial_state, it calls notify_initial_state_done(skb,..) if
      cb->args[5]==1. If genlmsg_put() failed in notify_initial_state_done(),
      the skb will be freed by nlmsg_free(skb).
      Then get_initial_state will goto out and the freed skb will be used by
      return value skb->len, which is a uaf bug.
      
      What's worse, the same problem goes even further: skb can also be
      freed in the notify_*_state_change -> notify_*_state calls below.
      Thus 4 additional uaf bugs happened.
      
      My patch lets the problem callee functions: notify_initial_state_done
      and notify_*_state_change return an error code if errors happen.
      So that the error codes could be propagated and the uaf bugs can be avoid.
      
      v2 reports a compilation warning. This v3 fixed this warning and built
      successfully in my local environment with no additional warnings.
      v2: https://lore.kernel.org/patchwork/patch/1435218/
      
      Fixes: a2972846
      
       ("drbd: Backport the "events2" command")
      Signed-off-by: default avatarLv Yunlong <lyl2019@mail.ustc.edu.cn>
      Reviewed-by: default avatarChristoph Böhmwalder <christoph.boehmwalder@linbit.com>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      dcf6be17
    • José Expósito's avatar
      drm/imx: Fix memory leak in imx_pd_connector_get_modes · 38bf605b
      José Expósito authored
      [ Upstream commit bce81feb ]
      
      Avoid leaking the display mode variable if of_get_drm_display_mode
      fails.
      
      Fixes: 76ecd9c9
      
       ("drm/imx: parallel-display: check return code from of_get_drm_display_mode()")
      Addresses-Coverity-ID: 1443943 ("Resource leak")
      Signed-off-by: default avatarJosé Expósito <jose.exposito89@gmail.com>
      Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
      Link: https://lore.kernel.org/r/20220108165230.44610-1-jose.exposito89@gmail.com
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      38bf605b
    • Chen-Yu Tsai's avatar
      net: stmmac: Fix unset max_speed difference between DT and non-DT platforms · 5c6c1014
      Chen-Yu Tsai authored
      [ Upstream commit c21cabb0 ]
      
      In commit 9cbadf09 ("net: stmmac: support max-speed device tree
      property"), when DT platforms don't set "max-speed", max_speed is set to
      -1; for non-DT platforms, it stays the default 0.
      
      Prior to commit eeef2f6b ("net: stmmac: Start adding phylink support"),
      the check for a valid max_speed setting was to check if it was greater
      than zero. This commit got it right, but subsequent patches just checked
      for non-zero, which is incorrect for DT platforms.
      
      In commit 92c3807b ("net: stmmac: convert to phylink_get_linkmodes()")
      the conversion switched completely to checking for non-zero value as a
      valid value, which caused 1000base-T to stop getting advertised by
      default.
      
      Instead of trying to fix all the checks, simply leave max_speed alone if
      DT property parsing fails.
      
      Fixes: 9cbadf09 ("net: stmmac: support max-speed device tree property")
      Fixes: 92c3807b
      
       ("net: stmmac: convert to phylink_get_linkmodes()")
      Signed-off-by: default avatarChen-Yu Tsai <wens@csie.org>
      Acked-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
      Reviewed-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
      Link: https://lore.kernel.org/r/20220331184832.16316-1-wens@kernel.org
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5c6c1014
    • Christophe JAILLET's avatar
      scsi: zorro7xx: Fix a resource leak in zorro7xx_remove_one() · 1e0c0131
      Christophe JAILLET authored
      [ Upstream commit 16ed828b ]
      
      The error handling path of the probe releases a resource that is not freed
      in the remove function. In some cases, a ioremap() must be undone.
      
      Add the missing iounmap() call in the remove function.
      
      Link: https://lore.kernel.org/r/247066a3104d25f9a05de8b3270fc3c848763bcc.1647673264.git.christophe.jaillet@wanadoo.fr
      Fixes: 45804fbb
      
       ("[SCSI] 53c700: Amiga Zorro NCR53c710 SCSI")
      Reviewed-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
      Signed-off-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      1e0c0131
    • Dan Carpenter's avatar
      drm/amdgpu: fix off by one in amdgpu_gfx_kiq_acquire() · dd3a74d9
      Dan Carpenter authored
      [ Upstream commit 1647b54e ]
      
      This post-op should be a pre-op so that we do not pass -1 as the bit
      number to test_bit().  The current code will loop downwards from 63 to
      -1.  After changing to a pre-op, it loops from 63 to 0.
      
      Fixes: 71c37505
      
       ("drm/amdgpu/gfx: move more common KIQ code to amdgpu_gfx.c")
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      dd3a74d9
    • Mauricio Faria de Oliveira's avatar
      mm: fix race between MADV_FREE reclaim and blkdev direct IO read · 106392f5
      Mauricio Faria de Oliveira authored
      commit 6c8e2a25 upstream.
      
      Problem:
      =======
      
      Userspace might read the zero-page instead of actual data from a direct IO
      read on a block device if the buffers have been called madvise(MADV_FREE)
      on earlier (this is discussed below) due to a race between page reclaim on
      MADV_FREE and blkdev direct IO read.
      
      - Race condition:
        ==============
      
      During page reclaim, the MADV_FREE page check in try_to_unmap_one() checks
      if the page is not dirty, then discards its rmap PTE(s) (vs.  remap back
      if the page is dirty).
      
      However, after try_to_unmap_one() returns to shrink_page_list(), it might
      keep the page _anyway_ if page_ref_freeze() fails (it expects exactly
      _one_ page reference, from the isolation for page reclaim).
      
      Well, blkdev_direct_IO() gets references for all pages, and on READ
      operations it only sets them dirty _later_.
      
      So, if MADV_FREE'd pages (i.e., not dirty) are used as buffers for direct
      IO read from block devices, and page reclaim happens during
      __blkdev_direct_IO[_simple]() exactly AFTER bio_iov_iter_get_pages()
      returns, but BEFORE the pages are set dirty, the situation happens.
      
      The direct IO read eventually completes.  Now, when userspace reads the
      buffers, the PTE is no longer there and the page fault handler
      do_anonymous_page() services that with the zero-page, NOT the data!
      
      A synthetic reproducer is provided.
      
      - Page faults:
        ===========
      
      If page reclaim happens BEFORE bio_iov_iter_get_pages() the issue doesn't
      happen, because that faults-in all pages as writeable, so
      do_anonymous_page() sets up a new page/rmap/PTE, and that is used by
      direct IO.  The userspace reads don't fault as the PTE is there (thus
      zero-page is not used/setup).
      
      But if page reclaim happens AFTER it / BEFORE setting pages dirty, the PTE
      is no longer there; the subsequent page faults can't help:
      
      The data-read from the block device probably won't generate faults due to
      DMA (no MMU) but even in the case it wouldn't use DMA, that happens on
      different virtual addresses (not user-mapped addresses) because `struct
      bio_vec` stores `struct page` to figure addresses out (which are different
      from user-mapped addresses) for the read.
      
      Thus userspace reads (to user-mapped addresses) still fault, then
      do_anonymous_page() gets another `struct page` that would address/ map to
      other memory than the `struct page` used by `struct bio_vec` for the read.
      (The original `struct page` is not available, since it wasn't freed, as
      page_ref_freeze() failed due to more page refs.  And even if it were
      available, its data cannot be trusted anymore.)
      
      Solution:
      ========
      
      One solution is to check for the expected page reference count in
      try_to_unmap_one().
      
      There should be one reference from the isolation (that is also checked in
      shrink_page_list() with page_ref_freeze()) plus one or more references
      from page mapping(s) (put in discard: label).  Further references mean
      that rmap/PTE cannot be unmapped/nuked.
      
      (Note: there might be more than one reference from mapping due to
      fork()/clone() without CLONE_VM, which use the same `struct page` for
      references, until the copy-on-write page gets copied.)
      
      So, additional page references (e.g., from direct IO read) now prevent the
      rmap/PTE from being unmapped/dropped; similarly to the page is not freed
      per shrink_page_list()/page_ref_freeze()).
      
      - Races and Barriers:
        ==================
      
      The new check in try_to_unmap_one() should be safe in races with
      bio_iov_iter_get_pages() in get_user_pages() fast and slow paths, as it's
      done under the PTE lock.
      
      The fast path doesn't take the lock, but it checks if the PTE has changed
      and if so, it drops the reference and leaves the page for the slow path
      (which does take that lock).
      
      The fast path requires synchronization w/ full memory barrier: it writes
      the page reference count first then it reads the PTE later, while
      try_to_unmap() writes PTE first then it reads page refcount.
      
      And a second barrier is needed, as the page dirty flag should not be read
      before the page reference count (as in __remove_mapping()).  (This can be
      a load memory barrier only; no writes are involved.)
      
      Call stack/comments:
      
      - try_to_unmap_one()
        - page_vma_mapped_walk()
          - map_pte()			# see pte_offset_map_lock():
              pte_offset_map()
              spin_lock()
      
        - ptep_get_and_clear()	# write PTE
        - smp_mb()			# (new barrier) GUP fast path
        - page_ref_count()		# (new check) read refcount
      
        - page_vma_mapped_walk_done()	# see pte_unmap_unlock():
            pte_unmap()
            spin_unlock()
      
      - bio_iov_iter_get_pages()
        - __bio_iov_iter_get_pages()
          - iov_iter_get_pages()
            - get_user_pages_fast()
              - internal_get_user_pages_fast()
      
                # fast path
                - lockless_pages_from_mm()
                  - gup_{pgd,p4d,pud,pmd,pte}_range()
                      ptep = pte_offset_map()		# not _lock()
                      pte = ptep_get_lockless(ptep)
      
                      page = pte_page(pte)
                      try_grab_compound_head(page)	# inc refcount
                                                  	# (RMW/barrier
                                                   	#  on success)
      
                      if (pte_val(pte) != pte_val(*ptep)) # read PTE
                              put_compound_head(page) # dec refcount
                              			# go slow path
      
                # slow path
                - __gup_longterm_unlocked()
                  - get_user_pages_unlocked()
                    - __get_user_pages_locked()
                      - __get_user_pages()
                        - follow_{page,p4d,pud,pmd}_mask()
                          - follow_page_pte()
                              ptep = pte_offset_map_lock()
                              pte = *ptep
                              page = vm_normal_page(pte)
                              try_grab_page(page)	# inc refcount
                              pte_unmap_unlock()
      
      - Huge Pages:
        ==========
      
      Regarding transparent hugepages, that logic shouldn't change, as MADV_FREE
      (aka lazyfree) pages are PageAnon() && !PageSwapBacked()
      (madvise_free_pte_range() -> mark_page_lazyfree() -> lru_lazyfree_fn())
      thus should reach shrink_page_list() -> split_huge_page_to_list() before
      try_to_unmap[_one](), so it deals with normal pages only.
      
      (And in case unlikely/TTU_SPLIT_HUGE_PMD/split_huge_pmd_address() happens,
      which should not or be rare, the page refcount should be greater than
      mapcount: the head page is referenced by tail pages.  That also prevents
      checking the head `page` then incorrectly call page_remove_rmap(subpage)
      for a tail page, that isn't even in the shrink_page_list()'s page_list (an
      effect of split huge pmd/pmvw), as it might happen today in this unlikely
      scenario.)
      
      MADV_FREE'd buffers:
      ===================
      
      So, back to the "if MADV_FREE pages are used as buffers" note.  The case
      is arguable, and subject to multiple interpretations.
      
      The madvise(2) manual page on the MADV_FREE advice value says:
      
      1) 'After a successful MADV_FREE ... data will be lost when
         the kernel frees the pages.'
      2) 'the free operation will be canceled if the caller writes
         into the page' / 'subsequent writes ... will succeed and
         then [the] kernel cannot free those dirtied pages'
      3) 'If there is no subsequent write, the kernel can free the
         pages at any time.'
      
      Thoughts, questions, considerations... respectively:
      
      1) Since the kernel didn't actually free the page (page_ref_freeze()
         failed), should the data not have been lost? (on userspace read.)
      2) Should writes performed by the direct IO read be able to cancel
         the free operation?
         - Should the direct IO read be considered as 'the caller' too,
           as it's been requested by 'the caller'?
         - Should the bio technique to dirty pages on return to userspace
           (bio_check_pages_dirty() is called/used by __blkdev_direct_IO())
           be considered in another/special way here?
      3) Should an upcoming write from a previously requested direct IO
         read be considered as a subsequent write, so the kernel should
         not free the pages? (as it's known at the time of page reclaim.)
      
      And lastly:
      
      Technically, the last point would seem a reasonable consideration and
      balance, as the madvise(2) manual page apparently (and fairly) seem to
      assume that 'writes' are memory access from the userspace process (not
      explicitly considering writes from the kernel or its corner cases; again,
      fairly)..  plus the kernel fix implementation for the corner case of the
      largely 'non-atomic write' encompassed by a direct IO read operation, is
      relatively simple; and it helps.
      
      Reproducer:
      ==========
      
      @ test.c (simplified, but works)
      
      	#define _GNU_SOURCE
      	#include <fcntl.h>
      	#include <stdio.h>
      	#include <unistd.h>
      	#include <sys/mman.h>
      
      	int main() {
      		int fd, i;
      		char *buf;
      
      		fd = open(DEV, O_RDONLY | O_DIRECT);
      
      		buf = mmap(NULL, BUF_SIZE, PROT_READ | PROT_WRITE,
                      	   MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
      
      		for (i = 0; i < BUF_SIZE; i += PAGE_SIZE)
      			buf[i] = 1; // init to non-zero
      
      		madvise(buf, BUF_SIZE, MADV_FREE);
      
      		read(fd, buf, BUF_SIZE);
      
      		for (i = 0; i < BUF_SIZE; i += PAGE_SIZE)
      			printf("%p: 0x%x\n", &buf[i], buf[i]);
      
      		return 0;
      	}
      
      @ block/fops.c (formerly fs/block_dev.c)
      
      	+#include <linux/swap.h>
      	...
      	... __blkdev_direct_IO[_simple](...)
      	{
      	...
      	+	if (!strcmp(current->comm, "good"))
      	+		shrink_all_memory(ULONG_MAX);
      	+
               	ret = bio_iov_iter_get_pages(...);
      	+
      	+	if (!strcmp(current->comm, "bad"))
      	+		shrink_all_memory(ULONG_MAX);
      	...
      	}
      
      @ shell
      
              # NUM_PAGES=4
              # PAGE_SIZE=$(getconf PAGE_SIZE)
      
              # yes | dd of=test.img bs=${PAGE_SIZE} count=${NUM_PAGES}
              # DEV=$(losetup -f --show test.img)
      
              # gcc -DDEV=\"$DEV\" \
                    -DBUF_SIZE=$((PAGE_SIZE * NUM_PAGES)) \
                    -DPAGE_SIZE=${PAGE_SIZE} \
                     test.c -o test
      
              # od -tx1 $DEV
              0000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a
              *
              0040000
      
              # mv test good
              # ./good
              0x7f7c10418000: 0x79
              0x7f7c10419000: 0x79
              0x7f7c1041a000: 0x79
              0x7f7c1041b000: 0x79
      
              # mv good bad
              # ./bad
              0x7fa1b8050000: 0x0
              0x7fa1b8051000: 0x0
              0x7fa1b8052000: 0x0
              0x7fa1b8053000: 0x0
      
      Note: the issue is consistent on v5.17-rc3, but it's intermittent with the
      support of MADV_FREE on v4.5 (60%-70% error; needs swap).  [wrap
      do_direct_IO() in do_blockdev_direct_IO() @ fs/direct-io.c].
      
      - v5.17-rc3:
      
              # for i in {1..1000}; do ./good; done \
                  | cut -d: -f2 | sort | uniq -c
                 4000  0x79
      
              # mv good bad
              # for i in {1..1000}; do ./bad; done \
                  | cut -d: -f2 | sort | uniq -c
                 4000  0x0
      
              # free | grep Swap
              Swap:             0           0           0
      
      - v4.5:
      
              # for i in {1..1000}; do ./good; done \
                  | cut -d: -f2 | sort | uniq -c
                 4000  0x79
      
              # mv good bad
              # for i in {1..1000}; do ./bad; done \
                  | cut -d: -f2 | sort | uniq -c
                 2702  0x0
                 1298  0x79
      
              # swapoff -av
              swapoff /swap
      
              # for i in {1..1000}; do ./bad; done \
                  | cut -d: -f2 | sort | uniq -c
                 4000  0x79
      
      Ceph/TCMalloc:
      =============
      
      For documentation purposes, the use case driving the analysis/fix is Ceph
      on Ubuntu 18.04, as the TCMalloc library there still uses MADV_FREE to
      release unused memory to the system from the mmap'ed page heap (might be
      committed back/used again; it's not munmap'ed.) - PageHeap::DecommitSpan()
      -> TCMalloc_SystemRelease() -> madvise() - PageHeap::CommitSpan() ->
      TCMalloc_SystemCommit() -> do nothing.
      
      Note: TCMalloc switched back to MADV_DONTNEED a few commits after the
      release in Ubuntu 18.04 (google-perftools/gperftools 2.5), so the issue
      just 'disappeared' on Ceph on later Ubuntu releases but is still present
      in the kernel, and can be hit by other use cases.
      
      The observed issue seems to be the old Ceph bug #22464 [1], where checksum
      mismatches are observed (and instrumentation with buffer dumps shows
      zero-pages read from mmap'ed/MADV_FREE'd page ranges).
      
      The issue in Ceph was reasonably deemed a kernel bug (comment #50) and
      mostly worked around with a retry mechanism, but other parts of Ceph could
      still hit that (rocksdb).  Anyway, it's less likely to be hit again as
      TCMalloc switched out of MADV_FREE by default.
      
      (Some kernel versions/reports from the Ceph bug, and relation with
      the MADV_FREE introduction/changes; TCMalloc versions not checked.)
      - 4.4 good
      - 4.5 (madv_free: introduction)
      - 4.9 bad
      - 4.10 good? maybe a swapless system
      - 4.12 (madv_free: no longer free instantly on swapless systems)
      - 4.13 bad
      
      [1] https://tracker.ceph.com/issues/22464
      
      Thanks:
      ======
      
      Several people contributed to analysis/discussions/tests/reproducers in
      the first stages when drilling down on ceph/tcmalloc/linux kernel:
      
      - Dan Hill
      - Dan Streetman
      - Dongdong Tao
      - Gavin Guo
      - Gerald Yang
      - Heitor Alves de Siqueira
      - Ioanna Alifieraki
      - Jay Vosburgh
      - Matthew Ruffell
      - Ponnuvel Palaniyappan
      
      Reviews, suggestions, corrections, comments:
      
      - Minchan Kim
      - Yu Zhao
      - Huang, Ying
      - John Hubbard
      - Christoph Hellwig
      
      [mfo@canonical.com: v4]
        Link: https://lkml.kernel.org/r/20220209202659.183418-1-mfo@canonical.comLink: https://lkml.kernel.org/r/20220131230255.789059-1-mfo@canonical.com
      
      Fixes: 802a3a92
      
       ("mm: reclaim MADV_FREE pages")
      Signed-off-by: default avatarMauricio Faria de Oliveira <mfo@canonical.com>
      Reviewed-by: default avatar"Huang, Ying" <ying.huang@intel.com>
      Cc: Minchan Kim <minchan@kernel.org>
      Cc: Yu Zhao <yuzhao@google.com>
      Cc: Yang Shi <shy828301@gmail.com>
      Cc: Miaohe Lin <linmiaohe@huawei.com>
      Cc: Dan Hill <daniel.hill@canonical.com>
      Cc: Dan Streetman <dan.streetman@canonical.com>
      Cc: Dongdong Tao <dongdong.tao@canonical.com>
      Cc: Gavin Guo <gavin.guo@canonical.com>
      Cc: Gerald Yang <gerald.yang@canonical.com>
      Cc: Heitor Alves de Siqueira <halves@canonical.com>
      Cc: Ioanna Alifieraki <ioanna-maria.alifieraki@canonical.com>
      Cc: Jay Vosburgh <jay.vosburgh@canonical.com>
      Cc: Matthew Ruffell <matthew.ruffell@canonical.com>
      Cc: Ponnuvel Palaniyappan <ponnuvel.palaniyappan@canonical.com>
      Cc: <stable@vger.kernel.org>
      Cc: Christoph Hellwig <hch@infradead.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      [mfo: backport: replace folio/test_flag with page/flag equivalents;
       mmu_notifier_invalidate_range() is called in the 'discard:' label;
       real Fixes: 854e9ed0
      
       ("mm: support madvise(MADV_FREE)") in v4.]
      Signed-off-by: default avatarMauricio Faria de Oliveira <mfo@canonical.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      106392f5
    • Willem de Bruijn's avatar
      net: add missing SOF_TIMESTAMPING_OPT_ID support · add668be
      Willem de Bruijn authored
      [ Upstream commit 8f932f76 ]
      
      SOF_TIMESTAMPING_OPT_ID is supported on TCP, UDP and RAW sockets.
      But it was missing on RAW with IPPROTO_IP, PF_PACKET and CAN.
      
      Add skb_setup_tx_timestamp that configures both tx_flags and tskey
      for these paths that do not need corking or use bytestream keys.
      
      Fixes: 09c2d251
      
       ("net-timestamp: add key to disambiguate concurrent datagrams")
      Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
      Acked-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      add668be
    • Willem de Bruijn's avatar
      ipv6: add missing tx timestamping on IPPROTO_RAW · a96c57a7
      Willem de Bruijn authored
      [ Upstream commit fbfb2321 ]
      
      Raw sockets support tx timestamping, but one case is missing.
      
      IPPROTO_RAW takes a separate packet construction path. raw_send_hdrinc
      has an explicit call to sock_tx_timestamp, but rawv6_send_hdrinc does
      not. Add it.
      
      Fixes: 11878b40
      
       ("net-timestamp: SOCK_RAW and PING timestamping")
      Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
      Acked-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      a96c57a7
    • Helge Deller's avatar
      parisc: Fix CPU affinity for Lasi, WAX and Dino chips · 52b66c46
      Helge Deller authored
      [ Upstream commit 939fc856
      
       ]
      
      Add the missing logic to allow Lasi, WAX and Dino to set the
      CPU affinity. This fixes IRQ migration to other CPUs when a
      CPU is shutdown which currently holds the IRQs for one of those
      chips.
      
      Signed-off-by: default avatarHelge Deller <deller@gmx.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      52b66c46
    • Haimin Zhang's avatar
      jfs: prevent NULL deref in diFree · 33bd2435
      Haimin Zhang authored
      [ Upstream commit a5304629
      
       ]
      
      Add validation check for JFS_IP(ipimap)->i_imap to prevent a NULL deref
      in diFree since diFree uses it without do any validations.
      When function jfs_mount calls diMount to initialize fileset inode
      allocation map, it can fail and JFS_IP(ipimap)->i_imap won't be
      initialized. Then it calls diFreeSpecial to close fileset inode allocation
      map inode and it will flow into jfs_evict_inode. Function jfs_evict_inode
      just validates JFS_SBI(inode->i_sb)->ipimap, then calls diFree. diFree use
      JFS_IP(ipimap)->i_imap directly, then it will cause a NULL deref.
      
      Reported-by: default avatarTCS Robot <tcs_robot@tencent.com>
      Signed-off-by: default avatarHaimin Zhang <tcs_kernel@tencent.com>
      Signed-off-by: default avatarDave Kleikamp <dave.kleikamp@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      33bd2435
    • Randy Dunlap's avatar
      virtio_console: eliminate anonymous module_init & module_exit · 7deaddb7
      Randy Dunlap authored
      [ Upstream commit fefb8a2a
      
       ]
      
      Eliminate anonymous module_init() and module_exit(), which can lead to
      confusion or ambiguity when reading System.map, crashes/oops/bugs,
      or an initcall_debug log.
      
      Give each of these init and exit functions unique driver-specific
      names to eliminate the anonymous names.
      
      Example 1: (System.map)
       ffffffff832fc78c t init
       ffffffff832fc79e t init
       ffffffff832fc8f8 t init
      
      Example 2: (initcall_debug log)
       calling  init+0x0/0x12 @ 1
       initcall init+0x0/0x12 returned 0 after 15 usecs
       calling  init+0x0/0x60 @ 1
       initcall init+0x0/0x60 returned 0 after 2 usecs
       calling  init+0x0/0x9a @ 1
       initcall init+0x0/0x9a returned 0 after 74 usecs
      
      Signed-off-by: default avatarRandy Dunlap <rdunlap@infradead.org>
      Reviewed-by: default avatarAmit Shah <amit@kernel.org>
      Cc: virtualization@lists.linux-foundation.org
      Cc: Arnd Bergmann <arnd@arndb.de>
      Link: https://lore.kernel.org/r/20220316192010.19001-3-rdunlap@infradead.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      7deaddb7
    • Jiri Slaby's avatar
      serial: samsung_tty: do not unlock port->lock for uart_write_wakeup() · 18f72552
      Jiri Slaby authored
      [ Upstream commit 988c7c00 ]
      
      The commit c15c3747
      
       (serial: samsung: fix potential soft lockup
      during uart write) added an unlock of port->lock before
      uart_write_wakeup() and a lock after it. It was always problematic to
      write data from tty_ldisc_ops::write_wakeup and it was even documented
      that way. We fixed the line disciplines to conform to this recently.
      So if there is still a missed one, we should fix them instead of this
      workaround.
      
      On the top of that, s3c24xx_serial_tx_dma_complete() in this driver
      still holds the port->lock while calling uart_write_wakeup().
      
      So revert the wrap added by the commit above.
      
      Cc: Thomas Abraham <thomas.abraham@linaro.org>
      Cc: Kyungmin Park <kyungmin.park@samsung.com>
      Cc: Hyeonkook Kim <hk619.kim@samsung.com>
      Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
      Link: https://lore.kernel.org/r/20220308115153.4225-1-jslaby@suse.cz
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      18f72552
    • NeilBrown's avatar
      NFS: swap-out must always use STABLE writes. · 7e907c02
      NeilBrown authored
      [ Upstream commit c265de25
      
       ]
      
      The commit handling code is not safe against memory-pressure deadlocks
      when writing to swap.  In particular, nfs_commitdata_alloc() blocks
      indefinitely waiting for memory, and this can consume all available
      workqueue threads.
      
      swap-out most likely uses STABLE writes anyway as COND_STABLE indicates
      that a stable write should be used if the write fits in a single
      request, and it normally does.  However if we ever swap with a small
      wsize, or gather unusually large numbers of pages for a single write,
      this might change.
      
      For safety, make it explicit in the code that direct writes used for swap
      must always use FLUSH_STABLE.
      
      Signed-off-by: default avatarNeilBrown <neilb@suse.de>
      Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      7e907c02
    • NeilBrown's avatar
      NFS: swap IO handling is slightly different for O_DIRECT IO · 4e70b564
      NeilBrown authored
      [ Upstream commit 64158668
      
       ]
      
      1/ Taking the i_rwsem for swap IO triggers lockdep warnings regarding
         possible deadlocks with "fs_reclaim".  These deadlocks could, I believe,
         eventuate if a buffered read on the swapfile was attempted.
      
         We don't need coherence with the page cache for a swap file, and
         buffered writes are forbidden anyway.  There is no other need for
         i_rwsem during direct IO.  So never take it for swap_rw()
      
      2/ generic_write_checks() explicitly forbids writes to swap, and
         performs checks that are not needed for swap.  So bypass it
         for swap_rw().
      
      Signed-off-by: default avatarNeilBrown <neilb@suse.de>
      Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      4e70b564
    • NeilBrown's avatar
      SUNRPC/call_alloc: async tasks mustn't block waiting for memory · 5364fe29
      NeilBrown authored
      [ Upstream commit c487216b
      
       ]
      
      When memory is short, new worker threads cannot be created and we depend
      on the minimum one rpciod thread to be able to handle everything.
      So it must not block waiting for memory.
      
      mempools are particularly a problem as memory can only be released back
      to the mempool by an async rpc task running.  If all available
      workqueue threads are waiting on the mempool, no thread is available to
      return anything.
      
      rpc_malloc() can block, and this might cause deadlocks.
      So check RPC_IS_ASYNC(), rather than RPC_IS_SWAPPER() to determine if
      blocking is acceptable.
      
      Signed-off-by: default avatarNeilBrown <neilb@suse.de>
      Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5364fe29
    • Lucas Denefle's avatar
      w1: w1_therm: fixes w1_seq for ds28ea00 sensors · aba111de
      Lucas Denefle authored
      [ Upstream commit 41a92a89
      
       ]
      
      w1_seq was failing due to several devices responding to the
      CHAIN_DONE at the same time. Now properly selects the current
      device in the chain with MATCH_ROM. Also acknowledgment was
      read twice.
      
      Signed-off-by: default avatarLucas Denefle <lucas.denefle@converge.io>
      Link: https://lore.kernel.org/r/20220223113558.232750-1-lucas.denefle@converge.io
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      aba111de
    • Randy Dunlap's avatar
      init/main.c: return 1 from handled __setup() functions · a861234d
      Randy Dunlap authored
      [ Upstream commit f9a40b08
      
       ]
      
      initcall_blacklist() should return 1 to indicate that it handled its
      cmdline arguments.
      
      set_debug_rodata() should return 1 to indicate that it handled its
      cmdline arguments.  Print a warning if the option string is invalid.
      
      This prevents these strings from being added to the 'init' program's
      environment as they are not init arguments/parameters.
      
      Link: https://lkml.kernel.org/r/20220221050901.23985-1-rdunlap@infradead.org
      Signed-off-by: default avatarRandy Dunlap <rdunlap@infradead.org>
      Reported-by: default avatarIgor Zhbanov <i.zhbanov@omprussia.ru>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      a861234d
    • Luiz Augusto von Dentz's avatar
      Bluetooth: Fix use after free in hci_send_acl · 643a6c26
      Luiz Augusto von Dentz authored
      [ Upstream commit f63d24ba
      
       ]
      
      This fixes the following trace caused by receiving
      HCI_EV_DISCONN_PHY_LINK_COMPLETE which does call hci_conn_del without
      first checking if conn->type is in fact AMP_LINK and in case it is
      do properly cleanup upper layers with hci_disconn_cfm:
      
       ==================================================================
          BUG: KASAN: use-after-free in hci_send_acl+0xaba/0xc50
          Read of size 8 at addr ffff88800e404818 by task bluetoothd/142
      
          CPU: 0 PID: 142 Comm: bluetoothd Not tainted
          5.17.0-rc5-00006-gda4022eeac1a #7
          Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
          rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014
          Call Trace:
           <TASK>
           dump_stack_lvl+0x45/0x59
           print_address_description.constprop.0+0x1f/0x150
           kasan_report.cold+0x7f/0x11b
           hci_send_acl+0xaba/0xc50
           l2cap_do_send+0x23f/0x3d0
           l2cap_chan_send+0xc06/0x2cc0
           l2cap_sock_sendmsg+0x201/0x2b0
           sock_sendmsg+0xdc/0x110
           sock_write_iter+0x20f/0x370
           do_iter_readv_writev+0x343/0x690
           do_iter_write+0x132/0x640
           vfs_writev+0x198/0x570
           do_writev+0x202/0x280
           do_syscall_64+0x38/0x90
           entry_SYSCALL_64_after_hwframe+0x44/0xae
          RSP: 002b:00007ffce8a099b8 EFLAGS: 00000246 ORIG_RAX: 0000000000000014
          Code: 0f 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 f3
          0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 14 00 00 00 0f 05
          <48> 3d 00 f0 ff ff 77 51 c3 48 83 ec 28 89 54 24 1c 48 89 74 24 10
          RDX: 0000000000000001 RSI: 00007ffce8a099e0 RDI: 0000000000000015
          RAX: ffffffffffffffda RBX: 00007ffce8a099e0 RCX: 00007f788fc3cf77
          R10: 00007ffce8af7080 R11: 0000000000000246 R12: 000055e4ccf75580
          RBP: 0000000000000015 R08: 0000000000000002 R09: 0000000000000001
          </TASK>
          R13: 000055e4ccf754a0 R14: 000055e4ccf75cd0 R15: 000055e4ccf4a6b0
      
          Allocated by task 45:
              kasan_save_stack+0x1e/0x40
              __kasan_kmalloc+0x81/0xa0
              hci_chan_create+0x9a/0x2f0
              l2cap_conn_add.part.0+0x1a/0xdc0
              l2cap_connect_cfm+0x236/0x1000
              le_conn_complete_evt+0x15a7/0x1db0
              hci_le_conn_complete_evt+0x226/0x2c0
              hci_le_meta_evt+0x247/0x450
              hci_event_packet+0x61b/0xe90
              hci_rx_work+0x4d5/0xc50
              process_one_work+0x8fb/0x15a0
              worker_thread+0x576/0x1240
              kthread+0x29d/0x340
              ret_from_fork+0x1f/0x30
      
          Freed by task 45:
              kasan_save_stack+0x1e/0x40
              kasan_set_track+0x21/0x30
              kasan_set_free_info+0x20/0x30
              __kasan_slab_free+0xfb/0x130
              kfree+0xac/0x350
              hci_conn_cleanup+0x101/0x6a0
              hci_conn_del+0x27e/0x6c0
              hci_disconn_phylink_complete_evt+0xe0/0x120
              hci_event_packet+0x812/0xe90
              hci_rx_work+0x4d5/0xc50
              process_one_work+0x8fb/0x15a0
              worker_thread+0x576/0x1240
              kthread+0x29d/0x340
              ret_from_fork+0x1f/0x30
      
          The buggy address belongs to the object at ffff88800c0f0500
          The buggy address is located 24 bytes inside of
          which belongs to the cache kmalloc-128 of size 128
          The buggy address belongs to the page:
          128-byte region [ffff88800c0f0500, ffff88800c0f0580)
          flags: 0x100000000000200(slab|node=0|zone=1)
          page:00000000fe45cd86 refcount:1 mapcount:0
          mapping:0000000000000000 index:0x0 pfn:0xc0f0
          raw: 0000000000000000 0000000080100010 00000001ffffffff
          0000000000000000
          raw: 0100000000000200 ffffea00003a2c80 dead000000000004
          ffff8880078418c0
          page dumped because: kasan: bad access detected
          ffff88800c0f0400: 00 00 00 00 00 00 00 00 00 00 00 00 00 fc fc fc
          Memory state around the buggy address:
          >ffff88800c0f0500: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
          ffff88800c0f0480: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
          ffff88800c0f0580: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
                                      ^
          ==================================================================
          ffff88800c0f0600: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      
      Reported-by: default avatarSönke Huster <soenke.huster@eknoes.de>
      Tested-by: default avatarSönke Huster <soenke.huster@eknoes.de>
      Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      643a6c26
    • Max Filippov's avatar
      xtensa: fix DTC warning unit_address_format · cac5d2a9
      Max Filippov authored
      [ Upstream commit e85d29ba
      
       ]
      
      DTC issues the following warnings when building xtfpga device trees:
      
       /soc/flash@00000000/partition@0x0: unit name should not have leading "0x"
       /soc/flash@00000000/partition@0x6000000: unit name should not have leading "0x"
       /soc/flash@00000000/partition@0x6800000: unit name should not have leading "0x"
       /soc/flash@00000000/partition@0x7fe0000: unit name should not have leading "0x"
      
      Drop leading 0x from flash partition unit names.
      
      Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      cac5d2a9
    • H. Nikolaus Schaller's avatar
      usb: dwc3: omap: fix "unbalanced disables for smps10_out1" on omap5evm · 2e50be51
      H. Nikolaus Schaller authored
      [ Upstream commit ac01df34
      
       ]
      
      Usually, the vbus_regulator (smps10 on omap5evm) boots up disabled.
      
      Hence calling regulator_disable() indirectly through dwc3_omap_set_mailbox()
      during probe leads to:
      
      [   10.332764] WARNING: CPU: 0 PID: 1628 at drivers/regulator/core.c:2853 _regulator_disable+0x40/0x164
      [   10.351919] unbalanced disables for smps10_out1
      [   10.361298] Modules linked in: dwc3_omap(+) clk_twl6040 at24 gpio_twl6040 palmas_gpadc palmas_pwrbutton
      industrialio snd_soc_omap_mcbsp(+) snd_soc_ti_sdma display_connector ti_tpd12s015 drm leds_gpio
      drm_panel_orientation_quirks ip_tables x_tables ipv6 autofs4
      [   10.387818] CPU: 0 PID: 1628 Comm: systemd-udevd Not tainted 5.17.0-rc1-letux-lpae+ #8139
      [   10.405129] Hardware name: Generic OMAP5 (Flattened Device Tree)
      [   10.411455]  unwind_backtrace from show_stack+0x10/0x14
      [   10.416970]  show_stack from dump_stack_lvl+0x40/0x4c
      [   10.422313]  dump_stack_lvl from __warn+0xb8/0x170
      [   10.427377]  __warn from warn_slowpath_fmt+0x70/0x9c
      [   10.432595]  warn_slowpath_fmt from _regulator_disable+0x40/0x164
      [   10.439037]  _regulator_disable from regulator_disable+0x30/0x64
      [   10.445382]  regulator_disable from dwc3_omap_set_mailbox+0x8c/0xf0 [dwc3_omap]
      [   10.453116]  dwc3_omap_set_mailbox [dwc3_omap] from dwc3_omap_probe+0x2b8/0x394 [dwc3_omap]
      [   10.467021]  dwc3_omap_probe [dwc3_omap] from platform_probe+0x58/0xa8
      [   10.481762]  platform_probe from really_probe+0x168/0x2fc
      [   10.481782]  really_probe from __driver_probe_device+0xc4/0xd8
      [   10.481782]  __driver_probe_device from driver_probe_device+0x24/0xa4
      [   10.503762]  driver_probe_device from __driver_attach+0xc4/0xd8
      [   10.510018]  __driver_attach from bus_for_each_dev+0x64/0xa0
      [   10.516001]  bus_for_each_dev from bus_add_driver+0x148/0x1a4
      [   10.524880]  bus_add_driver from driver_register+0xb4/0xf8
      [   10.530678]  driver_register from do_one_initcall+0x90/0x1c4
      [   10.536661]  do_one_initcall from do_init_module+0x4c/0x200
      [   10.536683]  do_init_module from load_module+0x13dc/0x1910
      [   10.551159]  load_module from sys_finit_module+0xc8/0xd8
      [   10.561319]  sys_finit_module from __sys_trace_return+0x0/0x18
      [   10.561336] Exception stack(0xc344bfa8 to 0xc344bff0)
      [   10.561341] bfa0:                   b6fb5778 b6fab8d8 00000007 b6ecfbb8 00000000 b6ed0398
      [   10.561341] bfc0: b6fb5778 b6fab8d8 855c0500 0000017b 00020000 b6f9a3cc 00000000 b6fb5778
      [   10.595500] bfe0: bede18f8 bede18e8 b6ec9aeb b6dda1c2
      [   10.601345] ---[ end trace 0000000000000000 ]---
      
      Fix this unnecessary warning by checking if the regulator is enabled.
      
      Signed-off-by: default avatarH. Nikolaus Schaller <hns@goldelico.com>
      Link: https://lore.kernel.org/r/af3b750dc2265d875deaabcf5f80098c9645da45.1646744616.git.hns@goldelico.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      2e50be51
    • Jianglei Nie's avatar
      scsi: libfc: Fix use after free in fc_exch_abts_resp() · 499d1984
      Jianglei Nie authored
      [ Upstream commit 271add11
      
       ]
      
      fc_exch_release(ep) will decrease the ep's reference count. When the
      reference count reaches zero, it is freed. But ep is still used in the
      following code, which will lead to a use after free.
      
      Return after the fc_exch_release() call to avoid use after free.
      
      Link: https://lore.kernel.org/r/20220303015115.459778-1-niejianglei2021@163.com
      Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
      Signed-off-by: default avatarJianglei Nie <niejianglei2021@163.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      499d1984
    • Alexander Lobakin's avatar
      MIPS: fix fortify panic when copying asm exception handlers · e7036df7
      Alexander Lobakin authored
      [ Upstream commit d17b6641
      
       ]
      
      With KCFLAGS="-O3", I was able to trigger a fortify-source
      memcpy() overflow panic on set_vi_srs_handler().
      Although O3 level is not supported in the mainline, under some
      conditions that may've happened with any optimization settings,
      it's just a matter of inlining luck. The panic itself is correct,
      more precisely, 50/50 false-positive and not at the same time.
      From the one side, no real overflow happens. Exception handler
      defined in asm just gets copied to some reserved places in the
      memory.
      But the reason behind is that C code refers to that exception
      handler declares it as `char`, i.e. something of 1 byte length.
      It's obvious that the asm function itself is way more than 1 byte,
      so fortify logics thought we are going to past the symbol declared.
      The standard way to refer to asm symbols from C code which is not
      supposed to be called from C is to declare them as
      `extern const u8[]`. This is fully correct from any point of view,
      as any code itself is just a bunch of bytes (including 0 as it is
      for syms like _stext/_etext/etc.), and the exact size is not known
      at the moment of compilation.
      Adjust the type of the except_vec_vi_*() and related variables.
      Make set_handler() take `const` as a second argument to avoid
      cast-away warnings and give a little more room for optimization.
      
      Signed-off-by: default avatarAlexander Lobakin <alobakin@pm.me>
      Signed-off-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e7036df7
    • Michael Chan's avatar
      bnxt_en: Eliminate unintended link toggle during FW reset · 44011dcc
      Michael Chan authored
      [ Upstream commit 7c492a25
      
       ]
      
      If the flow control settings have been changed, a subsequent FW reset
      may cause the ethernet link to toggle unnecessarily.  This link toggle
      will increase the down time by a few seconds.
      
      The problem is caused by bnxt_update_phy_setting() detecting a false
      mismatch in the flow control settings between the stored software
      settings and the current FW settings after the FW reset.  This mismatch
      is caused by the AUTONEG bit added to link_info->req_flow_ctrl in an
      inconsistent way in bnxt_set_pauseparam() in autoneg mode.  The AUTONEG
      bit should not be added to link_info->req_flow_ctrl.
      
      Reviewed-by: default avatarColin Winegarden <colin.winegarden@broadcom.com>
      Reviewed-by: default avatarPavan Chebbi <pavan.chebbi@broadcom.com>
      Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      44011dcc
    • Sven Eckelmann's avatar
      macvtap: advertise link netns via netlink · 6abfcac7
      Sven Eckelmann authored
      [ Upstream commit a0219215
      
       ]
      
      Assign rtnl_link_ops->get_link_net() callback so that IFLA_LINK_NETNSID is
      added to rtnetlink messages. This fixes iproute2 which otherwise resolved
      the link interface to an interface in the wrong namespace.
      
      Test commands:
      
        ip netns add nst
        ip link add dummy0 type dummy
        ip link add link macvtap0 link dummy0 type macvtap
        ip link set macvtap0 netns nst
        ip -netns nst link show macvtap0
      
      Before:
      
        10: macvtap0@gre0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 500
            link/ether 5e:8f:ae:1d:60:50 brd ff:ff:ff:ff:ff:ff
      
      After:
      
        10: macvtap0@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 500
            link/ether 5e:8f:ae:1d:60:50 brd ff:ff:ff:ff:ff:ff link-netnsid 0
      
      Reported-by: default avatarLeonardo Mörlein <freifunk@irrelefant.net>
      Signed-off-by: default avatarSven Eckelmann <sven@narfation.org>
      Link: https://lore.kernel.org/r/20220228003240.1337426-1-sven@narfation.org
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      6abfcac7
    • Dust Li's avatar
      net/smc: correct settings of RMB window update limit · 841304d1
      Dust Li authored
      [ Upstream commit 6bf536eb
      
       ]
      
      rmbe_update_limit is used to limit announcing receive
      window updating too frequently. RFC7609 request a minimal
      increase in the window size of 10% of the receive buffer
      space. But current implementation used:
      
        min_t(int, rmbe_size / 10, SOCK_MIN_SNDBUF / 2)
      
      and SOCK_MIN_SNDBUF / 2 == 2304 Bytes, which is almost
      always less then 10% of the receive buffer space.
      
      This causes the receiver always sending CDC message to
      update its consumer cursor when it consumes more then 2K
      of data. And as a result, we may encounter something like
      "TCP silly window syndrome" when sending 2.5~8K message.
      
      This patch fixes this using max(rmbe_size / 10, SOCK_MIN_SNDBUF / 2).
      
      With this patch and SMC autocorking enabled, qperf 2K/4K/8K
      tcp_bw test shows 45%/75%/40% increase in throughput respectively.
      
      Signed-off-by: default avatarDust Li <dust.li@linux.alibaba.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      841304d1
    • Randy Dunlap's avatar
      scsi: aha152x: Fix aha152x_setup() __setup handler return value · 273a2e62
      Randy Dunlap authored
      [ Upstream commit cc8294ec
      
       ]
      
      __setup() handlers should return 1 if the command line option is handled
      and 0 if not (or maybe never return 0; doing so just pollutes init's
      environment with strings that are not init arguments/parameters).
      
      Return 1 from aha152x_setup() to indicate that the boot option has been
      handled.
      
      Link: lore.kernel.org/r/64644a2f-4a20-bab3-1e15-3b2cdd0defe3@omprussia.ru
      Link: https://lore.kernel.org/r/20220223000623.5920-1-rdunlap@infradead.org
      Cc: "Juergen E. Fischer" <fischer@norbit.de>
      Cc: "James E.J. Bottomley" <jejb@linux.ibm.com>
      Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
      Reported-by: default avatarIgor Zhbanov <i.zhbanov@omprussia.ru>
      Signed-off-by: default avatarRandy Dunlap <rdunlap@infradead.org>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      273a2e62
    • Damien Le Moal's avatar
      scsi: pm8001: Fix pm8001_mpi_task_abort_resp() · 3a15300f
      Damien Le Moal authored
      [ Upstream commit 7e6b7e74
      
       ]
      
      The call to pm8001_ccb_task_free() at the end of
      pm8001_mpi_task_abort_resp() already frees the ccb tag. So when the device
      NCQ_ABORT_ALL_FLAG is set, the tag should not be freed again.  Also change
      the hardcoded 0xBFFFFFFF value to ~NCQ_ABORT_ALL_FLAG as it ought to be.
      
      Link: https://lore.kernel.org/r/20220220031810.738362-19-damien.lemoal@opensource.wdc.com
      Reviewed-by: default avatarJack Wang <jinpu.wang@ionos.com>
      Signed-off-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      3a15300f
    • Jordy Zomer's avatar
      dm ioctl: prevent potential spectre v1 gadget · 58880025
      Jordy Zomer authored
      [ Upstream commit cd9c88da
      
       ]
      
      It appears like cmd could be a Spectre v1 gadget as it's supplied by a
      user and used as an array index. Prevent the contents of kernel memory
      from being leaked to userspace via speculative execution by using
      array_index_nospec.
      
      Signed-off-by: default avatarJordy Zomer <jordy@pwning.systems>
      Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      58880025
    • Zhou Guanghui's avatar
      iommu/arm-smmu-v3: fix event handling soft lockup · 5e580cce
      Zhou Guanghui authored
      [ Upstream commit 30de2b54
      
       ]
      
      During event processing, events are read from the event queue one
      by one until the queue is empty.If the master device continuously
      requests address access at the same time and the SMMU generates
      events, the cyclic processing of the event takes a long time and
      softlockup warnings may be reported.
      
      arm-smmu-v3 arm-smmu-v3.34.auto: event 0x0a received:
      arm-smmu-v3 arm-smmu-v3.34.auto: 	0x00007f220000280a
      arm-smmu-v3 arm-smmu-v3.34.auto: 	0x000010000000007e
      arm-smmu-v3 arm-smmu-v3.34.auto: 	0x00000000034e8670
      watchdog: BUG: soft lockup - CPU#0 stuck for 22s! [irq/268-arm-smm:247]
      Call trace:
       _dev_info+0x7c/0xa0
       arm_smmu_evtq_thread+0x1c0/0x230
       irq_thread_fn+0x30/0x80
       irq_thread+0x128/0x210
       kthread+0x134/0x138
       ret_from_fork+0x10/0x1c
      Kernel panic - not syncing: softlockup: hung tasks
      
      Fix this by calling cond_resched() after the event information is
      printed.
      
      Signed-off-by: default avatarZhou Guanghui <zhouguanghui1@huawei.com>
      Link: https://lore.kernel.org/r/20220119070754.26528-1-zhouguanghui1@huawei.com
      Signed-off-by: default avatarWill Deacon <will@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5e580cce
    • Pali Rohár's avatar
      PCI: aardvark: Fix support for MSI interrupts · d7f87c78
      Pali Rohár authored
      [ Upstream commit b0b0b8b8
      
       ]
      
      Aardvark hardware supports Multi-MSI and MSI_FLAG_MULTI_PCI_MSI is already
      set for the MSI chip. But when allocating MSI interrupt numbers for
      Multi-MSI, the numbers need to be properly aligned, otherwise endpoint
      devices send MSI interrupt with incorrect numbers.
      
      Fix this issue by using function bitmap_find_free_region() instead of
      bitmap_find_next_zero_area().
      
      To ensure that aligned MSI interrupt numbers are used by endpoint devices,
      we cannot use Linux virtual irq numbers (as they are random and not
      properly aligned). Instead we need to use the aligned hwirq numbers.
      
      This change fixes receiving MSI interrupts on Armada 3720 boards and
      allows using NVMe disks which use Multi-MSI feature with 3 interrupts.
      
      Without this NVMe disks freeze booting as linux nvme-core.c is waiting
      60s for an interrupt.
      
      Link: https://lore.kernel.org/r/20220110015018.26359-4-kabel@kernel.org
      Signed-off-by: default avatarPali Rohár <pali@kernel.org>
      Signed-off-by: default avatarMarek Behún <kabel@kernel.org>
      Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d7f87c78
    • Sourabh Jain's avatar
      powerpc: Set crashkernel offset to mid of RMA region · 3fc06760
      Sourabh Jain authored
      [ Upstream commit 7c5ed82b
      
       ]
      
      On large config LPARs (having 192 and more cores), Linux fails to boot
      due to insufficient memory in the first memblock. It is due to the
      memory reservation for the crash kernel which starts at 128MB offset of
      the first memblock. This memory reservation for the crash kernel doesn't
      leave enough space in the first memblock to accommodate other essential
      system resources.
      
      The crash kernel start address was set to 128MB offset by default to
      ensure that the crash kernel get some memory below the RMA region which
      is used to be of size 256MB. But given that the RMA region size can be
      512MB or more, setting the crash kernel offset to mid of RMA size will
      leave enough space for the kernel to allocate memory for other system
      resources.
      
      Since the above crash kernel offset change is only applicable to the LPAR
      platform, the LPAR feature detection is pushed before the crash kernel
      reservation. The rest of LPAR specific initialization will still
      be done during pseries_probe_fw_features as usual.
      
      This patch is dependent on changes to paca allocation for boot CPU. It
      expect boot CPU to discover 1T segment support which is introduced by
      the patch posted here:
      https://lists.ozlabs.org/pipermail/linuxppc-dev/2022-January/239175.html
      
      Reported-by: default avatarAbdul haleem <abdhalee@linux.vnet.ibm.com>
      Signed-off-by: default avatarSourabh Jain <sourabhjain@linux.ibm.com>
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      Link: https://lore.kernel.org/r/20220204085601.107257-1-sourabhjain@linux.ibm.com
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      3fc06760
    • Evgeny Boger's avatar
      power: supply: axp20x_battery: properly report current when discharging · 724e76c0
      Evgeny Boger authored
      [ Upstream commit d4f408cd
      
       ]
      
      As stated in [1], negative current values are used for discharging
      batteries.
      
      AXP PMICs internally have two different ADC channels for shunt current
      measurement: one used during charging and one during discharging.
      The values reported by these ADCs are unsigned.
      While the driver properly selects ADC channel to get the data from,
      it doesn't apply negative sign when reporting discharging current.
      
      [1] Documentation/ABI/testing/sysfs-class-power
      
      Signed-off-by: default avatarEvgeny Boger <boger@wirenboard.com>
      Acked-by: default avatarChen-Yu Tsai <wens@csie.org>
      Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      724e76c0
    • Yang Guang's avatar
      scsi: bfa: Replace snprintf() with sysfs_emit() · f3372007
      Yang Guang authored
      [ Upstream commit 2245ea91
      
       ]
      
      coccinelle report:
      ./drivers/scsi/bfa/bfad_attr.c:908:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:860:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:888:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:853:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:808:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:728:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:822:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:927:9-17:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:900:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:874:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:714:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/bfa/bfad_attr.c:839:8-16:
      WARNING: use scnprintf or sprintf
      
      Use sysfs_emit() instead of scnprintf() or sprintf().
      
      Link: https://lore.kernel.org/r/def83ff75faec64ba592b867a8499b1367bae303.1643181468.git.yang.guang5@zte.com.cn
      Reported-by: default avatarZeal Robot <zealci@zte.com.cn>
      Signed-off-by: default avatarYang Guang <yang.guang5@zte.com.cn>
      Signed-off-by: default avatarDavid Yang <davidcomponentone@gmail.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f3372007
    • Yang Guang's avatar
      scsi: mvsas: Replace snprintf() with sysfs_emit() · d065ad74
      Yang Guang authored
      [ Upstream commit 0ad3867b
      
       ]
      
      coccinelle report:
      ./drivers/scsi/mvsas/mv_init.c:699:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/scsi/mvsas/mv_init.c:747:8-16:
      WARNING: use scnprintf or sprintf
      
      Use sysfs_emit() instead of scnprintf() or sprintf().
      
      Link: https://lore.kernel.org/r/c1711f7cf251730a8ceb5bdfc313bf85662b3395.1643182948.git.yang.guang5@zte.com.cn
      Reported-by: default avatarZeal Robot <zealci@zte.com.cn>
      Signed-off-by: default avatarYang Guang <yang.guang5@zte.com.cn>
      Signed-off-by: default avatarDavid Yang <davidcomponentone@gmail.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d065ad74
    • Maxim Kiselev's avatar
      powerpc: dts: t104xrdb: fix phy type for FMAN 4/5 · 0dff88c6
      Maxim Kiselev authored
      [ Upstream commit 17846485
      
       ]
      
      T1040RDB has two RTL8211E-VB phys which requires setting
      of internal delays for correct work.
      
      Changing the phy-connection-type property to `rgmii-id`
      will fix this issue.
      
      Signed-off-by: default avatarMaxim Kiselev <bigunclemax@gmail.com>
      Reviewed-by: default avatarMaxim Kochetkov <fido_max@inbox.ru>
      Reviewed-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      Link: https://lore.kernel.org/r/20211230151123.1258321-1-bigunclemax@gmail.com
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      0dff88c6
    • Yang Guang's avatar
      ptp: replace snprintf with sysfs_emit · 8eff95bc
      Yang Guang authored
      [ Upstream commit e2cf0765
      
       ]
      
      coccinelle report:
      ./drivers/ptp/ptp_sysfs.c:17:8-16:
      WARNING: use scnprintf or sprintf
      ./drivers/ptp/ptp_sysfs.c:390:8-16:
      WARNING: use scnprintf or sprintf
      
      Use sysfs_emit instead of scnprintf or sprintf makes more sense.
      
      Reported-by: default avatarZeal Robot <zealci@zte.com.cn>
      Signed-off-by: default avatarYang Guang <yang.guang5@zte.com.cn>
      Signed-off-by: default avatarDavid Yang <davidcomponentone@gmail.com>
      Acked-by: default avatarRichard Cochran <richardcochran@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      8eff95bc
    • Zekun Shen's avatar
      ath5k: fix OOB in ath5k_eeprom_read_pcal_info_5111 · ed3dfdaa
      Zekun Shen authored
      [ Upstream commit 564d4ece
      
       ]
      
      The bug was found during fuzzing. Stacktrace locates it in
      ath5k_eeprom_convert_pcal_info_5111.
      When none of the curve is selected in the loop, idx can go
      up to AR5K_EEPROM_N_PD_CURVES. The line makes pd out of bound.
      pd = &chinfo[pier].pd_curves[idx];
      
      There are many OOB writes using pd later in the code. So I
      added a sanity check for idx. Checks for other loops involving
      AR5K_EEPROM_N_PD_CURVES are not needed as the loop index is not
      used outside the loops.
      
      The patch is NOT tested with real device.
      
      The following is the fuzzing report
      
      BUG: KASAN: slab-out-of-bounds in ath5k_eeprom_read_pcal_info_5111+0x126a/0x1390 [ath5k]
      Write of size 1 at addr ffff8880174a4d60 by task modprobe/214
      
      CPU: 0 PID: 214 Comm: modprobe Not tainted 5.6.0 #1
      Call Trace:
       dump_stack+0x76/0xa0
       print_address_description.constprop.0+0x16/0x200
       ? ath5k_eeprom_read_pcal_info_5111+0x126a/0x1390 [ath5k]
       ? ath5k_eeprom_read_pcal_info_5111+0x126a/0x1390 [ath5k]
       __kasan_report.cold+0x37/0x7c
       ? ath5k_eeprom_read_pcal_info_5111+0x126a/0x1390 [ath5k]
       kasan_report+0xe/0x20
       ath5k_eeprom_read_pcal_info_5111+0x126a/0x1390 [ath5k]
       ? apic_timer_interrupt+0xa/0x20
       ? ath5k_eeprom_init_11a_pcal_freq+0xbc0/0xbc0 [ath5k]
       ? ath5k_pci_eeprom_read+0x228/0x3c0 [ath5k]
       ath5k_eeprom_init+0x2513/0x6290 [ath5k]
       ? ath5k_eeprom_init_11a_pcal_freq+0xbc0/0xbc0 [ath5k]
       ? usleep_range+0xb8/0x100
       ? apic_timer_interrupt+0xa/0x20
       ? ath5k_eeprom_read_pcal_info_2413+0x2f20/0x2f20 [ath5k]
       ath5k_hw_init+0xb60/0x1970 [ath5k]
       ath5k_init_ah+0x6fe/0x2530 [ath5k]
       ? kasprintf+0xa6/0xe0
       ? ath5k_stop+0x140/0x140 [ath5k]
       ? _dev_notice+0xf6/0xf6
       ? apic_timer_interrupt+0xa/0x20
       ath5k_pci_probe.cold+0x29a/0x3d6 [ath5k]
       ? ath5k_pci_eeprom_read+0x3c0/0x3c0 [ath5k]
       ? mutex_lock+0x89/0xd0
       ? ath5k_pci_eeprom_read+0x3c0/0x3c0 [ath5k]
       local_pci_probe+0xd3/0x160
       pci_device_probe+0x23f/0x3e0
       ? pci_device_remove+0x280/0x280
       ? pci_device_remove+0x280/0x280
       really_probe+0x209/0x5d0
      
      Reported-by: default avatarBrendan Dolan-Gavitt <brendandg@nyu.edu>
      Signed-off-by: default avatarZekun Shen <bruceshenzk@gmail.com>
      Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
      Link: https://lore.kernel.org/r/YckvDdj3mtCkDRIt@a-10-27-26-18.dynapool.vpn.nyu.edu
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      ed3dfdaa