)]}'
{
  "commit": "153d7f3fcae7ed4e19328549aa9467acdfbced10",
  "tree": "a7b15b844119663a276c7a99549ea5a06c16f19a",
  "parents": [
    "44eb123126d289bac398cac0232309c228386671"
  ],
  "author": {
    "name": "Arjan van de Ven",
    "email": "arjan@linux.intel.com",
    "time": "Wed Jul 26 15:40:07 2006 +0200"
  },
  "committer": {
    "name": "Linus Torvalds",
    "email": "torvalds@g5.osdl.org",
    "time": "Wed Jul 26 07:21:40 2006 -0700"
  },
  "message": "[PATCH] Reorganize the cpufreq cpu hotplug locking to not be totally bizare\n\nThe patch below moves the cpu hotplugging higher up in the cpufreq\nlayering; this is needed to avoid recursive taking of the cpu hotplug\nlock and to otherwise detangle the mess.\n\nThe new rules are:\n1. you must do lock_cpu_hotplug() around the following functions:\n   __cpufreq_driver_target\n   __cpufreq_governor (for CPUFREQ_GOV_LIMITS operation only)\n   __cpufreq_set_policy\n2. governer methods (.governer) must NOT take the lock_cpu_hotplug()\n   lock in any way; they are called with the lock taken already\n3. if your governer spawns a thread that does things, like calling\n   __cpufreq_driver_target, your thread must honor rule #1.\n4. the policy lock and other cpufreq internal locks nest within\n   the lock_cpu_hotplug() lock.\n\nI\u0027m not entirely happy about how the __cpufreq_governor rule ended up\n(conditional locking rule depending on the argument) but basically all\ncallers pass this as a constant so it\u0027s not too horrible.\n\nThe patch also removes the cpufreq_governor() function since during the\nlocking audit it turned out to be entirely unused (so no need to fix it)\n\nThe patch works on my testbox, but it could use more testing\n(otoh... it can\u0027t be much worse than the current code)\n\nSigned-off-by: Arjan van de Ven \u003carjan@linux.intel.com\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8d328186f774b81cfdd1eabf5c01d244f50115be",
      "old_mode": 33188,
      "old_path": "drivers/cpufreq/cpufreq.c",
      "new_id": "bc1088d9b379a97843c58b050f046b8b0df023f5",
      "new_mode": 33188,
      "new_path": "drivers/cpufreq/cpufreq.c"
    },
    {
      "type": "modify",
      "old_id": "b3ebc8f019753db87d072914b1d699e9f36c85eb",
      "old_mode": 33188,
      "old_path": "drivers/cpufreq/cpufreq_conservative.c",
      "new_id": "c4c578defabfa0e5df0251d430fde58fee7d45ab",
      "new_mode": 33188,
      "new_path": "drivers/cpufreq/cpufreq_conservative.c"
    },
    {
      "type": "modify",
      "old_id": "178f0c547eb7ac928fcdce0d0f0edd3da73c4c70",
      "old_mode": 33188,
      "old_path": "drivers/cpufreq/cpufreq_ondemand.c",
      "new_id": "52cf1f02182591f64f527144e1e3a1394ee9a050",
      "new_mode": 33188,
      "new_path": "drivers/cpufreq/cpufreq_ondemand.c"
    },
    {
      "type": "modify",
      "old_id": "44ae5e5b94cf4a30f4d1ab18287f72ec28caadb1",
      "old_mode": 33188,
      "old_path": "drivers/cpufreq/cpufreq_userspace.c",
      "new_id": "a06c204589cdf7c9f8e0e68e38c337f1535ace66",
      "new_mode": 33188,
      "new_path": "drivers/cpufreq/cpufreq_userspace.c"
    },
    {
      "type": "modify",
      "old_id": "35e137636b0b4c6dc44cdfc04ef53ec787ffadfd",
      "old_mode": 33188,
      "old_path": "include/linux/cpufreq.h",
      "new_id": "4ea39fee99c7938e4bd9dfec951773b025ada1a7",
      "new_mode": 33188,
      "new_path": "include/linux/cpufreq.h"
    }
  ]
}
