Re: [PATCH v2] mm: show proportional swap share of the mapping
From: Andrew Morton <akpm@linux-foundation.org>
Date: 2015-07-14 21:07:11
Also in:
lkml
On Mon, 15 Jun 2015 22:06:54 +0900 Minchan Kim [off-list ref] wrote:
We want to know per-process workingset size for smart memory management
on userland and we use swap(ex, zram) heavily to maximize memory efficiency
so workingset includes swap as well as RSS.
On such system, if there are lots of shared anonymous pages, it's
really hard to figure out exactly how many each process consumes
memory(ie, rss + wap) if the system has lots of shared anonymous
memory(e.g, android).
This patch introduces SwapPss field on /proc/<pid>/smaps so we can get
more exact workingset size per process.
...
+int swp_swapcount(swp_entry_t entry)
+{
+ int count, tmp_count, n;
+ struct swap_info_struct *p;
+ struct page *page;
+ pgoff_t offset;
+ unsigned char *map;
+
+ p = swap_info_get(entry);
+ if (!p)
+ return 0;
+
+ count = swap_count(p->swap_map[swp_offset(entry)]);
+ if (!(count & COUNT_CONTINUED))
+ goto out;
+
+ count &= ~COUNT_CONTINUED;
+ n = SWAP_MAP_MAX + 1;
+
+ offset = swp_offset(entry);
+ page = vmalloc_to_page(p->swap_map + offset);
+ offset &= ~PAGE_MASK;
+ VM_BUG_ON(page_private(page) != SWP_CONTINUED);
+
+ do {
+ page = list_entry(page->lru.next, struct page, lru);
+ map = kmap_atomic(page) + offset;
+ tmp_count = *map;
+ kunmap_atomic(map);A little thing: I've never liked the way that kunmap_atomic() accepts any address within the page. It's weird, and it makes the reviewer have to scramble around to make sure the offset can never be >= PAGE_SIZE. We can easily avoid doing it here:
--- a/mm/swapfile.c~mm-show-proportional-swap-share-of-the-mapping-fix
+++ a/mm/swapfile.c@@ -904,8 +904,8 @@ int swp_swapcount(swp_entry_t entry) do { page = list_entry(page->lru.next, struct page, lru); - map = kmap_atomic(page) + offset; - tmp_count = *map; + map = kmap_atomic(page); + tmp_count = map[offset]; kunmap_atomic(map); count += (tmp_count & ~COUNT_CONTINUED) * n;
+ count += (tmp_count & ~COUNT_CONTINUED) * n; + n *= (SWAP_CONT_MAX + 1); + } while (tmp_count & COUNT_CONTINUED); +out: + spin_unlock(&p->lock); + return count; +} ...
-- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>