)]}'
{
  "commit": "1265057fa02c7bed3b6d9ddc8a2048065a370364",
  "tree": "b10e631ca6157103fcc71188e972b06e18c3570f",
  "parents": [
    "41f63c5359d14ca995172b8f6eaffd93f60fec54"
  ],
  "author": {
    "name": "Tejun Heo",
    "email": "tj@kernel.org",
    "time": "Wed Aug 08 09:38:42 2012 -0700"
  },
  "committer": {
    "name": "Tejun Heo",
    "email": "tj@kernel.org",
    "time": "Mon Aug 13 16:27:55 2012 -0700"
  },
  "message": "workqueue: fix CPU binding of flush_delayed_work[_sync]()\n\ndelayed_work encodes the workqueue to use and the last CPU in\ndelayed_work-\u003ework.data while it\u0027s on timer.  The target CPU is\nimplicitly recorded as the CPU the timer is queued on and\ndelayed_work_timer_fn() queues delayed_work-\u003ework to the CPU it is\nrunning on.\n\nUnfortunately, this leaves flush_delayed_work[_sync]() no way to find\nout which CPU the delayed_work was queued for when they try to\nre-queue after killing the timer.  Currently, it chooses the local CPU\nflush is running on.  This can unexpectedly move a delayed_work queued\non a specific CPU to another CPU and lead to subtle errors.\n\nThere isn\u0027t much point in trying to save several bytes in struct\ndelayed_work, which is already close to a hundred bytes on 64bit with\nall debug options turned off.  This patch adds delayed_work-\u003ecpu to\nremember the CPU it\u0027s queued for.\n\nNote that if the timer is migrated during CPU down, the work item\ncould be queued to the downed global_cwq after this change.  As a\ndetached global_cwq behaves like an unbound one, this doesn\u0027t change\nmuch for the delayed_work.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\nCc: Ingo Molnar \u003cmingo@redhat.com\u003e\nCc: Andrew Morton \u003cakpm@linux-foundation.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "20000305a8a6d8a6e9c5a3a03323723d95618053",
      "old_mode": 33188,
      "old_path": "include/linux/workqueue.h",
      "new_id": "b14d5d59af7cadeb5fb8f255544346b004b44c48",
      "new_mode": 33188,
      "new_path": "include/linux/workqueue.h"
    },
    {
      "type": "modify",
      "old_id": "41ae2c0979fef0c132a592e120d7d32e8efe763f",
      "old_mode": 33188,
      "old_path": "kernel/workqueue.c",
      "new_id": "11723c5b2b2034b2b9fabd87f19238fff432885a",
      "new_mode": 33188,
      "new_path": "kernel/workqueue.c"
    }
  ]
}
