14 Dec, 2014

1 commit

  • This is the page owner tracking code which is introduced so far ago. It
    is resident on Andrew's tree, though, nobody tried to upstream so it
    remain as is. Our company uses this feature actively to debug memory leak
    or to find a memory hogger so I decide to upstream this feature.

    This functionality help us to know who allocates the page. When
    allocating a page, we store some information about allocation in extra
    memory. Later, if we need to know status of all pages, we can get and
    analyze it from this stored information.

    In previous version of this feature, extra memory is statically defined in
    struct page, but, in this version, extra memory is allocated outside of
    struct page. It enables us to turn on/off this feature at boottime
    without considerable memory waste.

    Although we already have tracepoint for tracing page allocation/free,
    using it to analyze page owner is rather complex. We need to enlarge the
    trace buffer for preventing overlapping until userspace program launched.
    And, launched program continually dump out the trace buffer for later
    analysis and it would change system behaviour with more possibility rather
    than just keeping it in memory, so bad for debug.

    Moreover, we can use page_owner feature further for various purposes. For
    example, we can use it for fragmentation statistics implemented in this
    patch. And, I also plan to implement some CMA failure debugging feature
    using this interface.

    I'd like to give the credit for all developers contributed this feature,
    but, it's not easy because I don't know exact history. Sorry about that.
    Below is people who has "Signed-off-by" in the patches in Andrew's tree.

    Contributor:
    Alexander Nyberg
    Mel Gorman
    Dave Hansen
    Minchan Kim
    Michal Nazarewicz
    Andrew Morton
    Jungsoo Son

    Signed-off-by: Joonsoo Kim
    Cc: Mel Gorman
    Cc: Johannes Weiner
    Cc: Minchan Kim
    Cc: Dave Hansen
    Cc: Michal Nazarewicz
    Cc: Jungsoo Son
    Cc: Ingo Molnar
    Cc: Joonsoo Kim
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Joonsoo Kim
     

10 Oct, 2014

1 commit

  • Always mark pages with PageBalloon even if balloon compaction is disabled
    and expose this mark in /proc/kpageflags as KPF_BALLOON.

    Also this patch adds three counters into /proc/vmstat: "balloon_inflate",
    "balloon_deflate" and "balloon_migrate". They accumulate balloon
    activity. Current size of balloon is (balloon_inflate - balloon_deflate)
    pages.

    All generic balloon code now gathered under option CONFIG_MEMORY_BALLOON.
    It should be selected by ballooning driver which wants use this feature.
    Currently virtio-balloon is the only user.

    Signed-off-by: Konstantin Khlebnikov
    Cc: Rafael Aquini
    Cc: Andrey Ryabinin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Konstantin Khlebnikov
     

05 Jun, 2014

1 commit

  • Recently added page-cache dumping is known to be a little bit racy.
    But after race with truncate it just dies due to unhandled SIGBUS
    when it tries to poke pages beyond the new end of file.
    This patch adds handler for SIGBUS which skips the rest of the file.

    Signed-off-by: Konstantin Khlebnikov
    Cc: Naoya Horiguchi
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Konstantin Khlebnikov
     

08 Apr, 2014

