1. 02 Mar, 2016 2 commits
    • Suraj Jitindar Singh's avatar
      selftests/powerpc: Remove -flto from common CFLAGS · a4cf0a2e
      Suraj Jitindar Singh authored
      LTO can cause GCC to inline some functions which have attributes set.
      The act of inlining the functions can lead to GCC forgetting about the
      attributes which leads to incorrect tests.
      
      Notable example being: __attribute__((__target__("no-vsx")))
      
      LTO can also interact strangely with custom assembly functions and cause
      tests to intermittently fail.
      
      Both these cases are hard to detect and require manual inspection of
      binaries which is unlikely to happen for all tests. Furthermore, LTO
      optimisations are not necessary for selftests and correctness is
      paramount and as such it is best to disable LTO.
      
      LTO can be enabled on a per test basis.
      
      A pseries_le_defconfig kernel on a POWER8 was used to determine that the
      same subset of selftests pass and fail with and without -flto in the
      common Makefile.
      Signed-off-by: default avatarSuraj Jitindar Singh <sjitindarsingh@gmail.com>
      Reviewed-by: default avatarCyril Bur <cyrilbur@gmail.com>
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      a4cf0a2e
    • Michael Ellerman's avatar
      selftests/powerpc: Fix out of bounds access in TM signal test · 501e279c
      Michael Ellerman authored
      Gcc helpfully points out that we're accessing past the end of the gprs
      array:
      
        tm-signal-msr-resv.c: In function 'signal_usr1':
        tm-signal-msr-resv.c:43:37: error: array subscript is above array bounds [-Werror=array-bounds]
          ucp->uc_mcontext.regs->gpr[PT_MSR] |= (7ULL);
      
      We haven't noticed previously because -flto was hiding it somehow.
      
      The code is confused, PT_MSR isn't a gpr, instead it's in
      uc_regs->gregs, so fix it.
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      501e279c
  2. 01 Mar, 2016 9 commits
  3. 29 Feb, 2016 7 commits
  4. 27 Feb, 2016 2 commits
  5. 25 Feb, 2016 1 commit
  6. 24 Feb, 2016 5 commits
  7. 22 Feb, 2016 6 commits
  8. 17 Feb, 2016 7 commits
  9. 15 Feb, 2016 1 commit
    • Aneesh Kumar K.V's avatar
      powerpc/mm: Fix Multi hit ERAT cause by recent THP update · c777e2a8
      Aneesh Kumar K.V authored
      With ppc64 we use the deposited pgtable_t to store the hash pte slot
      information. We should not withdraw the deposited pgtable_t without
      marking the pmd none. This ensure that low level hash fault handling
      will skip this huge pte and we will handle them at upper levels.
      
      Recent change to pmd splitting changed the above in order to handle the
      race between pmd split and exit_mmap. The race is explained below.
      
      Consider following race:
      
      		CPU0				CPU1
      shrink_page_list()
        add_to_swap()
          split_huge_page_to_list()
            __split_huge_pmd_locked()
              pmdp_huge_clear_flush_notify()
      	// pmd_none() == true
      					exit_mmap()
      					  unmap_vmas()
      					    zap_pmd_range()
      					      // no action on pmd since pmd_none() == true
      	pmd_populate()
      
      As result the THP will not be freed. The leak is detected by check_mm():
      
      	BUG: Bad rss-counter state mm:ffff880058d2e580 idx:1 val:512
      
      The above required us to not mark pmd none during a pmd split.
      
      The fix for ppc is to clear the huge pte of _PAGE_USER, so that low
      level fault handling code skip this pte. At higher level we do take ptl
      lock. That should serialze us against the pmd split. Once the lock is
      acquired we do check the pmd again using pmd_same. That should always
      return false for us and hence we should retry the access. We do the
      pmd_same check in all case after taking plt with
      THP (do_huge_pmd_wp_page, do_huge_pmd_numa_page and
      huge_pmd_set_accessed)
      
      Also make sure we wait for irq disable section in other cpus to finish
      before flipping a huge pte entry with a regular pmd entry. Code paths
      like find_linux_pte_or_hugepte depend on irq disable to get
      a stable pte_t pointer. A parallel thp split need to make sure we
      don't convert a pmd pte to a regular pmd entry without waiting for the
      irq disable section to finish.
      
      Fixes: eef1b3ba ("thp: implement split_huge_pmd()")
      Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
      Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      c777e2a8