)]}'
{
  "commit": "4eaf3f64397c3db3c5785eee508270d62a9fabd9",
  "tree": "bfd986a7e974876755ea6fe0de394199c68e2e36",
  "parents": [
    "1f522509c77a5dea8dc384b735314f03908a6415"
  ],
  "author": {
    "name": "Haicheng Li",
    "email": "haicheng.li@linux.intel.com",
    "time": "Mon May 24 14:32:52 2010 -0700"
  },
  "committer": {
    "name": "Linus Torvalds",
    "email": "torvalds@linux-foundation.org",
    "time": "Tue May 25 08:07:02 2010 -0700"
  },
  "message": "mem-hotplug: fix potential race while building zonelist for new populated zone\n\nAdd global mutex zonelists_mutex to fix the possible race:\n\n     CPU0                                  CPU1                    CPU2\n(1) zone-\u003epresent_pages +\u003d online_pages;\n(2)                                       build_all_zonelists();\n(3)                                                               alloc_page();\n(4)                                                               free_page();\n(5) build_all_zonelists();\n(6)   __build_all_zonelists();\n(7)     zone-\u003epageset \u003d alloc_percpu();\n\nIn step (3,4), zone-\u003epageset still points to boot_pageset, so bad\nthings may happen if 2+ nodes are in this state. Even if only 1 node\nis accessing the boot_pageset, (3) may still consume too much memory\nto fail the memory allocations in step (7).\n\nBesides, atomic operation ensures alloc_percpu() in step (7) will never fail\nsince there is a new fresh memory block added in step(6).\n\n[haicheng.li@linux.intel.com: hold zonelists_mutex when build_all_zonelists]\nSigned-off-by: Haicheng Li \u003chaicheng.li@linux.intel.com\u003e\nSigned-off-by: Wu Fengguang \u003cfengguang.wu@intel.com\u003e\nReviewed-by: Andi Kleen \u003candi.kleen@intel.com\u003e\nCc: Christoph Lameter \u003ccl@linux-foundation.org\u003e\nCc: Mel Gorman \u003cmel@csn.ul.ie\u003e\nCc: Tejun Heo \u003ctj@kernel.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "a367ed5bb3fecdc0f1853c77f40f07c3f8c9c0ec",
      "old_mode": 33188,
      "old_path": "include/linux/mmzone.h",
      "new_id": "0fa491326c4a165eceeef43f24c0f30ac3834832",
      "new_mode": 33188,
      "new_path": "include/linux/mmzone.h"
    },
    {
      "type": "modify",
      "old_id": "3e8b3ba27175f4c13ed217aeaf3771a127ad6553",
      "old_mode": 33188,
      "old_path": "kernel/cpu.c",
      "new_id": "124ad9d6be1644864dda2a9eb55eea94a29c075c",
      "new_mode": 33188,
      "new_path": "kernel/cpu.c"
    },
    {
      "type": "modify",
      "old_id": "089cc97aed3c5506e22487e158106502c6dde666",
      "old_mode": 33188,
      "old_path": "mm/memory_hotplug.c",
      "new_id": "a4cfcdc00455de4be15fcec98c76e45f8de5feab",
      "new_mode": 33188,
      "new_path": "mm/memory_hotplug.c"
    },
    {
      "type": "modify",
      "old_id": "21c52d2d8624a368c388e15e6df338441f6ba5ca",
      "old_mode": 33188,
      "old_path": "mm/page_alloc.c",
      "new_id": "08b349931ebc6bffef8be14c1d5d890750a88038",
      "new_mode": 33188,
      "new_path": "mm/page_alloc.c"
    }
  ]
}
