)]}'
{
  "log": [
    {
      "commit": "ef6942224a185c9e434f6cfe69fe434e732f5b38",
      "tree": "e26664dbfd6077129d75f555757d36b5fbec43c2",
      "parents": [
        "cc9a6c8776615f9c194ccf0b63a0aa5628235545"
      ],
      "author": {
        "name": "Bob Liu",
        "email": "lliubbo@gmail.com",
        "time": "Wed Mar 21 16:34:11 2012 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Mar 21 17:54:59 2012 -0700"
      },
      "message": "ksm: cleanup: introduce find_mergeable_vma()\n\nThere are multiple places which perform the same check.  Add a new\nfind_mergeable_vma() to handle this.\n\nSigned-off-by: Bob Liu \u003clliubbo@gmail.com\u003e\nAcked-by: Hugh Dickins \u003chughd@google.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "9b04c5fec43c0da610a2c37f70c5b013101a6ad7",
      "tree": "f04767281b7067fba91cf0d37440bf454c492e38",
      "parents": [
        "c3eede8e0a1292d95c051cf947738687b9c42322"
      ],
      "author": {
        "name": "Cong Wang",
        "email": "amwang@redhat.com",
        "time": "Fri Nov 25 23:14:39 2011 +0800"
      },
      "committer": {
        "name": "Cong Wang",
        "email": "xiyou.wangcong@gmail.com",
        "time": "Tue Mar 20 21:48:27 2012 +0800"
      },
      "message": "mm: remove the second argument of k[un]map_atomic()\n\nSigned-off-by: Cong Wang \u003camwang@redhat.com\u003e\n"
    },
    {
      "commit": "7512102cf64d36e3c7444480273623c7aab3563f",
      "tree": "4c5b589455ed0d343384d7eeaedfab5057648a0d",
      "parents": [
        "9f78ff005a6b6313728247113948450b2adddde8"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hughd@google.com",
        "time": "Mon Mar 05 14:59:18 2012 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Mon Mar 05 15:49:43 2012 -0800"
      },
      "message": "memcg: fix GPF when cgroup removal races with last exit\n\nWhen moving tasks from old memcg (with move_charge_at_immigrate on new\nmemcg), followed by removal of old memcg, hit General Protection Fault in\nmem_cgroup_lru_del_list() (called from release_pages called from\nfree_pages_and_swap_cache from tlb_flush_mmu from tlb_finish_mmu from\nexit_mmap from mmput from exit_mm from do_exit).\n\nSomewhat reproducible, takes a few hours: the old struct mem_cgroup has\nbeen freed and poisoned by SLAB_DEBUG, but mem_cgroup_lru_del_list() is\nstill trying to update its stats, and take page off lru before freeing.\n\nA task, or a charge, or a page on lru: each secures a memcg against\nremoval.  In this case, the last task has been moved out of the old memcg,\nand it is exiting: anonymous pages are uncharged one by one from the\nmemcg, as they are zapped from its pagetables, so the charge gets down to\n0; but the pages themselves are queued in an mmu_gather for freeing.\n\nMost of those pages will be on lru (and force_empty is careful to\nlru_add_drain_all, to add pages from pagevec to lru first), but not\nnecessarily all: perhaps some have been isolated for page reclaim, perhaps\nsome isolated for other reasons.  So, force_empty may find no task, no\ncharge and no page on lru, and let the removal proceed.\n\nThere would still be no problem if these pages were immediately freed; but\ntypically (and the put_page_testzero protocol demands it) they have to be\nadded back to lru before they are found freeable, then removed from lru\nand freed.  We don\u0027t see the issue when adding, because the\nmem_cgroup_iter() loops keep their own reference to the memcg being\nscanned; but when it comes to mem_cgroup_lru_del_list().\n\nI believe this was not an issue in v3.2: there, PageCgroupAcctLRU and\nPageCgroupUsed flags were used (like a trick with mirrors) to deflect view\nof pc-\u003emem_cgroup to the stable root_mem_cgroup when neither set.\n38c5d72f3ebe (\"memcg: simplify LRU handling by new rule\") mercifully\nremoved those convolutions, but left this General Protection Fault.\n\nBut it\u0027s surprisingly easy to restore the old behaviour: just check\nPageCgroupUsed in mem_cgroup_lru_add_list() (which decides on which lruvec\nto add), and reset pc to root_mem_cgroup if page is uncharged.  A risky\nchange?  just going back to how it worked before; testing, and an audit of\nuses of pc-\u003emem_cgroup, show no problem.\n\nAnd there\u0027s a nice bonus: with mem_cgroup_lru_add_list() itself making\nsure that an uncharged page goes to root lru, mem_cgroup_reset_owner() no\nlonger has any purpose, and we can safely revert 4e5f01c2b9b9 (\"memcg:\nclear pc-\u003emem_cgroup if necessary\").\n\nCalling update_page_reclaim_stat() after add_page_to_lru_list() in swap.c\nis not strictly necessary: the lru_lock there, with RCU before memcg\nstructures are freed, makes mem_cgroup_get_reclaim_stat_from_page safe\nwithout that; but it seems cleaner to rely on one dependency less.\n\nSigned-off-by: Hugh Dickins \u003chughd@google.com\u003e\nCc: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nCc: Johannes Weiner \u003channes@cmpxchg.org\u003e\nCc: Konstantin Khlebnikov \u003ckhlebnikov@openvz.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "4e5f01c2b9b94321992acb09c35d34f5ee5bb274",
      "tree": "4e6ac9d29539dc26468fe2630d0e64cd022b1155",
      "parents": [
        "36b62ad539498d00c2d280a151abad5f7630fa73"
      ],
      "author": {
        "name": "KAMEZAWA Hiroyuki",
        "email": "kamezawa.hiroyu@jp.fujitsu.com",
        "time": "Thu Jan 12 17:18:58 2012 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Jan 12 20:13:07 2012 -0800"
      },
      "message": "memcg: clear pc-\u003emem_cgroup if necessary.\n\nThis is a preparation before removing a flag PCG_ACCT_LRU in page_cgroup\nand reducing atomic ops/complexity in memcg LRU handling.\n\nIn some cases, pages are added to lru before charge to memcg and pages\nare not classfied to memory cgroup at lru addtion.  Now, the lru where\nthe page should be added is determined a bit in page_cgroup-\u003eflags and\npc-\u003emem_cgroup.  I\u0027d like to remove the check of flag.\n\nTo handle the case pc-\u003emem_cgroup may contain stale pointers if pages\nare added to LRU before classification.  This patch resets\npc-\u003emem_cgroup to root_mem_cgroup before lru additions.\n\n[akpm@linux-foundation.org: fix CONFIG_CGROUP_MEM_CONT\u003dn build]\n[hughd@google.com: fix CONFIG_CGROUP_MEM_RES_CTLR\u003dy CONFIG_CGROUP_MEM_RES_CTLR_SWAP\u003dn build]\n[akpm@linux-foundation.org: ksm.c needs memcontrol.h, per Michal]\n[hughd@google.com: stop oops in mem_cgroup_reset_owner()]\n[hughd@google.com: fix page migration to reset_owner]\nSigned-off-by: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nCc: Miklos Szeredi \u003cmszeredi@suse.cz\u003e\nAcked-by: Michal Hocko \u003cmhocko@suse.cz\u003e\nCc: Johannes Weiner \u003channes@cmpxchg.org\u003e\nCc: Ying Han \u003cyinghan@google.com\u003e\nSigned-off-by: Hugh Dickins \u003chughd@google.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "43362a4977e37db46f86f7e6ab935f0006956632",
      "tree": "5ab7070237ebd3f40d7fcfc0066586422da8310a",
      "parents": [
        "c9f01245b6a7d77d17deaa71af10f6aca14fa24e"
      ],
      "author": {
        "name": "David Rientjes",
        "email": "rientjes@google.com",
        "time": "Mon Oct 31 17:07:18 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Mon Oct 31 17:30:45 2011 -0700"
      },
      "message": "oom: fix race while temporarily setting current\u0027s oom_score_adj\n\ntest_set_oom_score_adj() was introduced in 72788c385604 (\"oom: replace\nPF_OOM_ORIGIN with toggling oom_score_adj\") to temporarily elevate\ncurrent\u0027s oom_score_adj for ksm and swapoff without requiring an\nadditional per-process flag.\n\nUsing that function to both set oom_score_adj to OOM_SCORE_ADJ_MAX and\nthen reinstate the previous value is racy since it\u0027s possible that\nuserspace can set the value to something else itself before the old value\nis reinstated.  That results in userspace setting current\u0027s oom_score_adj\nto a different value and then the kernel immediately setting it back to\nits previous value without notification.\n\nTo fix this, a new compare_swap_oom_score_adj() function is introduced\nwith the same semantics as the compare and swap CAS instruction, or\nCMPXCHG on x86.  It is used to reinstate the previous value of\noom_score_adj if and only if the present value is the same as the old\nvalue.\n\nSigned-off-by: David Rientjes \u003crientjes@google.com\u003e\nCc: Oleg Nesterov \u003coleg@redhat.com\u003e\nCc: Ying Han \u003cyinghan@google.com\u003e\nCc: KOSAKI Motohiro \u003ckosaki.motohiro@jp.fujitsu.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "2b472611a32a72f4a118c069c2d62a1a3f087afd",
      "tree": "166ec2dea398e7760c30077fb329cf7f2ab08c2b",
      "parents": [
        "c7cbb02222eccb82bfd42696b01abceddae663f2"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hughd@google.com",
        "time": "Wed Jun 15 15:08:58 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Jun 15 20:04:02 2011 -0700"
      },
      "message": "ksm: fix NULL pointer dereference in scan_get_next_rmap_item()\n\nAndrea Righi reported a case where an exiting task can race against\nksmd::scan_get_next_rmap_item (http://lkml.org/lkml/2011/6/1/742) easily\ntriggering a NULL pointer dereference in ksmd.\n\nksm_scan.mm_slot \u003d\u003d \u0026ksm_mm_head with only one registered mm\n\nCPU 1 (__ksm_exit)\t\tCPU 2 (scan_get_next_rmap_item)\n \t\t\t\tlist_empty() is false\nlock\t\t\t\tslot \u003d\u003d \u0026ksm_mm_head\nlist_del(slot-\u003emm_list)\n(list now empty)\nunlock\n\t\t\t\tlock\n\t\t\t\tslot \u003d list_entry(slot-\u003emm_list.next)\n\t\t\t\t(list is empty, so slot is still ksm_mm_head)\n\t\t\t\tunlock\n\t\t\t\tslot-\u003emm \u003d\u003d NULL ... Oops\n\nClose this race by revalidating that the new slot is not simply the list\nhead again.\n\nAndrea\u0027s test case:\n\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n#include \u003cunistd.h\u003e\n#include \u003csys/mman.h\u003e\n\n#define BUFSIZE getpagesize()\n\nint main(int argc, char **argv)\n{\n\tvoid *ptr;\n\n\tif (posix_memalign(\u0026ptr, getpagesize(), BUFSIZE) \u003c 0) {\n\t\tperror(\"posix_memalign\");\n\t\texit(1);\n\t}\n\tif (madvise(ptr, BUFSIZE, MADV_MERGEABLE) \u003c 0) {\n\t\tperror(\"madvise\");\n\t\texit(1);\n\t}\n\t*(char *)NULL \u003d 0;\n\n\treturn 0;\n}\n\nReported-by: Andrea Righi \u003candrea@betterlinux.com\u003e\nTested-by: Andrea Righi \u003candrea@betterlinux.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Hugh Dickins \u003chughd@google.com\u003e\nSigned-off-by: Chris Wright \u003cchrisw@sous-sol.org\u003e\nCc: \u003cstable@kernel.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "72788c385604523422592249c19cba0187021e9b",
      "tree": "3552a4b6ae4adb77e723d8a8d1d2669bfb04a8bb",
      "parents": [
        "c6a140bf164829769499b5e50d380893da39b29e"
      ],
      "author": {
        "name": "David Rientjes",
        "email": "rientjes@google.com",
        "time": "Tue May 24 17:11:40 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed May 25 08:39:10 2011 -0700"
      },
      "message": "oom: replace PF_OOM_ORIGIN with toggling oom_score_adj\n\nThere\u0027s a kernel-wide shortage of per-process flags, so it\u0027s always\nhelpful to trim one when possible without incurring a significant penalty.\n It\u0027s even more important when you\u0027re planning on adding a per- process\nflag yourself, which I plan to do shortly for transparent hugepages.\n\nPF_OOM_ORIGIN is used by ksm and swapoff to prefer current since it has a\ntendency to allocate large amounts of memory and should be preferred for\nkilling over other tasks.  We\u0027d rather immediately kill the task making\nthe errant syscall rather than penalizing an innocent task.\n\nThis patch removes PF_OOM_ORIGIN since its behavior is equivalent to\nsetting the process\u0027s oom_score_adj to OOM_SCORE_ADJ_MAX.\n\nThe process\u0027s old oom_score_adj is stored and then set to\nOOM_SCORE_ADJ_MAX during the time it used to have PF_OOM_ORIGIN.  The old\nvalue is then reinstated when the process should no longer be considered a\nhigh priority for oom killing.\n\nSigned-off-by: David Rientjes \u003crientjes@google.com\u003e\nReviewed-by: KOSAKI Motohiro \u003ckosaki.motohiro@jp.fujitsu.com\u003e\nReviewed-by: Minchan Kim \u003cminchan.kim@gmail.com\u003e\nCc: Hugh Dickins \u003chughd@google.com\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "25985edcedea6396277003854657b5f3cb31a628",
      "tree": "f026e810210a2ee7290caeb737c23cb6472b7c38",
      "parents": [
        "6aba74f2791287ec407e0f92487a725a25908067"
      ],
      "author": {
        "name": "Lucas De Marchi",
        "email": "lucas.demarchi@profusion.mobi",
        "time": "Wed Mar 30 22:57:33 2011 -0300"
      },
      "committer": {
        "name": "Lucas De Marchi",
        "email": "lucas.demarchi@profusion.mobi",
        "time": "Thu Mar 31 11:26:23 2011 -0300"
      },
      "message": "Fix common misspellings\n\nFixes generated by \u0027codespell\u0027 and manually reviewed.\n\nSigned-off-by: Lucas De Marchi \u003clucas.demarchi@profusion.mobi\u003e\n"
    },
    {
      "commit": "9e60109f125013b6c571f399a15a8b0fe1ffa4e6",
      "tree": "52d34958e82e5649b737e21e453516a3ecd365d3",
      "parents": [
        "7bc32f6f90dae67730645da67bfd44304f810f93"
      ],
      "author": {
        "name": "Peter Zijlstra",
        "email": "a.p.zijlstra@chello.nl",
        "time": "Tue Mar 22 16:32:46 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Mar 22 17:44:03 2011 -0700"
      },
      "message": "mm: rename drop_anon_vma() to put_anon_vma()\n\nThe normal code pattern used in the kernel is: get/put.\n\nSigned-off-by: Peter Zijlstra \u003ca.p.zijlstra@chello.nl\u003e\nReviewed-by: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nAcked-by: Hugh Dickins \u003chughd@google.com\u003e\nReviewed-by: Rik van Riel \u003criel@redhat.com\u003e\nAcked-by: Mel Gorman \u003cmel@csn.ul.ie\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "2919bfd0758257c469abef8c26c3e516bbebb851",
      "tree": "093244c121dcbb91423f119cea9abc50e11ad078",
      "parents": [
        "73ae31e5986a4c0ee84bfd13ccd9b57a98956f6f"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hughd@google.com",
        "time": "Thu Jan 13 15:47:29 2011 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Jan 13 17:32:49 2011 -0800"
      },
      "message": "ksm: drain pagevecs to lru\n\nIt was hard to explain the page counts which were causing new LTP tests\nof KSM to fail: we need to drain the per-cpu pagevecs to LRU occasionally.\n\nSigned-off-by: Hugh Dickins \u003chughd@google.com\u003e\nReported-by: CAI Qian \u003ccaiqian@redhat.com\u003e\nCc:Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "22e5c47ee238abe636655c3862ed28d6eb084ad4",
      "tree": "4a4e7d330cbef6c99a8914de482eb0e8daba2485",
      "parents": [
        "29ad768cfc08611a4c1070d0f13f82eeea2bac7b"
      ],
      "author": {
        "name": "Andrea Arcangeli",
        "email": "aarcange@redhat.com",
        "time": "Thu Jan 13 15:47:20 2011 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Jan 13 17:32:48 2011 -0800"
      },
      "message": "thp: add compound_trans_head() helper\n\nCleanup some code with common compound_trans_head helper.\n\nSigned-off-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Hugh Dickins \u003chughd@google.com\u003e\nCc: Johannes Weiner \u003cjweiner@redhat.com\u003e\nCc: Marcelo Tosatti \u003cmtosatti@redhat.com\u003e\nCc: Avi Kivity \u003cavi@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "29ad768cfc08611a4c1070d0f13f82eeea2bac7b",
      "tree": "a1cc7326d3a12bed79071559e2d4e8d43fb14814",
      "parents": [
        "60ab3244ec85c44276c585a2a20d3750402e1cf4"
      ],
      "author": {
        "name": "Andrea Arcangeli",
        "email": "aarcange@redhat.com",
        "time": "Thu Jan 13 15:47:19 2011 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Jan 13 17:32:48 2011 -0800"
      },
      "message": "thp: KSM on THP\n\nThis makes KSM full operational with THP pages.  Subpages are scanned\nwhile the hugepage is still in place and delivering max cpu performance,\nand only if there\u0027s a match and we\u0027re going to deduplicate memory, the\nsingle hugepages with the subpage match is split.\n\nThere will be no false sharing between ksmd and khugepaged.  khugepaged\nwon\u0027t collapse 2m virtual regions with KSM pages inside.  ksmd also should\nonly split pages when the checksum matches and we\u0027re likely to split an\nhugepage for some long living ksm page (usual ksm heuristic to avoid\nsharing pages that get de-cowed).\n\nSigned-off-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Hugh Dickins \u003chughd@google.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "878aee7d6b5504e01b9caffce080e792b6b8d090",
      "tree": "c4a01a78885c25b6b3b1e0c74af7cb83c98a07c5",
      "parents": [
        "8ee53820edfd1f3b6554c593f337148dd3d7fc91"
      ],
      "author": {
        "name": "Andrea Arcangeli",
        "email": "aarcange@redhat.com",
        "time": "Thu Jan 13 15:47:10 2011 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Jan 13 17:32:46 2011 -0800"
      },
      "message": "thp: freeze khugepaged and ksmd\n\nIt\u0027s unclear why schedule friendly kernel threads can\u0027t be taken away by\nthe CPU through the scheduler itself.  It\u0027s safer to stop them as they can\ntrigger memory allocation, if kswapd also freezes itself to avoid\ngenerating I/O they have too.\n\nSigned-off-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "21ae5b01750f14140809508a478a4413792e0261",
      "tree": "49fff503cf2e17e0f8e583e83e43b337f9728c23",
      "parents": [
        "b15d00b6af617251cc70a908df983e9aff57e169"
      ],
      "author": {
        "name": "Andrea Arcangeli",
        "email": "aarcange@redhat.com",
        "time": "Thu Jan 13 15:47:00 2011 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Jan 13 17:32:43 2011 -0800"
      },
      "message": "thp: skip transhuge pages in ksm for now\n\nSkip transhuge pages in ksm for now.\n\nSigned-off-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nReviewed-by: Rik van Riel \u003criel@redhat.com\u003e\nAcked-by: Mel Gorman \u003cmel@csn.ul.ie\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "ae52a2adb5afa5ac5ec5fb5c7b24777f84b6c926",
      "tree": "fb02d8fb1699c85cc278e2333ce25916835bf341",
      "parents": [
        "240c879f20a605346705be24253bc9fc6fa8a106"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hughd@google.com",
        "time": "Thu Jan 13 15:46:28 2011 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Jan 13 17:32:38 2011 -0800"
      },
      "message": "thp: ksm: free swap when swapcache page is replaced\n\nWhen a swapcache page is replaced by a ksm page, it\u0027s best to free that\nswap immediately.\n\nReported-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Hugh Dickins \u003chughd@google.com\u003e\nSigned-off-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "a0b0f58cdd32ab363a600a294ddaa90f0c32de8c",
      "tree": "4396d766ab2c5e5d69de216e1cc1ac86d7351791",
      "parents": [
        "20d6c96b5f1cad5c5da4641945ec17a1d9a1afc8"
      ],
      "author": {
        "name": "KOSAKI Motohiro",
        "email": "kosaki.motohiro@jp.fujitsu.com",
        "time": "Thu Dec 02 14:31:20 2010 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Dec 02 14:51:15 2010 -0800"
      },
      "message": "ksm: annotate ksm_thread_mutex is no deadlock source\n\ncommit 62b61f611e (\"ksm: memory hotremove migration only\") caused the\nfollowing new lockdep warning.\n\n  \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n  [ INFO: possible circular locking dependency detected ]\n  -------------------------------------------------------\n  bash/1621 is trying to acquire lock:\n   ((memory_chain).rwsem){.+.+.+}, at: [\u003cffffffff81079339\u003e]\n  __blocking_notifier_call_chain+0x69/0xc0\n\n  but task is already holding lock:\n   (ksm_thread_mutex){+.+.+.}, at: [\u003cffffffff8113a3aa\u003e]\n  ksm_memory_callback+0x3a/0xc0\n\n  which lock already depends on the new lock.\n\n  the existing dependency chain (in reverse order) is:\n\n  -\u003e #1 (ksm_thread_mutex){+.+.+.}:\n       [\u003cffffffff8108b70a\u003e] lock_acquire+0xaa/0x140\n       [\u003cffffffff81505d74\u003e] __mutex_lock_common+0x44/0x3f0\n       [\u003cffffffff81506228\u003e] mutex_lock_nested+0x48/0x60\n       [\u003cffffffff8113a3aa\u003e] ksm_memory_callback+0x3a/0xc0\n       [\u003cffffffff8150c21c\u003e] notifier_call_chain+0x8c/0xe0\n       [\u003cffffffff8107934e\u003e] __blocking_notifier_call_chain+0x7e/0xc0\n       [\u003cffffffff810793a6\u003e] blocking_notifier_call_chain+0x16/0x20\n       [\u003cffffffff813afbfb\u003e] memory_notify+0x1b/0x20\n       [\u003cffffffff81141b7c\u003e] remove_memory+0x1cc/0x5f0\n       [\u003cffffffff813af53d\u003e] memory_block_change_state+0xfd/0x1a0\n       [\u003cffffffff813afd62\u003e] store_mem_state+0xe2/0xf0\n       [\u003cffffffff813a0bb0\u003e] sysdev_store+0x20/0x30\n       [\u003cffffffff811bc116\u003e] sysfs_write_file+0xe6/0x170\n       [\u003cffffffff8114f398\u003e] vfs_write+0xc8/0x190\n       [\u003cffffffff8114fc14\u003e] sys_write+0x54/0x90\n       [\u003cffffffff810028b2\u003e] system_call_fastpath+0x16/0x1b\n\n  -\u003e #0 ((memory_chain).rwsem){.+.+.+}:\n       [\u003cffffffff8108b5ba\u003e] __lock_acquire+0x155a/0x1600\n       [\u003cffffffff8108b70a\u003e] lock_acquire+0xaa/0x140\n       [\u003cffffffff81506601\u003e] down_read+0x51/0xa0\n       [\u003cffffffff81079339\u003e] __blocking_notifier_call_chain+0x69/0xc0\n       [\u003cffffffff810793a6\u003e] blocking_notifier_call_chain+0x16/0x20\n       [\u003cffffffff813afbfb\u003e] memory_notify+0x1b/0x20\n       [\u003cffffffff81141f1e\u003e] remove_memory+0x56e/0x5f0\n       [\u003cffffffff813af53d\u003e] memory_block_change_state+0xfd/0x1a0\n       [\u003cffffffff813afd62\u003e] store_mem_state+0xe2/0xf0\n       [\u003cffffffff813a0bb0\u003e] sysdev_store+0x20/0x30\n       [\u003cffffffff811bc116\u003e] sysfs_write_file+0xe6/0x170\n       [\u003cffffffff8114f398\u003e] vfs_write+0xc8/0x190\n       [\u003cffffffff8114fc14\u003e] sys_write+0x54/0x90\n       [\u003cffffffff810028b2\u003e] system_call_fastpath+0x16/0x1b\n\nBut it\u0027s a false positive.  Both memory_chain.rwsem and ksm_thread_mutex\nhave an outer lock (mem_hotplug_mutex).  So they cannot deadlock.\n\nThus, This patch annotate ksm_thread_mutex is not deadlock source.\n\n[akpm@linux-foundation.org: update comment, from Hugh]\nSigned-off-by: KOSAKI Motohiro \u003ckosaki.motohiro@jp.fujitsu.com\u003e\nAcked-by: Hugh Dickins \u003chughd@google.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Andi Kleen \u003candi@firstfloor.org\u003e\nCc: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "4e31635c367a9e21a43cfbfae4c9deda2e19d1f4",
      "tree": "67e27c7560fbf222958e5d9206f39c3b400be98e",
      "parents": [
        "4829b906cc063cb7cd1b7f34fa05de6db75ec8bb"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hughd@google.com",
        "time": "Sat Oct 02 17:49:08 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Mon Oct 04 11:09:53 2010 -0700"
      },
      "message": "ksm: fix bad user data when swapping\n\nBuilding under memory pressure, with KSM on 2.6.36-rc5, collapsed with\nan internal compiler error: typically indicating an error in swapping.\n\nPerhaps there\u0027s a timing issue which makes it now more likely, perhaps\nit\u0027s just a long time since I tried for so long: this bug goes back to\nKSM swapping in 2.6.33.\n\nNotice how reuse_swap_page() allows an exclusive page to be reused, but\nonly does SetPageDirty if it can delete it from swap cache right then -\nif it\u0027s currently under Writeback, it has to be left in cache and we\ndon\u0027t SetPageDirty, but the page can be reused.  Fine, the dirty bit\nwill get set in the pte; but notice how zap_pte_range() does not bother\nto transfer pte_dirty to page_dirty when unmapping a PageAnon.\n\nIf KSM chooses to share such a page, it will look like a clean copy of\nswapcache, and not be written out to swap when its memory is needed;\nthen stale data read back from swap when it\u0027s needed again.\n\nWe could fix this in reuse_swap_page() (or even refuse to reuse a\npage under writeback), but it\u0027s more honest to fix my oversight in\nKSM\u0027s write_protect_page().  Several days of testing on three machines\nconfirms that this fixes the issue they showed.\n\nSigned-off-by: Hugh Dickins \u003chughd@google.com\u003e\nCc: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: stable@kernel.org\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "4969c1192d15afa3389e7ae3302096ff684ba655",
      "tree": "abe560c8f293191be65488c49f4db3f3a626e63c",
      "parents": [
        "7c5367f205f7d53659fb19b9fdf65b7bc1a592c6"
      ],
      "author": {
        "name": "Andrea Arcangeli",
        "email": "aarcange@redhat.com",
        "time": "Thu Sep 09 16:37:52 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Sep 09 18:57:24 2010 -0700"
      },
      "message": "mm: fix swapin race condition\n\nThe pte_same check is reliable only if the swap entry remains pinned (by\nthe page lock on swapcache).  We\u0027ve also to ensure the swapcache isn\u0027t\nremoved before we take the lock as try_to_free_swap won\u0027t care about the\npage pin.\n\nOne of the possible impacts of this patch is that a KSM-shared page can\npoint to the anon_vma of another process, which could exit before the page\nis freed.\n\nThis can leave a page with a pointer to a recycled anon_vma object, or\nworse, a pointer to something that is no longer an anon_vma.\n\n[riel@redhat.com: changelog help]\nSigned-off-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nAcked-by: Hugh Dickins \u003chughd@google.com\u003e\nReviewed-by: Rik van Riel \u003criel@redhat.com\u003e\nCc: \u003cstable@kernel.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "d9f8984c2c23b91e202a764fe4b15041a29a201a",
      "tree": "d211f4ee42c5c0859f30d26296d053aac8df3657",
      "parents": [
        "e31f3698cd3499e676f6b0ea12e3528f569c4fa3"
      ],
      "author": {
        "name": "Lai Jiangshan",
        "email": "laijs@cn.fujitsu.com",
        "time": "Mon Aug 09 17:20:02 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Mon Aug 09 20:45:03 2010 -0700"
      },
      "message": "ksm: cleanup for mm_slots_hash\n\nUse compile-allocated memory instead of dynamic allocated memory for\nmm_slots_hash.\n\nUse hash_ptr() instead divisions for bucket calculation.\n\nSigned-off-by: Lai Jiangshan \u003claijs@cn.fujitsu.com\u003e\nSigned-off-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Avi Kivity \u003cavi@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "76545066c8521f3e32c849744744842b4df25b79",
      "tree": "978b6b003f63e1e22618586b7d9c2dd8ef363614",
      "parents": [
        "012f18004da33ba672e3c60838cc4898126174d3"
      ],
      "author": {
        "name": "Rik van Riel",
        "email": "riel@redhat.com",
        "time": "Mon Aug 09 17:18:41 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Mon Aug 09 20:44:55 2010 -0700"
      },
      "message": "mm: extend KSM refcounts to the anon_vma root\n\nKSM reference counts can cause an anon_vma to exist after the processe it\nbelongs to have already exited.  Because the anon_vma lock now lives in\nthe root anon_vma, we need to ensure that the root anon_vma stays around\nuntil after all the \"child\" anon_vmas have been freed.\n\nThe obvious way to do this is to have a \"child\" anon_vma take a reference\nto the root in anon_vma_fork.  When the anon_vma is freed at munmap or\nprocess exit, we drop the refcount in anon_vma_unlink and possibly free\nthe root anon_vma.\n\nThe KSM anon_vma reference count function also needs to be modified to\ndeal with the possibility of freeing 2 levels of anon_vma.  The easiest\nway to do this is to break out the KSM magic and make it generic.\n\nWhen compiling without CONFIG_KSM, this code is compiled out.\n\nSigned-off-by: Rik van Riel \u003criel@redhat.com\u003e\nTested-by: Larry Woodman \u003clwoodman@redhat.com\u003e\nAcked-by: Larry Woodman \u003clwoodman@redhat.com\u003e\nReviewed-by: Minchan Kim \u003cminchan.kim@gmail.com\u003e\nCc: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nAcked-by: Mel Gorman \u003cmel@csn.ul.ie\u003e\nAcked-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\nTested-by: Dave Young \u003chidave.darkstar@gmail.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "012f18004da33ba672e3c60838cc4898126174d3",
      "tree": "990382f9f8c0d885463ac9195b8e9a18043f716d",
      "parents": [
        "5c341ee1dfc8fe69d66b1c8b19e463c6d7201ae1"
      ],
      "author": {
        "name": "Rik van Riel",
        "email": "riel@redhat.com",
        "time": "Mon Aug 09 17:18:40 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Mon Aug 09 20:44:55 2010 -0700"
      },
      "message": "mm: always lock the root (oldest) anon_vma\n\nAlways (and only) lock the root (oldest) anon_vma whenever we do something\nin an anon_vma.  The recently introduced anon_vma scalability is due to\nthe rmap code scanning only the VMAs that need to be scanned.  Many common\noperations still took the anon_vma lock on the root anon_vma, so always\ntaking that lock is not expected to introduce any scalability issues.\n\nHowever, always taking the same lock does mean we only need to take one\nlock, which means rmap_walk on pages from any anon_vma in the vma is\nexcluded from occurring during an munmap, expand_stack or other operation\nthat needs to exclude rmap_walk and similar functions.\n\nAlso add the proper locking to vma_adjust.\n\nSigned-off-by: Rik van Riel \u003criel@redhat.com\u003e\nTested-by: Larry Woodman \u003clwoodman@redhat.com\u003e\nAcked-by: Larry Woodman \u003clwoodman@redhat.com\u003e\nReviewed-by: Minchan Kim \u003cminchan.kim@gmail.com\u003e\nReviewed-by: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nAcked-by: Mel Gorman \u003cmel@csn.ul.ie\u003e\nAcked-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "cba48b98f2348c814316c4b4f411a07a0e4a2bf9",
      "tree": "49c0426f8d41cb147722305c2c3495dd515c3253",
      "parents": [
        "bb4a340e075b7897ece109686bfa177f8518d2db"
      ],
      "author": {
        "name": "Rik van Riel",
        "email": "riel@redhat.com",
        "time": "Mon Aug 09 17:18:38 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Mon Aug 09 20:44:55 2010 -0700"
      },
      "message": "mm: change direct call of spin_lock(anon_vma-\u003elock) to inline function\n\nSubsitute a direct call of spin_lock(anon_vma-\u003elock) with an inline\nfunction doing exactly the same.\n\nThis makes it easier to do the substitution to the root anon_vma lock in a\nfollowing patch.\n\nWe will deal with the handful of special locks (nested, dec_and_lock, etc)\nseparately.\n\nSigned-off-by: Rik van Riel \u003criel@redhat.com\u003e\nAcked-by: Mel Gorman \u003cmel@csn.ul.ie\u003e\nAcked-by: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nTested-by: Larry Woodman \u003clwoodman@redhat.com\u003e\nAcked-by: Larry Woodman \u003clwoodman@redhat.com\u003e\nReviewed-by: Minchan Kim \u003cminchan.kim@gmail.com\u003e\nAcked-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "7f60c214fd3a360461f3286c6908084f7f8b1950",
      "tree": "dba48cf988a22a40796187c7274f7903a288f7f4",
      "parents": [
        "3f6c82728f4e31a97c3a1b32abccb512fed0b573"
      ],
      "author": {
        "name": "Mel Gorman",
        "email": "mel@csn.ul.ie",
        "time": "Mon May 24 14:32:18 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue May 25 08:06:58 2010 -0700"
      },
      "message": "mm: migration: share the anon_vma ref counts between KSM and page migration\n\nFor clarity of review, KSM and page migration have separate refcounts on\nthe anon_vma.  While clear, this is a waste of memory.  This patch gets\nKSM and page migration to share their toys in a spirit of harmony.\n\nSigned-off-by: Mel Gorman \u003cmel@csn.ul.ie\u003e\nReviewed-by: Minchan Kim \u003cminchan.kim@gmail.com\u003e\nReviewed-by: KOSAKI Motohiro \u003ckosaki.motohiro@jp.fujitsu.com\u003e\nReviewed-by: Christoph Lameter \u003ccl@linux-foundation.org\u003e\nReviewed-by: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nCc: Rik van Riel \u003criel@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "22eccdd7d2d94be48ae9b01fef5f52ccbb81dcd5",
      "tree": "346ba02239f0d3a1ed5d1d09fc3d323c29202270",
      "parents": [
        "453dc65931915abc61f92e12bba1fc4747ff5542"
      ],
      "author": {
        "name": "Dan Carpenter",
        "email": "error27@gmail.com",
        "time": "Fri Apr 23 13:18:10 2010 -0400"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Sat Apr 24 11:31:26 2010 -0700"
      },
      "message": "ksm: check for ERR_PTR from follow_page()\n\nThe follow_page() function can potentially return -EFAULT so I added\nchecks for this.\n\nAlso I silenced an uninitialized variable warning on my version of gcc\n(version 4.3.2).\n\nSigned-off-by: Dan Carpenter \u003cerror27@gmail.com\u003e\nAcked-by: Rik van Riel \u003criel@redhat.com\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Johannes Weiner \u003channes@cmpxchg.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "cb53237513bd1e090cce120efe12ede72c932b5f",
      "tree": "43d0665b57b654cf10ea12233e8234367e1634e0",
      "parents": [
        "20072205fcdf7d85cd3101f1f11dfab333c5fd0c"
      ],
      "author": {
        "name": "Robin Holt",
        "email": "holt@sgi.com",
        "time": "Tue Mar 23 13:35:26 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Mar 24 16:31:20 2010 -0700"
      },
      "message": "mm/ksm.c is doing an unneeded _notify in write_protect_page.\n\nksm.c\u0027s write_protect_page implements a lockless means of verifying a page\ndoes not have any users of the page which are not accounted for via other\nkernel tracking means.  It does this by removing the writable pte with TLB\nflushes, checking the page_count against the total known users, and then\nusing set_pte_at_notify to make it a read-only entry.\n\nAn unneeded mmu_notifier callout is made in the case where the known users\ndoes not match the page_count.  In that event, we are inserting the\nidentical pte and there is no need for the set_pte_at_notify, but rather\nthe simpler set_pte_at suffices.\n\nSigned-off-by: Robin Holt \u003cholt@sgi.com\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nAcked-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nAcked-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "5beb49305251e5669852ed541e8e2f2f7696c53e",
      "tree": "46457450a22f23938b24904aeba5d4ada2f53b20",
      "parents": [
        "648bcc771145172a14bc35eeb849ed08f6aa4f1e"
      ],
      "author": {
        "name": "Rik van Riel",
        "email": "riel@redhat.com",
        "time": "Fri Mar 05 13:42:07 2010 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Sat Mar 06 11:26:26 2010 -0800"
      },
      "message": "mm: change anon_vma linking to fix multi-process server scalability issue\n\nThe old anon_vma code can lead to scalability issues with heavily forking\nworkloads.  Specifically, each anon_vma will be shared between the parent\nprocess and all its child processes.\n\nIn a workload with 1000 child processes and a VMA with 1000 anonymous\npages per process that get COWed, this leads to a system with a million\nanonymous pages in the same anon_vma, each of which is mapped in just one\nof the 1000 processes.  However, the current rmap code needs to walk them\nall, leading to O(N) scanning complexity for each page.\n\nThis can result in systems where one CPU is walking the page tables of\n1000 processes in page_referenced_one, while all other CPUs are stuck on\nthe anon_vma lock.  This leads to catastrophic failure for a benchmark\nlike AIM7, where the total number of processes can reach in the tens of\nthousands.  Real workloads are still a factor 10 less process intensive\nthan AIM7, but they are catching up.\n\nThis patch changes the way anon_vmas and VMAs are linked, which allows us\nto associate multiple anon_vmas with a VMA.  At fork time, each child\nprocess gets its own anon_vmas, in which its COWed pages will be\ninstantiated.  The parents\u0027 anon_vma is also linked to the VMA, because\nnon-COWed pages could be present in any of the children.\n\nThis reduces rmap scanning complexity to O(1) for the pages of the 1000\nchild processes, with O(N) complexity for at most 1/N pages in the system.\n This reduces the average scanning cost in heavily forking workloads from\nO(N) to 2.\n\nThe only real complexity in this patch stems from the fact that linking a\nVMA to anon_vmas now involves memory allocations.  This means vma_adjust\ncan fail, if it needs to attach a VMA to anon_vma structures.  This in\nturn means error handling needs to be added to the calling functions.\n\nA second source of complexity is that, because there can be multiple\nanon_vmas, the anon_vma linking in vma_adjust can no longer be done under\n\"the\" anon_vma lock.  To prevent the rmap code from walking up an\nincomplete VMA, this patch introduces the VM_LOCK_RMAP VMA flag.  This bit\nflag uses the same slot as the NOMMU VM_MAPPED_COPY, with an ifdef in mm.h\nto make sure it is impossible to compile a kernel that needs both symbolic\nvalues for the same bitflag.\n\nSome test results:\n\nWithout the anon_vma changes, when AIM7 hits around 9.7k users (on a test\nbox with 16GB RAM and not quite enough IO), the system ends up running\n\u003e99% in system time, with every CPU on the same anon_vma lock in the\npageout code.\n\nWith these changes, AIM7 hits the cross-over point around 29.7k users.\nThis happens with ~99% IO wait time, there never seems to be any spike in\nsystem time.  The anon_vma lock contention appears to be resolved.\n\n[akpm@linux-foundation.org: cleanups]\nSigned-off-by: Rik van Riel \u003criel@redhat.com\u003e\nCc: KOSAKI Motohiro \u003ckosaki.motohiro@jp.fujitsu.com\u003e\nCc: Larry Woodman \u003clwoodman@redhat.com\u003e\nCc: Lee Schermerhorn \u003cLee.Schermerhorn@hp.com\u003e\nCc: Minchan Kim \u003cminchan.kim@gmail.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "d0f209f68f80f9a152799760c230019e7f270b2a",
      "tree": "83e4a6b2e15f50738572b31cfadb5fc0db17d2b7",
      "parents": [
        "62b61f611eb5e20f7e9f8619bfd03bdfe8af6348"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:34 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:20 2009 -0800"
      },
      "message": "ksm: remove unswappable max_kernel_pages\n\nNow that ksm pages are swappable, and the known holes plugged, remove\nmention of unswappable kernel pages from KSM documentation and comments.\n\nRemove the totalram_pages/4 initialization of max_kernel_pages.  In fact,\nremove max_kernel_pages altogether - we can reinstate it if removal turns\nout to break someone\u0027s script; but if we later want to limit KSM\u0027s memory\nusage, limiting the stable nodes would not be an effective approach.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "62b61f611eb5e20f7e9f8619bfd03bdfe8af6348",
      "tree": "9f06fff7eb6530fbe90b4d998b91071133f6af25",
      "parents": [
        "e9995ef978a7d5296fe04a9a2c5ca6e66d8bb4e5"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:33 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:20 2009 -0800"
      },
      "message": "ksm: memory hotremove migration only\n\nThe previous patch enables page migration of ksm pages, but that soon gets\ninto trouble: not surprising, since we\u0027re using the ksm page lock to lock\noperations on its stable_node, but page migration switches the page whose\nlock is to be used for that.  Another layer of locking would fix it, but\ndo we need that yet?\n\nDo we actually need page migration of ksm pages?  Yes, memory hotremove\nneeds to offline sections of memory: and since we stopped allocating ksm\npages with GFP_HIGHUSER, they will tend to be GFP_HIGHUSER_MOVABLE\ncandidates for migration.\n\nBut KSM is currently unconscious of NUMA issues, happily merging pages\nfrom different NUMA nodes: at present the rule must be, not to use\nMADV_MERGEABLE where you care about NUMA.  So no, NUMA page migration of\nksm pages does not make sense yet.\n\nSo, to complete support for ksm swapping we need to make hotremove safe.\nksm_memory_callback() take ksm_thread_mutex when MEM_GOING_OFFLINE and\nrelease it when MEM_OFFLINE or MEM_CANCEL_OFFLINE.  But if mapped pages\nare freed before migration reaches them, stable_nodes may be left still\npointing to struct pages which have been removed from the system: the\nstable_node needs to identify a page by pfn rather than page pointer, then\nit can safely prune them when MEM_OFFLINE.\n\nAnd make NUMA migration skip PageKsm pages where it skips PageReserved.\nBut it\u0027s only when we reach unmap_and_move() that the page lock is taken\nand we can be sure that raised pagecount has prevented a PageAnon from\nbeing upgraded: so add offlining arg to migrate_pages(), to migrate ksm\npage when offlining (has sufficient locking) but reject it otherwise.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "e9995ef978a7d5296fe04a9a2c5ca6e66d8bb4e5",
      "tree": "df4324273856e06b8277b7e4a0fa9289eb8e6385",
      "parents": [
        "407f9c8b0889ced1dbe2f9157e4e60c61329d5c9"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:31 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:20 2009 -0800"
      },
      "message": "ksm: rmap_walk to remove_migation_ptes\n\nA side-effect of making ksm pages swappable is that they have to be placed\non the LRUs: which then exposes them to isolate_lru_page() and hence to\npage migration.\n\nAdd rmap_walk() for remove_migration_ptes() to use: rmap_walk_anon() and\nrmap_walk_file() in rmap.c, but rmap_walk_ksm() in ksm.c.  Perhaps some\nconsolidation with existing code is possible, but don\u0027t attempt that yet\n(try_to_unmap needs to handle nonlinears, but migration pte removal does\nnot).\n\nrmap_walk() is sadly less general than it appears: rmap_walk_anon(), like\nremove_anon_migration_ptes() which it replaces, avoids calling\npage_lock_anon_vma(), because that includes a page_mapped() test which\nfails when all migration ptes are in place.  That was valid when NUMA page\nmigration was introduced (holding mmap_sem provided the missing guarantee\nthat anon_vma\u0027s slab had not already been destroyed), but I believe not\nvalid in the memory hotremove case added since.\n\nFor now do the same as before, and consider the best way to fix that\nunlikely race later on.  When fixed, we can probably use rmap_walk() on\nhwpoisoned ksm pages too: for now, they remain among hwpoison\u0027s various\nexceptions (its PageKsm test comes before the page is locked, but its\npage_lock_anon_vma fails safely if an anon gets upgraded).\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "80e148226028257ec0a1909d99b2c40d0ffe17f2",
      "tree": "1e3cae42144f5c80e215ba254e01bd6847ba1b36",
      "parents": [
        "4035c07a895974d0ac06a56fe870ad293fc451a7"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:29 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:19 2009 -0800"
      },
      "message": "ksm: share anon page without allocating\n\nWhen ksm pages were unswappable, it made no sense to include them in mem\ncgroup accounting; but now that they are swappable (although I see no\nstrict logical connection) the principle of least surprise implies that\nthey should be accounted (with the usual dissatisfaction, that a shared\npage is accounted to only one of the cgroups using it).\n\nThis patch was intended to add mem cgroup accounting where necessary; but\nturned inside out, it now avoids allocating a ksm page, instead upgrading\nan anon page to ksm - which brings its existing mem cgroup accounting with\nit.  Thus mem cgroups don\u0027t appear in the patch at all.\n\nThis upgrade from PageAnon to PageKsm takes place under page lock (via a\nsomewhat hacky NULL kpage interface), and audit showed only one place\nwhich needed to cope with the race - page_referenced() is sometimes used\nwithout page lock, so page_lock_anon_vma() needs an ACCESS_ONCE() to be\nsure of getting anon_vma and flags together (no problem if the page goes\nksm an instant after, the integrity of that anon_vma list is unaffected).\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "4035c07a895974d0ac06a56fe870ad293fc451a7",
      "tree": "b0cc7cabeb0b23d97d5bd5080836d57bc5ee4689",
      "parents": [
        "db114b83ab6064d9b1d6ec5650e096c89bd95e25"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:27 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:19 2009 -0800"
      },
      "message": "ksm: take keyhole reference to page\n\nThere\u0027s a lamentable flaw in KSM swapping: the stable_node holds a\nreference to the ksm page, so the page to be freed cannot actually be\nfreed until ksmd works its way around to removing the last rmap_item from\nits stable_node.  Which in some configurations may take minutes: not quite\nresponsive enough for memory reclaim.  And we don\u0027t want to twist KSM and\nits locking more tightly into the rest of mm.  What a pity.\n\nBut although the stable_node needs to hold a pointer to the ksm page, does\nit actually need to raise the reference count of that page?\n\nNo.  It would need to do so if struct pages were ordinary kmalloc\u0027ed\nobjects; but they are more stable than that, and reused in particular ways\naccording to particular rules.\n\nAccess to stable_node from its pointer in struct page is no problem, so\nlong as we never free a stable_node before the ksm page itself has been\nfreed.  Access to struct page from its pointer in stable_node: reintroduce\nget_ksm_page(), and let that peep out through its keyhole (the stable_node\npointer to ksm page), to see if that struct page still holds the right key\nto open it (the ksm page mapping pointer back to this stable_node).\n\nThis relies upon the established way in which free_hot_cold_page() sets an\nanon (including ksm) page-\u003emapping to NULL; and relies upon no other user\nof a struct page to put something which looks like the original\nstable_node pointer (with two low bits also set) into page-\u003emapping.  It\nalso needs get_page_unless_zero() technique pioneered by speculative\npagecache; and uses rcu_read_lock() to keep the guarantees that gives.\n\nThere are several drivers which put pointers of their own into page-\u003e\nmapping; but none of those could coincide with our stable_node pointers,\nsince KSM won\u0027t free a stable_node until it sees that the page has gone.\n\nThe only problem case found is the pagetable spinlock USE_SPLIT_PTLOCKS\nplaces in struct page (my own abuse): to accommodate GENERIC_LOCKBREAK\u0027s\nbreak_lock on 32-bit, that spans both page-\u003eprivate and page-\u003emapping.\nSince break_lock is only 0 or 1, again no confusion for get_ksm_page().\n\nBut what of DEBUG_SPINLOCK on 64-bit bigendian?  When owner_cpu is 3\n(matching PageKsm low bits), it might see 0xdead4ead00000003 in page-\u003e\nmapping, which might coincide?  We could get around that by...  but a\nbetter answer is to suppress USE_SPLIT_PTLOCKS when DEBUG_SPINLOCK or\nDEBUG_LOCK_ALLOC, to stop bloating sizeof(struct page) in their case -\nalready proposed in an earlier mm/Kconfig patch.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "db114b83ab6064d9b1d6ec5650e096c89bd95e25",
      "tree": "15e289b25fec011238f6838c6aafa1ff5e293224",
      "parents": [
        "5ad6468801d28c4d4ac9f48ec19297817c915f6a"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:25 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:19 2009 -0800"
      },
      "message": "ksm: hold anon_vma in rmap_item\n\nFor full functionality, page_referenced_one() and try_to_unmap_one() need\nto know the vma: to pass vma down to arch-dependent flushes, or to observe\nVM_LOCKED or VM_EXEC.  But KSM keeps no record of vma: nor can it, since\nvmas get split and merged without its knowledge.\n\nInstead, note page\u0027s anon_vma in its rmap_item when adding to stable tree:\nall the vmas which might map that page are listed by its anon_vma.\n\npage_referenced_ksm() and try_to_unmap_ksm() then traverse the anon_vma,\nfirst to find the probable vma, that which matches rmap_item\u0027s mm; but if\nthat is not enough to locate all instances, traverse again to try the\nothers.  This catches those occasions when fork has duplicated a pte of a\nksm page, but ksmd has not yet come around to assign it an rmap_item.\n\nBut each rmap_item in the stable tree which refers to an anon_vma needs to\ntake a reference to it.  Andrea\u0027s anon_vma design cleverly avoided a\nreference count (an anon_vma was free when its list of vmas was empty),\nbut KSM now needs to add that.  Is a 32-bit count sufficient?  I believe\nso - the anon_vma is only free when both count is 0 and list is empty.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "5ad6468801d28c4d4ac9f48ec19297817c915f6a",
      "tree": "edd8dc48693f43278d6fe1614aca2bf660d4dc10",
      "parents": [
        "73848b4684e84a84cfd1555af78d41158f31e16b"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:24 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:19 2009 -0800"
      },
      "message": "ksm: let shared pages be swappable\n\nInitial implementation for swapping out KSM\u0027s shared pages: add\npage_referenced_ksm() and try_to_unmap_ksm(), which rmap.c calls when\nfaced with a PageKsm page.\n\nMost of what\u0027s needed can be got from the rmap_items listed from the\nstable_node of the ksm page, without discovering the actual vma: so in\nthis patch just fake up a struct vma for page_referenced_one() or\ntry_to_unmap_one(), then refine that in the next patch.\n\nAdd VM_NONLINEAR to ksm_madvise()\u0027s list of exclusions: it has always been\nimplicit there (being only set with VM_SHARED, already excluded), but\nlet\u0027s make it explicit, to help justify the lack of nonlinear unmap.\n\nRely on the page lock to protect against concurrent modifications to that\npage\u0027s node of the stable tree.\n\nThe awkward part is not swapout but swapin: do_swap_page() and\npage_add_anon_rmap() now have to allow for new possibilities - perhaps a\nksm page still in swapcache, perhaps a swapcache page associated with one\nlocation in one anon_vma now needed for another location or anon_vma.\n(And the vma might even be no longer VM_MERGEABLE when that happens.)\n\nksm_might_need_to_copy() checks for that case, and supplies a duplicate\npage when necessary, simply leaving it to a subsequent pass of ksmd to\nrediscover the identity and merge them back into one ksm page.\nDisappointingly primitive: but the alternative would have to accumulate\nunswappable info about the swapped out ksm pages, limiting swappability.\n\nRemove page_add_ksm_rmap(): page_add_anon_rmap() now has to allow for the\nparticular case it was handling, so just use it instead.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "73848b4684e84a84cfd1555af78d41158f31e16b",
      "tree": "b71ba30e2b20cbc45740a38e9b5aa51b8c2ea60e",
      "parents": [
        "08beca44dfb0ab008e365163df70dbd302ae1508"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:22 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:19 2009 -0800"
      },
      "message": "ksm: fix mlockfreed to munlocked\n\nWhen KSM merges an mlocked page, it has been forgetting to munlock it:\nthat\u0027s been left to free_page_mlock(), which reports it in /proc/vmstat as\nunevictable_pgs_mlockfreed instead of unevictable_pgs_munlocked (and\nwhinges \"Page flag mlocked set for process\" in mmotm, whereas mainline is\nsilently forgiving).  Call munlock_vma_page() to fix that.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nAcked-by: Rik van Riel \u003criel@redhat.com\u003e\nAcked-by: Mel Gorman \u003cmel@csn.ul.ie\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "08beca44dfb0ab008e365163df70dbd302ae1508",
      "tree": "33f3ddf5460e139bd7fd37e8c08026a7d852c3da",
      "parents": [
        "7b6ba2c7d3baf8cd9f888e05563dcc32e368baab"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:21 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:19 2009 -0800"
      },
      "message": "ksm: stable_node point to page and back\n\nAdd a pointer to the ksm page into struct stable_node, holding a reference\nto the page while the node exists.  Put a pointer to the stable_node into\nthe ksm page\u0027s -\u003emapping.\n\nThen we don\u0027t need get_ksm_page() while traversing the stable tree: the\npage to compare against is sure to be present and correct, even if it\u0027s no\nlonger visible through any of its existing rmap_items.\n\nAnd we can handle the forked ksm page case more efficiently: no need to\nmemcmp our way through the tree to find its match.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "7b6ba2c7d3baf8cd9f888e05563dcc32e368baab",
      "tree": "89e62613a37d803e4a83b96559acca29526f9638",
      "parents": [
        "6514d511dbe5a77b4bdc0a7e26fd679585112e1e"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:20 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:19 2009 -0800"
      },
      "message": "ksm: separate stable_node\n\nThough we still do well to keep rmap_items in the unstable tree without a\nseparate tree_item at the node, for several reasons it becomes awkward to\nkeep rmap_items in the stable tree without a separate stable_node: lack of\nspace in the nicely-sized rmap_item, the need for an anchor as rmap_items\nare removed, the need for a node even when temporarily no rmap_items are\nattached to it.\n\nSo declare struct stable_node (rb_node to place it in the tree and\nhlist_head for the rmap_items hanging off it), and convert stable tree\nhandling to use it: without yet taking advantage of it.  Note how one\nstable_tree_insert() of a node now has _two_ stable_tree_append()s of the\ntwo rmap_items being merged.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "6514d511dbe5a77b4bdc0a7e26fd679585112e1e",
      "tree": "a3fcf75191b7900043172d147fc7ed8ea97f3b4a",
      "parents": [
        "8dd3557a52f0bc8c960307721da307370ccad6fd"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:19 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:19 2009 -0800"
      },
      "message": "ksm: singly-linked rmap_list\n\nFree up a pointer in struct rmap_item, by making the mm_slot\u0027s rmap_list a\nsingly-linked list: we always traverse that list sequentially, and we\ndon\u0027t even lose any prefetches (but should consider adding a few later).\nName it rmap_list throughout.\n\nDo we need to free up that pointer?  Not immediately, and in the end, we\ncould continue to avoid it with a union; but having done the conversion,\nlet\u0027s keep it this way, since there\u0027s no downside, and maybe we\u0027ll want\nmore in future (struct rmap_item is a cache-friendly 32 bytes on 32-bit\nand 64 bytes on 64-bit, so we shall want to avoid expanding it).\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "8dd3557a52f0bc8c960307721da307370ccad6fd",
      "tree": "711a15d188b6679026ae818bd0635d271820ea7e",
      "parents": [
        "31e855ea7173bdb0520f9684580423a9560f66e0"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:18 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:19 2009 -0800"
      },
      "message": "ksm: cleanup some function arguments\n\nCleanup: make argument names more consistent from cmp_and_merge_page()\ndown to replace_page(), so that it\u0027s easier to follow the rmap_item\u0027s page\nand the matching tree_page and the merged kpage through that code.\n\nIn some places, e.g.  break_cow(), pass rmap_item instead of separate mm\nand address.\n\ncmp_and_merge_page() initialize tree_page to NULL, to avoid a \"may be used\nuninitialized\" warning seen in one config by Anil SB.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "31e855ea7173bdb0520f9684580423a9560f66e0",
      "tree": "20ff327e2a58929696946971a8201da559785338",
      "parents": [
        "93d17715a5b960d34220f2edba3e6cee9b5b1c58"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:17 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:18 2009 -0800"
      },
      "message": "ksm: remove redundancies when merging page\n\nThere is no need for replace_page() to calculate a write-protected prot\nvm_page_prot must already be write-protected for an anonymous page (see\nmm/memory.c do_anonymous_page() for similar reliance on vm_page_prot).\n\nThere is no need for try_to_merge_one_page() to get_page and put_page on\nnewpage and oldpage: in every case we already hold a reference to each of\nthem.\n\nBut some instinct makes me move try_to_merge_one_page()\u0027s unlock_page of\noldpage down after replace_page(): that doesn\u0027t increase contention on the\nksm page, and makes thinking about the transition easier.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "93d17715a5b960d34220f2edba3e6cee9b5b1c58",
      "tree": "9ab08ff4169464bf5b8d86c8082296fd6e3d069b",
      "parents": [
        "338fde90930eaa02f6f394daa23d35a410af5852"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Dec 14 17:59:16 2009 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Dec 15 08:53:18 2009 -0800"
      },
      "message": "ksm: three remove_rmap_item_from_tree cleanups\n\n1. remove_rmap_item_from_tree() is called as a precaution from\n   various places: don\u0027t dirty the rmap_item cacheline unnecessarily,\n   just mask the flags out of the address when they have been set.\n\n2. First get_next_rmap_item() removes an unstable rmap_item from its tree,\n   then shortly afterwards cmp_and_merge_page() removes a stable rmap_item\n   from its tree: it\u0027s easier just to do both at once (but definitely keep\n   the BUG_ON(age \u003e 1) which guards against a future omission).\n\n3. When cmp_and_merge_page() moves an rmap_item from unstable to stable\n   tree, it does its own rb_erase() and accounting: that\u0027s better\n   expressed by remove_rmap_item_from_tree().\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "d178f27fc5150d680d9df865ea9dfe3269cf00a6",
      "tree": "c2e87a755ce78765a8dd7752d7608c57ace29bec",
      "parents": [
        "b7b69c7e97bc0a6694e7052a200609fd48baafc2"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Nov 09 15:58:23 2009 +0000"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Mon Nov 09 09:55:44 2009 -0800"
      },
      "message": "ksm: cond_resched in unstable tree\n\nKSM needs a cond_resched() for CONFIG_PREEMPT_NONE, in its unbounded\nsearch of the unstable tree.  The stable tree cases already have one,\nand originally there was one down inside get_user_pages();\nbut I missed it when I converted to follow_page() instead.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "c73602ad31cdcf7e6651f43d12f65b5b9b825b6f",
      "tree": "e9af7ebc13854e03e9ea0ee1c4e7e00475506fa7",
      "parents": [
        "0eca52a92735f43462165efe00a7e394345fb38e"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Wed Oct 07 16:32:22 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Oct 08 07:36:38 2009 -0700"
      },
      "message": "ksm: more on default values\n\nAdjust the max_kernel_pages default to a quarter of totalram_pages,\ninstead of nr_free_buffer_pages() / 4: the KSM pages themselves come from\nhighmem, and even on a 16GB PAE machine, 4GB of KSM pages would only be\npinning 32MB of lowmem with their rmap_items, so no need for the more\nobscure calculation (nor for its own special init function).\n\nThere is no way for the user to switch KSM on if CONFIG_SYSFS is not\nenabled, so in that case default run to KSM_RUN_MERGE.\n\nUpdate KSM Documentation and Kconfig to reflect the new defaults.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "2c6854fdadf940678fd54779b778f6faafb870bb",
      "tree": "0ed3efb3651813593e38e7976d1201a738b300a6",
      "parents": [
        "d2b5ec3aa0784335f031239e71fb50924cac9e0d"
      ],
      "author": {
        "name": "Izik Eidus",
        "email": "ieidus@redhat.com",
        "time": "Wed Sep 23 15:56:04 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Thu Sep 24 07:20:56 2009 -0700"
      },
      "message": "ksm: change default values to better fit into mainline kernel\n\nNow that ksm is in mainline it is better to change the default values to\nbetter fit to most of the users.\n\nThis patch change the ksm default values to be:\n\n\tksm_thread_pages_to_scan \u003d 100 (instead of 200)\n\tksm_thread_sleep_millisecs \u003d 20 (like before)\n\tksm_run \u003d KSM_RUN_STOP (instead of KSM_RUN_MERGE - meaning ksm is\n\t                        disabled by default)\n\tksm_max_kernel_pages \u003d nr_free_buffer_pages / 4 (instead of 2046)\n\nThe important aspect of this patch is: it disables ksm by default, and sets\nthe number of the kernel_pages that can be allocated to be a reasonable\nnumber.\n\nSigned-off-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "35451beecbd7c86ce3249d543594517a5fe9a0cd",
      "tree": "e72759e6e6fcd142ab85c607a9b3dd3e1c016eed",
      "parents": [
        "a913e182ab9484308e870af37a14d372742d53b0"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:27 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:33 2009 -0700"
      },
      "message": "ksm: unmerge is an origin of OOMs\n\nJust as the swapoff system call allocates many pages of RAM to various\nprocesses, perhaps triggering OOM, so \"echo 2 \u003e/sys/kernel/mm/ksm/run\"\n(unmerge) is liable to allocate many pages of RAM to various processes,\nperhaps triggering OOM; and each is normally run from a modest admin\nprocess (swapoff or shell), easily repeated until it succeeds.\n\nSo treat unmerge_and_remove_all_rmap_items() in the same way that we treat\ntry_to_unuse(): generalize PF_SWAPOFF to PF_OOM_ORIGIN, and bracket both\nwith that, to ask the OOM killer to kill them first, to prevent them from\nspawning more and more OOM kills.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "a913e182ab9484308e870af37a14d372742d53b0",
      "tree": "0fca5598aeba4c53999ec46b6b82b46f9a981965",
      "parents": [
        "8314c4f24a0a5c9b1f7544e9fa83a1d5367ddaa7"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:26 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:33 2009 -0700"
      },
      "message": "ksm: clean up obsolete references\n\nA few cleanups, given the munlock fix: the comment on ksm_test_exit() no\nlonger applies, and it can be made private to ksm.c; there\u0027s no more\nreference to mmu_gather or tlb.h, and mmap.c doesn\u0027t need ksm.h.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "2ffd8679c8e4ec226718bff58b50b226dd477015",
      "tree": "5e58b19da86defa012613a850c6f57dd69ab51f3",
      "parents": [
        "1c2fb7a4c2ca7a958b02bc1e615d0254990bba8d"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:23 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: sysfs and defaults\n\nAt present KSM is just a waste of space if you don\u0027t have CONFIG_SYSFS\u003dy\nto provide the /sys/kernel/mm/ksm files to tune and activate it.\n\nMake KSM depend on SYSFS?  Could do, but it might be better to provide\nsome defaults so that KSM works out-of-the-box, ready for testers to\nmadvise MADV_MERGEABLE, even without SYSFS.\n\nThough anyone serious is likely to want to retune the numbers to their\ntaste once they have experience; and whether these settings ever reach\n2.6.32 can be discussed along the way.\n\nSave 1kB from tiny kernels by #ifdef\u0027ing the SYSFS side of it.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "1c2fb7a4c2ca7a958b02bc1e615d0254990bba8d",
      "tree": "489a97bd453b8002f2234f7e736548103315fa38",
      "parents": [
        "9ba6929480088a85c1ff60a4b1f1c9fc80dbd2b7"
      ],
      "author": {
        "name": "Andrea Arcangeli",
        "email": "aarcange@redhat.com",
        "time": "Mon Sep 21 17:02:22 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: fix deadlock with munlock in exit_mmap\n\nRawhide users have reported hang at startup when cryptsetup is run: the\nsame problem can be simply reproduced by running a program int main() {\nmlockall(MCL_CURRENT | MCL_FUTURE); return 0; }\n\nThe problem is that exit_mmap() applies munlock_vma_pages_all() to\nclean up VM_LOCKED areas, and its current implementation (stupidly)\ntries to fault in absent pages, for example where PROT_NONE prevented\nthem being faulted in when mlocking.  Whereas the \"ksm: fix oom\ndeadlock\" patch, knowing there\u0027s a race by which KSM might try to fault\nin pages after exit_mmap() had finally zapped the range, backs out of\nsuch faults doing nothing when its ksm_test_exit() notices mm_users 0.\n\nSo revert that part of \"ksm: fix oom deadlock\" which moved the\nksm_exit() call from before exit_mmap() to the middle of exit_mmap();\nand remove those ksm_test_exit() checks from the page fault paths, so\nallowing the munlocking to proceed without interference.\n\nksm_exit, if there are rmap_items still chained on this mm slot, takes\nmmap_sem write side: so preventing KSM from working on an mm while\nexit_mmap runs.  And KSM will bail out as soon as it notices that\nmm_users is already zero, thanks to its internal ksm_test_exit checks.\nSo that when a task is killed by OOM killer or the user, KSM will not\nindefinitely prevent it from running exit_mmap to release its memory.\n\nThis does break a part of what \"ksm: fix oom deadlock\" was trying to\nachieve.  When unmerging KSM (echo 2 \u003e/sys/kernel/mm/ksm), and even\nwhen ksmd itself has to cancel a KSM page, it is possible that the\nfirst OOM-kill victim would be the KSM process being faulted: then its\nmemory won\u0027t be freed until a second victim has been selected (freeing\nmemory for the unmerging fault to complete).\n\nBut the OOM killer is already liable to kill a second victim once the\nintended victim\u0027s p-\u003emm goes to NULL: so there\u0027s not much point in\nrejecting this KSM patch before fixing that OOM behaviour.  It is very\nmuch more important to allow KSM users to boot up, than to haggle over\nan unlikely and poorly supported OOM case.\n\nWe also intend to fix munlocking to not fault pages: at which point\nthis patch _could_ be reverted; though that would be controversial, so\nwe hope to find a better solution.\n\nSigned-off-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nAcked-by: Justin M. Forbes \u003cjforbes@redhat.com\u003e\nAcked-for-now-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Izik Eidus \u003cieidus@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "9ba6929480088a85c1ff60a4b1f1c9fc80dbd2b7",
      "tree": "39aab8cdffae598b55e35c578f70820712286ab4",
      "parents": [
        "cd551f97519d35855be5a8720a47cc802ee4fd06"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:20 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: fix oom deadlock\n\nThere\u0027s a now-obvious deadlock in KSM\u0027s out-of-memory handling:\nimagine ksmd or KSM_RUN_UNMERGE handling, holding ksm_thread_mutex,\ntrying to allocate a page to break KSM in an mm which becomes the\nOOM victim (quite likely in the unmerge case): it\u0027s killed and goes\nto exit, and hangs there waiting to acquire ksm_thread_mutex.\n\nClearly we must not require ksm_thread_mutex in __ksm_exit, simple\nthough that made everything else: perhaps use mmap_sem somehow?\nAnd part of the answer lies in the comments on unmerge_ksm_pages:\n__ksm_exit should also leave all the rmap_item removal to ksmd.\n\nBut there\u0027s a fundamental problem, that KSM relies upon mmap_sem to\nguarantee the consistency of the mm it\u0027s dealing with, yet exit_mmap\ntears down an mm without taking mmap_sem.  And bumping mm_users won\u0027t\nhelp at all, that just ensures that the pages the OOM killer assumes\nare on their way to being freed will not be freed.\n\nThe best answer seems to be, to move the ksm_exit callout from just\nbefore exit_mmap, to the middle of exit_mmap: after the mm\u0027s pages\nhave been freed (if the mmu_gather is flushed), but before its page\ntables and vma structures have been freed; and down_write,up_write\nmmap_sem there to serialize with KSM\u0027s own reliance on mmap_sem.\n\nBut KSM then needs to be careful, whenever it downs mmap_sem, to\ncheck that the mm is not already exiting: there\u0027s a danger of using\nfind_vma on a layout that\u0027s being torn apart, or writing into page\ntables which have been freed for reuse; and even do_anonymous_page\nand __do_fault need to check they\u0027re not being called by break_ksm\nto reinstate a pte after zap_pte_range has zapped that page table.\n\nThough it might be clearer to add an exiting flag, set while holding\nmmap_sem in __ksm_exit, that wouldn\u0027t cover the issue of reinstating\na zapped pte.  All we need is to check whether mm_users is 0 - but\nmust remember that ksmd may detect that before __ksm_exit is reached.\nSo, ksm_test_exit(mm) added to comment such checks on mm-\u003emm_users.\n\n__ksm_exit now has to leave clearing up the rmap_items to ksmd,\nthat needs ksm_thread_mutex; but shift the exiting mm just after the\nksm_scan cursor so that it will soon be dealt with.  __ksm_enter raise\nmm_count to hold the mm_struct, ksmd\u0027s exit processing (exactly like\nits processing when it finds all VM_MERGEABLEs unmapped) mmdrop it,\nsimilar procedure for KSM_RUN_UNMERGE (which has stopped ksmd).\n\nBut also give __ksm_exit a fast path: when there\u0027s no complication\n(no rmap_items attached to mm and it\u0027s not at the ksm_scan cursor),\nit can safely do all the exiting work itself.  This is not just an\noptimization: when ksmd is not running, the raised mm_count would\notherwise leak mm_structs.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "cd551f97519d35855be5a8720a47cc802ee4fd06",
      "tree": "8363f75f66efaf725de9ee7de781efbc2c502407",
      "parents": [
        "d952b79136a6c32a3f97e0628ca78340f1d5c6f9"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:17 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: distribute remove_mm_from_lists\n\nDo some housekeeping in ksm.c, to help make the next patch easier\nto understand: remove the function remove_mm_from_lists, distributing\nits code to its callsites scan_get_next_rmap_item and __ksm_exit.\n\nThat turns out to be a win in scan_get_next_rmap_item: move its\nremove_trailing_rmap_items and cursor advancement up, and it becomes\nsimpler than before.  __ksm_exit becomes messier, but will change\nagain; and moving its remove_trailing_rmap_items up lets us strengthen\nthe unstable tree item\u0027s age condition in remove_rmap_item_from_tree.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "d952b79136a6c32a3f97e0628ca78340f1d5c6f9",
      "tree": "d46b096fa097c39faa21c89f329d0c84bd700062",
      "parents": [
        "81464e30609cdbd3d96d8dd6991e7481195a89a1"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:16 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: fix endless loop on oom\n\nbreak_ksm has been looping endlessly ignoring VM_FAULT_OOM: that should\nonly be a problem for ksmd when a memory control group imposes limits\n(normally the OOM killer will kill others with an mm until it succeeds);\nbut in general (especially for MADV_UNMERGEABLE and KSM_RUN_UNMERGE) we\ndo need to route the error (or kill) back to the caller (or sighandling).\n\nTest signal_pending in unmerge_ksm_pages, which could be a lengthy\nprocedure if it has to spill into swap: returning -ERESTARTSYS so that\ntrivial signals will restart but fatals will terminate (is that right?\nwe do different things in different places in mm, none exactly this).\n\nunmerge_and_remove_all_rmap_items was forgetting to lock when going\ndown the mm_list: fix that.  Whether it\u0027s successful or not, reset\nksm_scan cursor to head; but only if it\u0027s successful, reset seqnr\n(shown in full_scans) - page counts will have gone down to zero.\n\nThis patch leaves a significant OOM deadlock, but it\u0027s a good step\non the way, and that deadlock is fixed in a subsequent patch.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "81464e30609cdbd3d96d8dd6991e7481195a89a1",
      "tree": "ec25711be5bf99e94264e3b201c0e148b9c8641a",
      "parents": [
        "6e15838425ac855982f10419558649954a0684a3"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:15 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: five little cleanups\n\n1. We don\u0027t use __break_cow entry point now: merge it into break_cow.\n2. remove_all_slot_rmap_items is just a special case of\n   remove_trailing_rmap_items: use the latter instead.\n3. Extend comment on unmerge_ksm_pages and rmap_items.\n4. try_to_merge_two_pages should use try_to_merge_with_ksm_page\n   instead of duplicating its code; and so swap them around.\n5. Comment on cmp_and_merge_page described last year\u0027s: update it.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "6e15838425ac855982f10419558649954a0684a3",
      "tree": "f39e4a9b845e0bdf8f6b222ca718f155437e5b63",
      "parents": [
        "26465d3ea5a62d59efb3796b9e0e2b0656d02cb1"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:14 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: keep quiet while list empty\n\nksm_scan_thread already sleeps in wait_event_interruptible until setting\nksm_run activates it; but if there\u0027s nothing on its list to look at, i.e.\nnobody has yet said madvise MADV_MERGEABLE, it\u0027s a shame to be clocking\nup system time and full_scans: ksmd_should_run added to check that too.\n\nAnd move the mutex_lock out around it: the new counts showed that when\nksm_run is stopped, a little work often got done afterwards, because it\nhad been read before taking the mutex.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "26465d3ea5a62d59efb3796b9e0e2b0656d02cb1",
      "tree": "40644bae6d246a1ee0d38b98a5281a3a879725a1",
      "parents": [
        "473b0ce4d13ee77925a7062e25dea0d16a91f654"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:12 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: break cow once unshared\n\nWe kept agreeing not to bother about the unswappable shared KSM pages\nwhich later become unshared by others: observation suggests they\u0027re not\na significant proportion.  But they are disadvantageous, and it is easier\nto break COW to replace them by swappable pages, than offer statistics\nto show that they don\u0027t matter; then we can stop worrying about them.\n\nDoing this in ksm_do_scan, they don\u0027t go through cmp_and_merge_page on\nthis pass: give them a good chance of getting into the unstable tree\non the next pass, or back into the stable, by computing checksum now.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "473b0ce4d13ee77925a7062e25dea0d16a91f654",
      "tree": "965433f77af7ddce5d9911e353e13af6db9ea311",
      "parents": [
        "e178dfde3952192cf44eeb0612882f01fc96c0a9"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:11 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: pages_unshared and pages_volatile\n\nThe pages_shared and pages_sharing counts give a good picture of how\nsuccessful KSM is at sharing; but no clue to how much wasted work it\u0027s\ndoing to get there.  Add pages_unshared (count of unique pages waiting\nin the unstable tree, hoping to find a mate) and pages_volatile.\n\npages_volatile is harder to define.  It includes those pages changing\ntoo fast to get into the unstable tree, but also whatever other edge\nconditions prevent a page getting into the trees: a high value may\ndeserve investigation.  Don\u0027t try to calculate it from the various\nconditions: it\u0027s the total of rmap_items less those accounted for.\n\nAlso show full_scans: the number of completed scans of everything\nregistered in the mm list.\n\nThe locking for all these counts is simply ksm_thread_mutex.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nAcked-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "e178dfde3952192cf44eeb0612882f01fc96c0a9",
      "tree": "874b8dd5c2ebba6889621b14e01b7d503a098e4d",
      "parents": [
        "b4028260334e1ecf63fb5e0a95d65bb2db02c1ec"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:10 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: move pages_sharing updates\n\nThe pages_shared count is incremented and decremented when adding a node\nto and removing a node from the stable tree: easy to understand.  But the\npages_sharing count was hard to follow, being adjusted in various places:\nincrement and decrement it when adding to and removing from the stable tree.\n\nAnd the pages_sharing variable used to include the pages_shared, then those\nwere subtracted when shown in the pages_sharing sysfs file: now keep it as\nan exclusive count of leaves hanging off the stable tree nodes, throughout.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nAcked-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "b4028260334e1ecf63fb5e0a95d65bb2db02c1ec",
      "tree": "0fbfe22a83f4fcb0e47be45374b581f49967085e",
      "parents": [
        "339aa62469f65daf38a01d6c098b5f3ff8016653"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:02:09 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:32 2009 -0700"
      },
      "message": "ksm: rename kernel_pages_allocated\n\nWe\u0027re not implementing swapping of KSM pages in its first release;\nbut when that follows, \"kernel_pages_allocated\" will be a very poor\nname for the sysfs file showing number of nodes in the stable tree:\nrename that to \"pages_shared\" throughout.\n\nBut we already have a \"pages_shared\", counting those page slots\nsharing the shared pages: first rename that to... \"pages_sharing\".\n\nWhat will become of \"max_kernel_pages\" when the pages shared can\nbe swapped?  I guess it will just be removed, so keep that name.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nAcked-by: Izik Eidus \u003cieidus@redhat.com\u003e\nAcked-by: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "339aa62469f65daf38a01d6c098b5f3ff8016653",
      "tree": "fa38bc8d54fe98b8b1eadfdd0b58831c3ce40d76",
      "parents": [
        "36b2528dc1819dc783f69917ac20e66a678b3479"
      ],
      "author": {
        "name": "Izik Eidus",
        "email": "ieidus@redhat.com",
        "time": "Mon Sep 21 17:02:07 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:31 2009 -0700"
      },
      "message": "ksm: change ksm nice level to be 5\n\nksm should try not to disturb other tasks as much as possible.\n\nSigned-off-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nCc: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Rik van Riel \u003criel@redhat.com\u003e\nCc: Wu Fengguang \u003cfengguang.wu@intel.com\u003e\nCc: Balbir Singh \u003cbalbir@in.ibm.com\u003e\nCc: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nCc: Lee Schermerhorn \u003clee.schermerhorn@hp.com\u003e\nCc: Avi Kivity \u003cavi@redhat.com\u003e\nCc: Nick Piggin \u003cnickpiggin@yahoo.com.au\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "36b2528dc1819dc783f69917ac20e66a678b3479",
      "tree": "f784799e8080e01e66518492dda7418ab6368df4",
      "parents": [
        "1ff829957316670af64be24192ef849e7253a509"
      ],
      "author": {
        "name": "Izik Eidus",
        "email": "ieidus@redhat.com",
        "time": "Mon Sep 21 17:02:06 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:31 2009 -0700"
      },
      "message": "ksm: change copyright message\n\nAdding Hugh Dickins into the authors list.\n\nSigned-off-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Chris Wright \u003cchrisw@redhat.com\u003e\nCc: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Rik van Riel \u003criel@redhat.com\u003e\nCc: Wu Fengguang \u003cfengguang.wu@intel.com\u003e\nCc: Balbir Singh \u003cbalbir@in.ibm.com\u003e\nCc: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nCc: Lee Schermerhorn \u003clee.schermerhorn@hp.com\u003e\nCc: Avi Kivity \u003cavi@redhat.com\u003e\nCc: Nick Piggin \u003cnickpiggin@yahoo.com.au\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "31dbd01f314364b70c2e026a5793a29a4da8a9dc",
      "tree": "1a2d47ae7b839129383dd4e10a9ed731f15a5bf9",
      "parents": [
        "9a840895147b12de5cdd633c600b38686840ee53"
      ],
      "author": {
        "name": "Izik Eidus",
        "email": "ieidus@redhat.com",
        "time": "Mon Sep 21 17:02:03 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:31 2009 -0700"
      },
      "message": "ksm: Kernel SamePage Merging\n\nKsm is code that allows merging of identical pages between one or more\napplications, in a way invisible to the applications that use it.  Pages\nthat are merged are marked as read-only, then COWed when any application\ntries to change them.\n\nWhereas fork() allows sharing anonymous pages between parent and child,\nksm can share anonymous pages between unrelated processes.\n\nKsm works by walking over the memory pages of the applications it scans,\nin order to find identical pages.  It uses two sorted data structures,\ncalled the stable and unstable trees, to locate identical pages in an\neffective way.\n\nWhen ksm finds two identical pages, it marks them as readonly and merges\nthem into a single page.  After the pages have been marked as readonly and\nmerged into one, Linux treats them as normal copy-on-write pages, copying\nto a fresh anonymous page if write access is required later.\n\nKsm scans and merges anonymous pages only in those memory areas that have\nbeen registered with it by madvise(addr, length, MADV_MERGEABLE).\n\nThe ksm scanner is controlled by sysfs files in /sys/kernel/mm/ksm/:\n\nmax_kernel_pages - the maximum number of unswappable kernel pages\n                   which may be allocated by ksm (0 for unlimited).\n\nkernel_pages_allocated - how many ksm pages are currently allocated,\n                         sharing identical content between different\n                         processes (pages unswappable in this release).\n\npages_shared - how many pages have been saved by sharing with ksm pages\n               (kernel_pages_allocated being excluded from this count).\n\npages_to_scan - how many pages ksm should scan before sleeping.\n\nsleep_millisecs - how many milliseconds ksm should sleep between scans.\n\nrun - write 0 to disable ksm, read 0 while ksm is disabled (default),\n      write 1 to run ksm, read 1 while ksm is running,\n      write 2 to disable ksm and unmerge all its pages.\n\nIncludes contributions by Andrea Arcangeli Chris Wright and Hugh Dickins.\n\n[hugh.dickins@tiscali.co.uk: fix rare page leak]\nSigned-off-by: Izik Eidus \u003cieidus@redhat.com\u003e\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nSigned-off-by: Chris Wright \u003cchrisw@redhat.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Rik van Riel \u003criel@redhat.com\u003e\nCc: Wu Fengguang \u003cfengguang.wu@intel.com\u003e\nCc: Balbir Singh \u003cbalbir@in.ibm.com\u003e\nCc: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nCc: Lee Schermerhorn \u003clee.schermerhorn@hp.com\u003e\nCc: Avi Kivity \u003cavi@redhat.com\u003e\nCc: Nick Piggin \u003cnickpiggin@yahoo.com.au\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "f8af4da3b4c14e7267c4ffb952079af3912c51c5",
      "tree": "17b0cfbd2d3d9abf9008f69e7fee5369cec7afa5",
      "parents": [
        "d19f352484467a5e518639ddff0554669c10ffab"
      ],
      "author": {
        "name": "Hugh Dickins",
        "email": "hugh.dickins@tiscali.co.uk",
        "time": "Mon Sep 21 17:01:57 2009 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 22 07:17:31 2009 -0700"
      },
      "message": "ksm: the mm interface to ksm\n\nThis patch presents the mm interface to a dummy version of ksm.c, for\nbetter scrutiny of that interface: the real ksm.c follows later.\n\nWhen CONFIG_KSM is not set, madvise(2) reject MADV_MERGEABLE and\nMADV_UNMERGEABLE with EINVAL, since that seems more helpful than\npretending that they can be serviced.  But when CONFIG_KSM\u003dy, accept them\neven if KSM is not currently running, and even on areas which KSM will not\ntouch (e.g.  hugetlb or shared file or special driver mappings).\n\nLike other madvices, report ENOMEM despite success if any area in the\nrange is unmapped, and use EAGAIN to report out of memory.\n\nDefine vma flag VM_MERGEABLE to identify an area on which KSM may try\nmerging pages: leave it to ksm_madvise() to decide whether to set it.\nDefine mm flag MMF_VM_MERGEABLE to identify an mm which might contain\nVM_MERGEABLE areas, to minimize callouts when forking or exiting.\n\nBased upon earlier patches by Chris Wright and Izik Eidus.\n\nSigned-off-by: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nSigned-off-by: Chris Wright \u003cchrisw@redhat.com\u003e\nSigned-off-by: Izik Eidus \u003cieidus@redhat.com\u003e\nCc: Michael Kerrisk \u003cmtk.manpages@gmail.com\u003e\nCc: Andrea Arcangeli \u003caarcange@redhat.com\u003e\nCc: Rik van Riel \u003criel@redhat.com\u003e\nCc: Wu Fengguang \u003cfengguang.wu@intel.com\u003e\nCc: Balbir Singh \u003cbalbir@in.ibm.com\u003e\nCc: Hugh Dickins \u003chugh.dickins@tiscali.co.uk\u003e\nCc: KAMEZAWA Hiroyuki \u003ckamezawa.hiroyu@jp.fujitsu.com\u003e\nCc: Lee Schermerhorn \u003clee.schermerhorn@hp.com\u003e\nCc: Avi Kivity \u003cavi@redhat.com\u003e\nCc: Nick Piggin \u003cnickpiggin@yahoo.com.au\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    }
  ]
}
