)]}'
{
  "commit": "453a3639d1640640c70f70aca214f34d33811b33",
  "tree": "19c6f3f34430d43a4952577aebc97eeb5a466eea",
  "parents": [
    "c588d36691320f3b3124ef2a2ab0e1e5cca0d291"
  ],
  "author": {
    "name": "Tejun Heo",
    "email": "tj@kernel.org",
    "time": "Wed Aug 08 09:34:38 2012 -0700"
  },
  "committer": {
    "name": "Tejun Heo",
    "email": "tj@kernel.org",
    "time": "Wed Aug 08 09:34:38 2012 -0700"
  },
  "message": "timer: implement TIMER_IRQSAFE\n\nTimer internals are protected with irq-safe locks but timer execution\nisn\u0027t, so a timer being dequeued for execution and its execution\naren\u0027t atomic against IRQs.  This makes it impossible to wait for its\ncompletion from IRQ handlers and difficult to shoot down a timer from\nIRQ handlers.\n\nThis issue caused some issues for delayed_work interface.  Because\nthere\u0027s no way to reliably shoot down delayed_work-\u003etimer from IRQ\nhandlers, __cancel_delayed_work() can\u0027t share the logic to steal the\ntarget delayed_work with cancel_delayed_work_sync(), and can only\nsteal delayed_works which are on queued on timer.  Similarly, the\npending mod_delayed_work() can\u0027t be used from IRQ handlers.\n\nThis patch adds a new timer flag TIMER_IRQSAFE, which makes the timer\nto be executed without enabling IRQ after dequeueing such that its\ndequeueing and execution are atomic against IRQ handlers.\n\nThis makes it safe to wait for the timer\u0027s completion from IRQ\nhandlers, for example, using del_timer_sync().  It can never be\nexecuting on the local CPU and if executing on other CPUs it won\u0027t be\ninterrupted until done.\n\nThis will enable simplifying delayed_work cancel/mod interface.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "3f95c1fa615ee7571e7c03ec3160eb01386f7b77",
      "old_mode": 33188,
      "old_path": "include/linux/timer.h",
      "new_id": "726192e416e4e33cb36477a9e58de9c09f429984",
      "new_mode": 33188,
      "new_path": "include/linux/timer.h"
    },
    {
      "type": "modify",
      "old_id": "8d185a1677ccfd6c5275e9636ab34a2015db9ade",
      "old_mode": 33188,
      "old_path": "kernel/timer.c",
      "new_id": "706fe4c53e82ba953ea6c54f4cd22c8ef03781cb",
      "new_mode": 33188,
      "new_path": "kernel/timer.c"
    }
  ]
}