1 commit

  • After this patch 'page-types' can walk over a file's mappings and
    analyze populated page cache pages mostly without disturbing its state.

    It maps chunk of file, marks VMA as MADV_RANDOM to turn off readahead,
    pokes VMA via mincore() to determine cached pages, triggers page-fault
    only for them, and finally gathers information via pagemap/kpageflags.
    Before unmap it marks VMA as MADV_SEQUENTIAL for ignoring reference
    bits.

    usage: page-types -f

    If is directory it will analyse all files in all subdirectories.

    Symlinks are not followed as well as mount points. Hardlinks aren't
    handled, they'll be dumped as many times as they are found. Recursive
    walk brings all dentries into dcache and populates page cache of
    block-devices aka 'Buffers'.

    Probably it's worth to add ioctl for dumping file page cache as array of
    PFNs as a replacement for this hackish juggling with
    mmap/madvise/mincore/pagemap. Also recursive walk could be replaced
    with dumping cached inodes via some ioctl or debugfs interface followed
    by openning them via open_by_handle_at, this would fix hardlinks
    handling and unneeded population of dcache and buffers. This interface
    might be used as data source for constructing readahead plans and for
    background optimizations of actively used files.

    collateral changes:
    + fix 64-bit LFS: define _FILE_OFFSET_BITS instead of _LARGEFILE64_SOURCE
    + replace lseek + read with single pread
    + make show_page_range() reusable after flush

    usage example:

    ~/src/linux/tools/vm$ sudo ./page-types -L -f page-types
    foffset offset flags
    page-types Inode: 2229277 Size: 89065 (22 pages)
    Modify: Tue Feb 25 12:00:59 2014 (162 seconds ago)
    Access: Tue Feb 25 12:01:00 2014 (161 seconds ago)
    0 3cbf3b __RU_lA____M________________________
    1 38946a __RU_lA____M________________________
    2 1a3cec __RU_lA____M________________________
    3 1a8321 __RU_lA____M________________________
    4 3af7cc __RU_lA____M________________________
    5 1ed532 __RU_lA_____________________________
    6 2e436a __RU_lA_____________________________
    7 29a35e ___U_lA_____________________________
    8 2de86e ___U_lA_____________________________
    9 3bdfb4 ___U_lA_____________________________
    10 3cd8a3 ___U_lA_____________________________
    11 2afa50 ___U_lA_____________________________
    12 2534c2 ___U_lA_____________________________
    13 1b7a40 ___U_lA_____________________________
    14 17b0be ___U_lA_____________________________
    15 392b0c ___U_lA_____________________________
    16 3ba46a __RU_lA_____________________________
    17 397dc8 ___U_lA_____________________________
    18 1f2a36 ___U_lA_____________________________
    19 21fd30 __RU_lA_____________________________
    20 2c35ba __RU_l______________________________
    21 20f181 __RU_l______________________________

    flags page-count MB symbolic-flags long-symbolic-flags
    0x000000000000002c 2 0 __RU_l______________________________ referenced,uptodate,lru
    0x0000000000000068 11 0 ___U_lA_____________________________ uptodate,lru,active
    0x000000000000006c 4 0 __RU_lA_____________________________ referenced,uptodate,lru,active
    0x000000000000086c 5 0 __RU_lA____M________________________ referenced,uptodate,lru,active,mmap
    total 22 0

    ~/src/linux/tools/vm$ sudo ./page-types -f /
    flags page-count MB symbolic-flags long-symbolic-flags
    0x0000000000000028 21761 85 ___U_l______________________________ uptodate,lru
    0x000000000000002c 127279 497 __RU_l______________________________ referenced,uptodate,lru
    0x0000000000000068 74160 289 ___U_lA_____________________________ uptodate,lru,active
    0x000000000000006c 84469 329 __RU_lA_____________________________ referenced,uptodate,lru,active
    0x000000000000007c 1 0 __RUDlA_____________________________ referenced,uptodate,dirty,lru,active
    0x0000000000000228 370 1 ___U_l___I__________________________ uptodate,lru,reclaim
    0x0000000000000828 49 0 ___U_l_____M________________________ uptodate,lru,mmap
    0x000000000000082c 126 0 __RU_l_____M________________________ referenced,uptodate,lru,mmap
    0x0000000000000868 137 0 ___U_lA____M________________________ uptodate,lru,active,mmap
    0x000000000000086c 12890 50 __RU_lA____M________________________ referenced,uptodate,lru,active,mmap
    total 321242 1254

    Signed-off-by: Konstantin Khlebnikov
    Cc: Arnaldo Carvalho de Melo
    Cc: Fengguang Wu
    Cc: Borislav Petkov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Konstantin Khlebnikov
     

17 Dec, 2013

1 commit

  • Move debugfs.* to api/fs/. We have a common tools/lib/api/ place where
    the Makefile lives and then we place the headers in subdirs.

    For example, all the fs-related stuff goes to tools/lib/api/fs/ from
    which we get libapikfs.a (acme got almost the naming he wanted :-)) and
    we link it into the tools which need it - in this case perf and
    tools/vm/page-types.

    acme:

    "Looking at the implementation, I think some tools can even link
    directly to the .o files, avoiding the .a file altogether.

    But that is just an optimization/finer granularity tools/lib/
    cherrypicking that toolers can make use of."

    Fixup documentation cleaning target while at it.

    Signed-off-by: Borislav Petkov
    Acked-by: Ingo Molnar
    Cc: Adrian Hunter
    Cc: Andi Kleen
    Cc: Arjan van de Ven
    Cc: David Ahern
    Cc: Frederic Weisbecker
    Cc: Ingo Molnar
    Cc: Jiri Olsa
    Cc: Mike Galbraith
    Cc: Namhyung Kim
    Cc: Paul Mackerras
    Cc: Pekka Enberg
    Cc: Peter Zijlstra
    Cc: Robert Richter
    Cc: Stanislav Fomichev
    Cc: Stephane Eranian
    Cc: Steven Rostedt
    Link: http://lkml.kernel.org/r/1386605664-24041-2-git-send-email-bp@alien8.de
    Signed-off-by: Arnaldo Carvalho de Melo

    Borislav Petkov
     

