Skip to content
  1. Apr 20, 2022
    • Guillaume Nault's avatar
      veth: Ensure eth header is in skb's linear part · d417a859
      Guillaume Nault authored
      [ Upstream commit 726e2c59 ]
      
      After feeding a decapsulated packet to a veth device with act_mirred,
      skb_headlen() may be 0. But veth_xmit() calls __dev_forward_skb(),
      which expects at least ETH_HLEN byte of linear data (as
      __dev_forward_skb2() calls eth_type_trans(), which pulls ETH_HLEN bytes
      unconditionally).
      
      Use pskb_may_pull() to ensure veth_xmit() respects this constraint.
      
      kernel BUG at include/linux/skbuff.h:2328!
      RIP: 0010:eth_type_trans+0xcf/0x140
      Call Trace:
       <IRQ>
       __dev_forward_skb2+0xe3/0x160
       veth_xmit+0x6e/0x250 [veth]
       dev_hard_start_xmit+0xc7/0x200
       __dev_queue_xmit+0x47f/0x520
       ? skb_ensure_writable+0x85/0xa0
       ? skb_mpls_pop+0x98/0x1c0
       tcf_mirred_act+0x442/0x47e [act_mirred]
       tcf_action_exec+0x86/0x140
       fl_classify+0x1d8/0x1e0 [cls_flower]
       ? dma_pte_clear_level+0x129/0x1a0
       ? dma_pte_clear_level+0x129/0x1a0
       ? prb_fill_curr_block+0x2f/0xc0
       ? skb_copy_bits+0x11a/0x220
       __tcf_classify+0x58/0x110
       tcf_classify_ingress+0x6b/0x140
       __netif_receive_skb_core.constprop.0+0x47d/0xfd0
       ? __iommu_dma_unmap_swiotlb+0x44/0x90
       __netif_receive_skb_one_core+0x3d/0xa0
       netif_receive_skb+0x116/0x170
       be_process_rx+0x22f/0x330 [be2net]
       be_poll+0x13c/0x370 [be2net]
       __napi_poll+0x2a/0x170
       net_rx_action+0x22f/0x2f0
       __do_softirq+0xca/0x2a8
       __irq_exit_rcu+0xc1/0xe0
       common_interrupt+0x83/0xa0
      
      Fixes: e314dbdc
      
       ("[NET]: Virtual ethernet device driver.")
      Signed-off-by: default avatarGuillaume Nault <gnault@redhat.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d417a859
    • Miaoqian Lin's avatar
      memory: atmel-ebi: Fix missing of_node_put in atmel_ebi_probe · 0b9cafca
      Miaoqian Lin authored
      [ Upstream commit 6f296a96 ]
      
      The device_node pointer is returned by of_parse_phandle() with refcount
      incremented. We should use of_node_put() on it when done.
      
      Fixes: 87108dc7
      
       ("memory: atmel-ebi: Enable the SMC clock if specified")
      Signed-off-by: default avatarMiaoqian Lin <linmq006@gmail.com>
      Reviewed-by: default avatarClaudiu Beznea <claudiu.beznea@microchip.com>
      Link: https://lore.kernel.org/r/20220309110144.22412-1-linmq006@gmail.com
      Signed-off-by: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      0b9cafca
    • Xin Long's avatar
      xfrm: policy: match with both mark and mask on user interfaces · 94c29157
      Xin Long authored
      commit 4f47e8ab upstream.
      
      In commit ed17b8d3 ("xfrm: fix a warning in xfrm_policy_insert_list"),
      it would take 'priority' to make a policy unique, and allow duplicated
      policies with different 'priority' to be added, which is not expected
      by userland, as Tobias reported in strongswan.
      
      To fix this duplicated policies issue, and also fix the issue in
      commit ed17b8d3 ("xfrm: fix a warning in xfrm_policy_insert_list"),
      when doing add/del/get/update on user interfaces, this patch is to change
      to look up a policy with both mark and mask by doing:
      
        mark.v == pol->mark.v && mark.m == pol->mark.m
      
      and leave the check:
      
        (mark & pol->mark.m) == pol->mark.v
      
      for tx/rx path only.
      
      As the userland expects an exact mark and mask match to manage policies.
      
      v1->v2:
        - make xfrm_policy_mark_match inline and fix the changelog as
          Tobias suggested.
      
      Fixes: 295fae56 ("xfrm: Allow user space manipulation of SPD mark")
      Fixes: ed17b8d3
      
       ("xfrm: fix a warning in xfrm_policy_insert_list")
      Reported-by: default avatarTobias Brunner <tobias@strongswan.org>
      Tested-by: default avatarTobias Brunner <tobias@strongswan.org>
      Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
      Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      94c29157
    • Tejun Heo's avatar
      cgroup: Use open-time cgroup namespace for process migration perm checks · 2337c825
      Tejun Heo authored
      commit e5745764
      
       upstream.
      
      cgroup process migration permission checks are performed at write time as
      whether a given operation is allowed or not is dependent on the content of
      the write - the PID. This currently uses current's cgroup namespace which is
      a potential security weakness as it may allow scenarios where a less
      privileged process tricks a more privileged one into writing into a fd that
      it created.
      
      This patch makes cgroup remember the cgroup namespace at the time of open
      and uses it for migration permission checks instad of current's. Note that
      this only applies to cgroup2 as cgroup1 doesn't have namespace support.
      
      This also fixes a use-after-free bug on cgroupns reported in
      
       https://lore.kernel.org/r/00000000000048c15c05d0083397@google.com
      
      Note that backporting this fix also requires the preceding patch.
      
      Reported-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
      Suggested-by: default avatarLinus Torvalds <torvalds@linuxfoundation.org>
      Cc: Michal Koutný <mkoutny@suse.com>
      Cc: Oleg Nesterov <oleg@redhat.com>
      Reviewed-by: default avatarMichal Koutný <mkoutny@suse.com>
      Reported-by: default avatar <syzbot+50f5cf33a284ce738b62@syzkaller.appspotmail.com>
      Link: https://lore.kernel.org/r/00000000000048c15c05d0083397@google.com
      Fixes: 5136f636
      
       ("cgroup: implement "nsdelegate" mount option")
      Signed-off-by: default avatarTejun Heo <tj@kernel.org>
      [mkoutny: v5.10: duplicate ns check in procs/threads write handler, adjust context]
      Signed-off-by: default avatarMichal Koutný <mkoutny@suse.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      [OP: backport to v4.14: drop changes to cgroup_attach_permissions() and
      cgroup_css_set_fork(), adjust cgroup_procs_write_permission() calls]
      Signed-off-by: default avatarOvidiu Panait <ovidiu.panait@windriver.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2337c825
    • Tejun Heo's avatar
      cgroup: Allocate cgroup_file_ctx for kernfs_open_file->priv · f1ce7855
      Tejun Heo authored
      commit 0d2b5955
      
       upstream.
      
      of->priv is currently used by each interface file implementation to store
      private information. This patch collects the current two private data usages
      into struct cgroup_file_ctx which is allocated and freed by the common path.
      This allows generic private data which applies to multiple files, which will
      be used to in the following patch.
      
      Note that cgroup_procs iterator is now embedded as procs.iter in the new
      cgroup_file_ctx so that it doesn't need to be allocated and freed
      separately.
      
      v2: union dropped from cgroup_file_ctx and the procs iterator is embedded in
          cgroup_file_ctx as suggested by Linus.
      
      v3: Michal pointed out that cgroup1's procs pidlist uses of->priv too.
          Converted. Didn't change to embedded allocation as cgroup1 pidlists get
          stored for caching.
      
      Signed-off-by: default avatarTejun Heo <tj@kernel.org>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Reviewed-by: default avatarMichal Koutný <mkoutny@suse.com>
      [mkoutny: v5.10: modify cgroup.pressure handlers, adjust context]
      Signed-off-by: default avatarMichal Koutný <mkoutny@suse.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      [OP: backport to v4.14: drop changes to cgroup_pressure_*() functions]
      Signed-off-by: default avatarOvidiu Panait <ovidiu.panait@windriver.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f1ce7855
    • Tejun Heo's avatar
      cgroup: Use open-time credentials for process migraton perm checks · a70bcf9e
      Tejun Heo authored
      commit 1756d799
      
       upstream.
      
      cgroup process migration permission checks are performed at write time as
      whether a given operation is allowed or not is dependent on the content of
      the write - the PID. This currently uses current's credentials which is a
      potential security weakness as it may allow scenarios where a less
      privileged process tricks a more privileged one into writing into a fd that
      it created.
      
      This patch makes both cgroup2 and cgroup1 process migration interfaces to
      use the credentials saved at the time of open (file->f_cred) instead of
      current's.
      
      Reported-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
      Suggested-by: default avatarLinus Torvalds <torvalds@linuxfoundation.org>
      Fixes: 187fe840
      
       ("cgroup: require write perm on common ancestor when moving processes on the default hierarchy")
      Reviewed-by: default avatarMichal Koutný <mkoutny@suse.com>
      Signed-off-by: default avatarTejun Heo <tj@kernel.org>
      [OP: backport to v4.14: apply original __cgroup_procs_write() changes to
      cgroup_threads_write() and cgroup_procs_write()]
      Signed-off-by: default avatarOvidiu Panait <ovidiu.panait@windriver.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a70bcf9e
    • Waiman Long's avatar
      mm/sparsemem: fix 'mem_section' will never be NULL gcc 12 warning · 45ac758e
      Waiman Long authored
      commit a431dbbc upstream.
      
      The gcc 12 compiler reports a "'mem_section' will never be NULL" warning
      on the following code:
      
          static inline struct mem_section *__nr_to_section(unsigned long nr)
          {
          #ifdef CONFIG_SPARSEMEM_EXTREME
              if (!mem_section)
                      return NULL;
          #endif
              if (!mem_section[SECTION_NR_TO_ROOT(nr)])
                      return NULL;
             :
      
      It happens with CONFIG_SPARSEMEM_EXTREME off.  The mem_section definition
      is
      
          #ifdef CONFIG_SPARSEMEM_EXTREME
          extern struct mem_section **mem_section;
          #else
          extern struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT];
          #endif
      
      In the !CONFIG_SPARSEMEM_EXTREME case, mem_section is a static
      2-dimensional array and so the check "!mem_section[SECTION_NR_TO_ROOT(nr)]"
      doesn't make sense.
      
      Fix this warning by moving the "!mem_section[SECTION_NR_TO_ROOT(nr)]"
      check up inside the CONFIG_SPARSEMEM_EXTREME block and adding an
      explicit NR_SECTION_ROOTS check to make sure that there is no
      out-of-bound array access.
      
      Link: https://lkml.kernel.org/r/20220331180246.2746210-1-longman@redhat.com
      Fixes: 3e347261
      
       ("sparsemem extreme implementation")
      Signed-off-by: default avatarWaiman Long <longman@redhat.com>
      Reported-by: default avatarJustin Forbes <jforbes@redhat.com>
      Cc: "Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Rafael Aquini <aquini@redhat.com>
      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>
      45ac758e
    • Fangrui Song's avatar
      arm64: module: remove (NOLOAD) from linker script · 324d3d66
      Fangrui Song authored
      commit 4013e266
      
       upstream.
      
      On ELF, (NOLOAD) sets the section type to SHT_NOBITS[1]. It is conceptually
      inappropriate for .plt and .text.* sections which are always
      SHT_PROGBITS.
      
      In GNU ld, if PLT entries are needed, .plt will be SHT_PROGBITS anyway
      and (NOLOAD) will be essentially ignored. In ld.lld, since
      https://reviews.llvm.org/D118840 ("[ELF] Support (TYPE=<value>) to
      customize the output section type"), ld.lld will report a `section type
      mismatch` error. Just remove (NOLOAD) to fix the error.
      
      [1] https://lld.llvm.org/ELF/linker_script.html As of today, "The
      section should be marked as not loadable" on
      https://sourceware.org/binutils/docs/ld/Output-Section-Type.html is
      outdated for ELF.
      
      Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
      Reported-by: default avatarNathan Chancellor <nathan@kernel.org>
      Signed-off-by: default avatarFangrui Song <maskray@google.com>
      Acked-by: default avatarArd Biesheuvel <ardb@kernel.org>
      Link: https://lore.kernel.org/r/20220218081209.354383-1-maskray@google.com
      Signed-off-by: default avatarWill Deacon <will@kernel.org>
      [nathan: Fix conflicts due to lack of 596b0474
      
      ]
      Signed-off-by: default avatarNathan Chancellor <nathan@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      324d3d66
    • Peter Xu's avatar
      mm: don't skip swap entry even if zap_details specified · d3cb86e6
      Peter Xu authored
      commit 5abfd71d upstream.
      
      Patch series "mm: Rework zap ptes on swap entries", v5.
      
      Patch 1 should fix a long standing bug for zap_pte_range() on
      zap_details usage.  The risk is we could have some swap entries skipped
      while we should have zapped them.
      
      Migration entries are not the major concern because file backed memory
      always zap in the pattern that "first time without page lock, then
      re-zap with page lock" hence the 2nd zap will always make sure all
      migration entries are already recovered.
      
      However there can be issues with real swap entries got skipped
      errornoously.  There's a reproducer provided in commit message of patch
      1 for that.
      
      Patch 2-4 are cleanups that are based on patch 1.  After the whole
      patchset applied, we should have a very clean view of zap_pte_range().
      
      Only patch 1 needs to be backported to stable if necessary.
      
      This patch (of 4):
      
      The "details" pointer shouldn't be the token to decide whether we should
      skip swap entries.
      
      For example, when the callers specified details->zap_mapping==NULL, it
      means the user wants to zap all the pages (including COWed pages), then
      we need to look into swap entries because there can be private COWed
      pages that was swapped out.
      
      Skipping some swap entries when details is non-NULL may lead to wrongly
      leaving some of the swap entries while we should have zapped them.
      
      A reproducer of the problem:
      
      ===8<===
              #define _GNU_SOURCE         /* See feature_test_macros(7) */
              #include <stdio.h>
              #include <assert.h>
              #include <unistd.h>
              #include <sys/mman.h>
              #include <sys/types.h>
      
              int page_size;
              int shmem_fd;
              char *buffer;
      
              void main(void)
              {
                      int ret;
                      char val;
      
                      page_size = getpagesize();
                      shmem_fd = memfd_create("test", 0);
                      assert(shmem_fd >= 0);
      
                      ret = ftruncate(shmem_fd, page_size * 2);
                      assert(ret == 0);
      
                      buffer = mmap(NULL, page_size * 2, PROT_READ | PROT_WRITE,
                                      MAP_PRIVATE, shmem_fd, 0);
                      assert(buffer != MAP_FAILED);
      
                      /* Write private page, swap it out */
                      buffer[page_size] = 1;
                      madvise(buffer, page_size * 2, MADV_PAGEOUT);
      
                      /* This should drop private buffer[page_size] already */
                      ret = ftruncate(shmem_fd, page_size);
                      assert(ret == 0);
                      /* Recover the size */
                      ret = ftruncate(shmem_fd, page_size * 2);
                      assert(ret == 0);
      
                      /* Re-read the data, it should be all zero */
                      val = buffer[page_size];
                      if (val == 0)
                              printf("Good\n");
                      else
                              printf("BUG\n");
              }
      ===8<===
      
      We don't need to touch up the pmd path, because pmd never had a issue with
      swap entries.  For example, shmem pmd migration will always be split into
      pte level, and same to swapping on anonymous.
      
      Add another helper should_zap_cows() so that we can also check whether we
      should zap private mappings when there's no page pointer specified.
      
      This patch drops that trick, so we handle swap ptes coherently.  Meanwhile
      we should do the same check upon migration entry, hwpoison entry and
      genuine swap entries too.
      
      To be explicit, we should still remember to keep the private entries if
      even_cows==false, and always zap them when even_cows==true.
      
      The issue seems to exist starting from the initial commit of git.
      
      [peterx@redhat.com: comment tweaks]
        Link: https://lkml.kernel.org/r/20220217060746.71256-2-peterx@redhat.com
      
      Link: https://lkml.kernel.org/r/20220217060746.71256-1-peterx@redhat.com
      Link: https://lkml.kernel.org/r/20220216094810.60572-1-peterx@redhat.com
      Link: https://lkml.kernel.org/r/20220216094810.60572-2-peterx@redhat.com
      Fixes: 1da177e4
      
       ("Linux-2.6.12-rc2")
      Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
      Reviewed-by: default avatarJohn Hubbard <jhubbard@nvidia.com>
      Cc: David Hildenbrand <david@redhat.com>
      Cc: Hugh Dickins <hughd@google.com>
      Cc: Alistair Popple <apopple@nvidia.com>
      Cc: Andrea Arcangeli <aarcange@redhat.com>
      Cc: "Kirill A . Shutemov" <kirill@shutemov.name>
      Cc: Matthew Wilcox <willy@infradead.org>
      Cc: Vlastimil Babka <vbabka@suse.cz>
      Cc: Yang Shi <shy828301@gmail.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>
      d3cb86e6
    • Vinod Koul's avatar
      dmaengine: Revert "dmaengine: shdma: Fix runtime PM imbalance on error" · e05a6ae6
      Vinod Koul authored
      commit d143f939 upstream.
      
      This reverts commit 455896c5
      
       ("dmaengine: shdma: Fix runtime PM
      imbalance on error") as the patch wrongly reduced the count on error and
      did not bail out. So drop the count by reverting the patch .
      
      Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e05a6ae6
    • Arnaldo Carvalho de Melo's avatar
      tools build: Use $(shell ) instead of `` to get embedded libperl's ccopts · f31fb76d
      Arnaldo Carvalho de Melo authored
      commit 541f695c
      
       upstream.
      
      Just like its done for ldopts and for both in tools/perf/Makefile.config.
      
      Using `` to initialize PERL_EMBED_CCOPTS somehow precludes using:
      
        $(filter-out SOMETHING_TO_FILTER,$(PERL_EMBED_CCOPTS))
      
      And we need to do it to allow for building with versions of clang where
      some gcc options selected by distros are not available.
      
      Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # Debian/Selfmade LLVM-14 (x86-64)
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Fangrui Song <maskray@google.com>
      Cc: Florian Fainelli <f.fainelli@gmail.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Keeping <john@metanate.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Michael Petlan <mpetlan@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nathan Chancellor <nathan@kernel.org>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Link: http://lore.kernel.org/lkml/YktYX2OnLtyobRYD@kernel.org
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f31fb76d
    • Xiaomeng Tong's avatar
      perf: qcom_l2_pmu: fix an incorrect NULL check on list iterator · 9cb43410
      Xiaomeng Tong authored
      commit 2012a9e2 upstream.
      
      The bug is here:
      	return cluster;
      
      The list iterator value 'cluster' will *always* be set and non-NULL
      by list_for_each_entry(), so it is incorrect to assume that the
      iterator value will be NULL if the list is empty or no element
      is found.
      
      To fix the bug, return 'cluster' when found, otherwise return NULL.
      
      Cc: stable@vger.kernel.org
      Fixes: 21bdbb71
      
       ("perf: add qcom l2 cache perf events driver")
      Signed-off-by: default avatarXiaomeng Tong <xiam0nd.tong@gmail.com>
      Link: https://lore.kernel.org/r/20220327055733.4070-1-xiam0nd.tong@gmail.com
      Signed-off-by: default avatarWill Deacon <will@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9cb43410
    • Guo Ren's avatar
      arm64: patch_text: Fixup last cpu should be master · 1af9f319
      Guo Ren authored
      commit 31a099db upstream.
      
      These patch_text implementations are using stop_machine_cpuslocked
      infrastructure with atomic cpu_count. The original idea: When the
      master CPU patch_text, the others should wait for it. But current
      implementation is using the first CPU as master, which couldn't
      guarantee the remaining CPUs are waiting. This patch changes the
      last CPU as the master to solve the potential risk.
      
      Fixes: ae164807
      
       ("arm64: introduce interfaces to hotpatch kernel and module code")
      Signed-off-by: default avatarGuo Ren <guoren@linux.alibaba.com>
      Signed-off-by: default avatarGuo Ren <guoren@kernel.org>
      Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
      Reviewed-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Cc: <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20220407073323.743224-2-guoren@kernel.org
      Signed-off-by: default avatarWill Deacon <will@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      1af9f319
    • Ethan Lien's avatar
      btrfs: fix qgroup reserve overflow the qgroup limit · 0355387e
      Ethan Lien authored
      commit b642b52d
      
       upstream.
      
      We use extent_changeset->bytes_changed in qgroup_reserve_data() to record
      how many bytes we set for EXTENT_QGROUP_RESERVED state. Currently the
      bytes_changed is set as "unsigned int", and it will overflow if we try to
      fallocate a range larger than 4GiB. The result is we reserve less bytes
      and eventually break the qgroup limit.
      
      Unlike regular buffered/direct write, which we use one changeset for
      each ordered extent, which can never be larger than 256M.  For
      fallocate, we use one changeset for the whole range, thus it no longer
      respects the 256M per extent limit, and caused the problem.
      
      The following example test script reproduces the problem:
      
        $ cat qgroup-overflow.sh
        #!/bin/bash
      
        DEV=/dev/sdj
        MNT=/mnt/sdj
      
        mkfs.btrfs -f $DEV
        mount $DEV $MNT
      
        # Set qgroup limit to 2GiB.
        btrfs quota enable $MNT
        btrfs qgroup limit 2G $MNT
      
        # Try to fallocate a 3GiB file. This should fail.
        echo
        echo "Try to fallocate a 3GiB file..."
        fallocate -l 3G $MNT/3G.file
      
        # Try to fallocate a 5GiB file.
        echo
        echo "Try to fallocate a 5GiB file..."
        fallocate -l 5G $MNT/5G.file
      
        # See we break the qgroup limit.
        echo
        sync
        btrfs qgroup show -r $MNT
      
        umount $MNT
      
      When running the test:
      
        $ ./qgroup-overflow.sh
        (...)
      
        Try to fallocate a 3GiB file...
        fallocate: fallocate failed: Disk quota exceeded
      
        Try to fallocate a 5GiB file...
      
        qgroupid         rfer         excl     max_rfer
        --------         ----         ----     --------
        0/5           5.00GiB      5.00GiB      2.00GiB
      
      Since we have no control of how bytes_changed is used, it's better to
      set it to u64.
      
      CC: stable@vger.kernel.org # 4.14+
      Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
      Signed-off-by: default avatarEthan Lien <ethanlien@synology.com>
      Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0355387e
    • Pawan Gupta's avatar
      x86/speculation: Restore speculation related MSRs during S3 resume · 7b5f1702
      Pawan Gupta authored
      commit e2a1256b upstream.
      
      After resuming from suspend-to-RAM, the MSRs that control CPU's
      speculative execution behavior are not being restored on the boot CPU.
      
      These MSRs are used to mitigate speculative execution vulnerabilities.
      Not restoring them correctly may leave the CPU vulnerable.  Secondary
      CPU's MSRs are correctly being restored at S3 resume by
      identify_secondary_cpu().
      
      During S3 resume, restore these MSRs for boot CPU when restoring its
      processor state.
      
      Fixes: 77243971
      
       ("x86/bugs/intel: Set proper CPU features and setup RDS")
      Reported-by: default avatarNeelima Krishnan <neelima.krishnan@intel.com>
      Signed-off-by: default avatarPawan Gupta <pawan.kumar.gupta@linux.intel.com>
      Tested-by: default avatarNeelima Krishnan <neelima.krishnan@intel.com>
      Acked-by: default avatarBorislav Petkov <bp@suse.de>
      Reviewed-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7b5f1702
    • Pawan Gupta's avatar
      x86/pm: Save the MSR validity status at context setup · ef460056
      Pawan Gupta authored
      commit 73924ec4 upstream.
      
      The mechanism to save/restore MSRs during S3 suspend/resume checks for
      the MSR validity during suspend, and only restores the MSR if its a
      valid MSR.  This is not optimal, as an invalid MSR will unnecessarily
      throw an exception for every suspend cycle.  The more invalid MSRs,
      higher the impact will be.
      
      Check and save the MSR validity at setup.  This ensures that only valid
      MSRs that are guaranteed to not throw an exception will be attempted
      during suspend.
      
      Fixes: 7a9c2dd0
      
       ("x86/pm: Introduce quirk framework to save/restore extra MSR registers around suspend/resume")
      Suggested-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
      Signed-off-by: default avatarPawan Gupta <pawan.kumar.gupta@linux.intel.com>
      Reviewed-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
      Acked-by: default avatarBorislav Petkov <bp@suse.de>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ef460056
    • 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