1. 21 May, 2019 1 commit
  2. 23 Jan, 2018 1 commit
  3. 03 May, 2017 1 commit
  4. 10 Sep, 2015 1 commit
  5. 08 Sep, 2015 1 commit
  6. 25 Jun, 2015 1 commit
    • Naoya Horiguchi's avatar
      mm/memory-failure: introduce get_hwpoison_page() for consistent refcount handling · ead07f6a
      Naoya Horiguchi authored
      memory_failure() can run in 2 different mode (specified by
      MF_COUNT_INCREASED) in page refcount perspective.  When
      MF_COUNT_INCREASED is set, memory_failure() assumes that the caller
      takes a refcount of the target page.  And if cleared, memory_failure()
      takes it in it's own.
      
      In current code, however, refcounting is done differently in each caller.
      For example, madvise_hwpoison() uses get_user_pages_fast() and
      hwpoison_inject() uses get_page_unless_zero().  So this inconsistent
      refcounting causes refcount failure especially for thp tail pages.
      Typical user visible effects are like memory leak or
      VM_BUG_ON_PAGE(!page_count(page)) in isolate_lru_page().
      
      To fix this refcounting issue, this patch introduces get_hwpoison_page()
      to handle thp tail pages in the same manner for each caller of hwpoison
      code.
      
      memory_failure() might fail to split thp and in such case it returns
      without completing page isolation.  This is not good because PageHWPoison
      on the thp is still set and there's no easy way to unpoison such thps.  So
      this patch try to roll back any action to the thp in "non anonymous thp"
      case and "thp split failed" case, expecting an MCE(SRAR) generated by
      later access afterward will properly free such thps.
      
      [[email protected]: fix CONFIG_HWPOISON_INJECT=m]
      Signed-off-by: default avatarNaoya Horiguchi <[email protected]>
      Cc: Andi Kleen <[email protected]>
      Cc: Tony Luck <[email protected]>
      Cc: "Kirill A. Shutemov" <[email protected]>
      Signed-off-by: default avatarAndrew Morton <[email protected]>
      Signed-off-by: default avatarLinus Torvalds <[email protected]>
      ead07f6a
  7. 06 May, 2015 2 commits
  8. 07 Aug, 2014 1 commit
  9. 22 Jan, 2014 1 commit
  10. 30 Sep, 2013 1 commit
  11. 11 Sep, 2013 1 commit
  12. 01 Aug, 2012 1 commit
  13. 03 Jan, 2012 1 commit
  14. 31 Mar, 2011 1 commit
  15. 11 Aug, 2010 1 commit
  16. 16 Dec, 2009 8 commits
    • Andi Kleen's avatar
      0d57eb8d
    • Andi Kleen's avatar
      HWPOISON: Add soft page offline support · facb6011
      Andi Kleen authored
      This is a simpler, gentler variant of memory_failure() for soft page
      offlining controlled from user space.  It doesn't kill anything, just
      tries to invalidate and if that doesn't work migrate the
      page away.
      
      This is useful for predictive failure analysis, where a page has
      a high rate of corrected errors, but hasn't gone bad yet. Instead
      it can be offlined early and avoided.
      
      The offlining is controlled from sysfs, including a new generic
      entry point for hard page offlining for symmetry too.
      
      We use the page isolate facility to prevent re-allocation
      race. Normally this is only used by memory hotplug. To avoid
      races with memory allocation I am using lock_system_sleep().
      This avoids the situation where memory hotplug is about
      to isolate a page range and then hwpoison undoes that work.
      This is a big hammer currently, but the simplest solution
      currently.
      
      When the page is not free or LRU we try to free pages
      from slab and other caches. The slab freeing is currently
      quite dumb and does not try to focus on the specific slab
      cache which might own the page. This could be potentially
      improved later.
      
      Thanks to Fengguang Wu and Haicheng Li for some fixes.
      
      [Added fix from Andrew Morton to adapt to new migrate_pages prototype]
      Signed-off-by: default avatarAndi Kleen <[email protected]>
      facb6011
    • Haicheng Li's avatar
      HWPOISON: add an interface to switch off/on all the page filters · 1bfe5feb
      Haicheng Li authored
      In some use cases, user doesn't need extra filtering. E.g. user program
      can inject errors through madvise syscall to its own pages, however it
      might not know what the page state exactly is or which inode the page
      belongs to.
      
      So introduce an one-off interface "corrupt-filter-enable".
      
      Echo 0 to switch off page filters, and echo 1 to switch on the filters.
      [AK: changed default to 0]
      Signed-off-by: default avatarHaicheng Li <[email protected]>
      Signed-off-by: default avatarWu Fengguang <[email protected]>
      Signed-off-by: default avatarAndi Kleen <[email protected]>
      1bfe5feb
    • Andi Kleen's avatar
      HWPOISON: add memory cgroup filter · 4fd466eb
      Andi Kleen authored
      The hwpoison test suite need to inject hwpoison to a collection of
      selected task pages, and must not touch pages not owned by them and
      thus kill important system processes such as init. (But it's OK to
      mis-hwpoison free/unowned pages as well as shared clean pages.
      Mis-hwpoison of shared dirty pages will kill all tasks, so the test
      suite will target all or non of such tasks in the first place.)
      
      The memory cgroup serves this purpose well. We can put the target
      processes under the control of a memory cgroup, and tell the hwpoison
      injection code to only kill pages associated with some active memory
      cgroup.
      
      The prerequisite for doing hwpoison stress tests with mem_cgroup is,
      the mem_cgroup code tracks task pages _accurately_ (unless page is
      locked).  Which we believe is/should be true.
      
      The benefits are simplification of hwpoison injector code. Also the
      mem_cgroup code will automatically be tested by hwpoison test cases.
      
      The alternative interfaces pin-pfn/unpin-pfn can also delegate the
      (process and page flags) filtering functions reliably to user space.
      However prototype implementation shows that this scheme adds more
      complexity than we wanted.
      
      Example test case:
      
      	mkdir /cgroup/hwpoison
      
      	usemem -m 100 -s 1000 &
      	echo `jobs -p` > /cgroup/hwpoison/tasks
      
      	memcg_ino=$(ls -id /cgroup/hwpoison | cut -f1 -d' ')
      	echo $memcg_ino > /debug/hwpoison/corrupt-filter-memcg
      
      	page-types -p `pidof init`   --hwpoison  # shall do nothing
      	page-types -p `pidof usemem` --hwpoison  # poison its pages
      
      [AK: Fix documentation]
      [Add fix for problem noticed by Li Zefan <[email protected]>;
      dentry in the css could be NULL]
      
      CC: KOSAKI Motohiro <[email protected]>
      CC: Hugh Dickins <[email protected]>
      CC: Daisuke Nishimura <[email protected]>
      CC: Balbir Singh <[email protected]>
      CC: KAMEZAWA Hiroyuki <[email protected]>
      CC: Li Zefan <[email protected]>
      CC: Paul Menage <[email protected]>
      CC: Nick Piggin <[email protected]>
      CC: Andi Kleen <[email protected]>
      Signed-off-by: default avatarWu Fengguang <[email protected]>
      Signed-off-by: default avatarAndi Kleen <[email protected]>
      4fd466eb
    • Wu Fengguang's avatar
      HWPOISON: add page flags filter · 478c5ffc
      Wu Fengguang authored
      When specified, only poison pages if ((page_flags & mask) == value).
      
      -       corrupt-filter-flags-mask
      -       corrupt-filter-flags-value
      
      This allows stress testing of many kinds of pages.
      
      Strictly speaking, the buddy pages requires taking zone lock, to avoid
      setting PG_hwpoison on a "was buddy but now allocated to someone" page.
      However we can just do nothing because we set PG_locked in the beginning,
      this prevents the page allocator from allocating it to someone. (It will
      BUG() on the unexpected PG_locked, which is fine for hwpoison testing.)
      
      [AK: Add select PROC_PAGE_MONITOR to satisfy dependency]
      
      CC: Nick Piggin <[email protected]>
      Signed-off-by: default avatarWu Fengguang <[email protected]>
      Signed-off-by: default avatarAndi Kleen <[email protected]>
      478c5ffc
    • Wu Fengguang's avatar
      HWPOISON: limit hwpoison injector to known page types · 31d3d348
      Wu Fengguang authored
      __memory_failure()'s workflow is
      
      	set PG_hwpoison
      	//...
      	unset PG_hwpoison if didn't pass hwpoison filter
      
      That could kill unrelated process if it happens to page fault on the
      page with the (temporary) PG_hwpoison. The race should be big enough to
      appear in stress tests.
      
      Fix it by grabbing the page and checking filter at inject time.  This
      also avoids the very noisy "Injecting memory failure..." messages.
      
      - we don't touch madvise() based injection, because the filters are
        generally not necessary for it.
      - if we want to apply the filters to h/w aided injection, we'd better to
        rearrange the logic in __memory_failure() instead of this patch.
      
      AK: fix documentation, use drain all, cleanups
      
      CC: Haicheng Li <[email protected]>
      Signed-off-by: default avatarWu Fengguang <[email protected]>
      Signed-off-by: default avatarAndi Kleen <[email protected]>
      31d3d348
    • Wu Fengguang's avatar
      HWPOISON: add fs/device filters · 7c116f2b
      Wu Fengguang authored
      Filesystem data/metadata present the most tricky-to-isolate pages.
      It requires careful code review and stress testing to get them right.
      
      The fs/device filter helps to target the stress tests to some specific
      filesystem pages. The filter condition is block device's major/minor
      numbers:
              - corrupt-filter-dev-major
              - corrupt-filter-dev-minor
      When specified (non -1), only page cache pages that belong to that
      device will be poisoned.
      
      The filters are checked reliably on the locked and refcounted page.
      
      Haicheng: clear PG_hwpoison and drop bad page count if filter not OK
      AK: Add documentation
      
      CC: Haicheng Li <[email protected]>
      CC: Nick Piggin <[email protected]>
      Signed-off-by: default avatarWu Fengguang <[email protected]>
      Signed-off-by: default avatarAndi Kleen <[email protected]>
      7c116f2b
    • Wu Fengguang's avatar
      HWPOISON: Add unpoisoning support · 847ce401
      Wu Fengguang authored
      The unpoisoning interface is useful for stress testing tools to
      reclaim poisoned pages (to prevent OOM)
      
      There is no hardware level unpoisioning, so this
      cannot be used for real memory errors, only for software injected errors.
      
      Note that it may leak pages silently - those who have been removed from
      LRU cache, but not isolated from page cache/swap cache at hwpoison time.
      Especially the stress test of dirty swap cache pages shall reboot system
      before exhausting memory.
      
      AK: Fix comments, add documentation, add printks, rename symbol
      Signed-off-by: default avatarWu Fengguang <[email protected]>
      Signed-off-by: default avatarAndi Kleen <[email protected]>
      847ce401
  17. 16 Sep, 2009 1 commit