13 Nov, 2013

1 commit

  • Soft dirty bit allows us to track which pages are written since the last
    clear_ref (by "echo 4 > /proc/pid/clear_refs".) This is useful for
    userspace applications to know their memory footprints.

    Note that the kernel exposes this flag via bit[55] of /proc/pid/pagemap,
    and the semantics is not a default one (scheduled to be the default in the
    near future.) However, it shifts to the new semantics at the first
    clear_ref, and the users of soft dirty bit always do it before utilizing
    the bit, so that's not a big deal. Users must avoid relying on the bit in
    page-types before the first clear_ref.

    Signed-off-by: Naoya Horiguchi
    Cc: Wu Fengguang
    Cc: Pavel Emelyanov
    Cc: Cyrill Gorcunov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Naoya Horiguchi
     

16 Mar, 2013

1 commit

  • page-flags.c had some older version of debugfs_mount copied from perf so
    convert it to using the version in the tools library.

    Signed-off-by: Borislav Petkov
    Cc: Ingo Molnar
    Cc: Steven Rostedt
    Cc: Wu Fengguang
    Link: http://lkml.kernel.org/r/1361374353-30385-8-git-send-email-bp@alien8.de
    Signed-off-by: Arnaldo Carvalho de Melo

    Borislav Petkov
     

05 Feb, 2013

1 commit


26 Oct, 2012

1 commit

  • Fix tools/vm/page-types.c to use the UAPI variant of linux/kernel-page-flags.h
    lest the following error appear:

    In file included from page-types.c:38:0:
    ../../include/linux/kernel-page-flags.h:4:42: fatal error:
    uapi/linux/kernel-page-flags.h: No such file or directory

    Reported-by: Daniel Hazelton
    Signed-off-by: David Howells
    Reviewed-by: Fengguang Wu
    Tested-by: Daniel Hazelton
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Howells
     

13 Oct, 2012

1 commit


03 Jul, 2012

1 commit


30 May, 2012

2 commits

  • Compiling page-type.c with a recent compiler produces many warnings,
    mostly related to signed/unsigned comparisons. This patch cleans up most
    of them.

    One remaining warning is about an unused parameter. The file
    doesn't define a __unused macro (or the like) yet. This can be addressed
    later.

    Signed-off-by: Ulrich Drepper
    Acked-by: KOSAKI Motohiro
    Acked-by: Fengguang Wu
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ulrich Drepper
     
  • Programs using /proc/kpageflags need to know about the various flags. The
    provides them and the comments in the file
    indicate that it is supposed to be used by user-level code. But the file
    is not installed.

    Install the headers and mark the unstable flags as out-of-bounds. The
    page-type tool is also adjusted to not duplicate the definitions

    Signed-off-by: Ulrich Drepper
    Acked-by: KOSAKI Motohiro
    Acked-by: Fengguang Wu
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ulrich Drepper
     

29 Mar, 2012

2 commits

  • We have tools/vm/ folder for vm tools, so move slabinfo.c from tools/slub/
    to tools/vm/

    Signed-off-by: Dave Young
    Cc: Wu Fengguang
    Acked-by: Christoph Lameter
    Cc: Pekka Enberg
    Cc: Frederic Weisbecker
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Dave Young
     
  • tools/ is the better place for vm tools which are used by many people.
    Moving them to tools also make them open to more users instead of hide in
    Documentation folder.

    This patch moves page-types.c to tools/vm/page-types.c. Also add a
    Makefile in tools/vm and fix two coding style problems: a) change const
    arrary to 'const char * const', b) change a space to tab for indent.

    Signed-off-by: Dave Young
    Acked-by: Wu Fengguang
    Cc: Christoph Lameter
    Cc: Pekka Enberg
    Cc: Frederic Weisbecker
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Dave Young