)]}'
{
  "commit": "6ff7041dbfeb3bd7dfe9aa67275c21199ef760d6",
  "tree": "c8897de7ba6c09d51d83557d981ced3da48bba61",
  "parents": [
    "7e0c5086c172ecf8b0c2ad860b02a586967d17d0"
  ],
  "author": {
    "name": "Thomas Gleixner",
    "email": "tglx@linutronix.de",
    "time": "Fri Jul 10 14:57:05 2009 +0200"
  },
  "committer": {
    "name": "Thomas Gleixner",
    "email": "tglx@linutronix.de",
    "time": "Fri Jul 10 17:32:55 2009 +0200"
  },
  "message": "hrtimer: Fix migration expiry check\n\nThe timer migration expiry check should prevent the migration of a\ntimer to another CPU when the timer expires before the next event is\nscheduled on the other CPU. Migrating the timer might delay it because\nwe can not reprogram the clock event device on the other CPU. But the\ncode implementing that check has two flaws:\n\n- for !HIGHRES the check compares the expiry value with the clock\n  events device expiry value which is wrong for CLOCK_REALTIME based\n  timers.\n\n- the check is racy. It holds the hrtimer base lock of the target CPU,\n  but the clock event device expiry value can be modified\n  nevertheless, e.g. by an timer interrupt firing.\n\nThe !HIGHRES case is easy to fix as we can enqueue the timer on the\ncpu which was selected by the load balancer. It runs the idle\nbalancing code once per jiffy anyway. So the maximum delay for the\ntimer is the same as when we keep the tick on the current cpu going.\n\nIn the HIGHRES case we can get the next expiry value from the hrtimer\ncpu_base of the target CPU and serialize the update with the cpu_base\nlock. This moves the lock section in hrtimer_interrupt() so we can set\nnext_event to KTIME_MAX while we are handling the expired timers and\nset it to the next expiry value after we handled the timers under the\nbase lock. While the expired timers are processed timer migration is\nblocked because the expiry time of the timer is always \u003c\u003d KTIME_MAX.\n\nAlso remove the now useless clockevents_get_next_event() function.\n\nSigned-off-by: Thomas Gleixner \u003ctglx@linutronix.de\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "20a100fe2b4f3040554f3994706d8f7b238460af",
      "old_mode": 33188,
      "old_path": "include/linux/clockchips.h",
      "new_id": "3a1dbba4d3ae2da500e710387d130cd8ad5dd4c2",
      "new_mode": 33188,
      "new_path": "include/linux/clockchips.h"
    },
    {
      "type": "modify",
      "old_id": "126b9808f28793596eee3202273ac742b59b3633",
      "old_mode": 33188,
      "old_path": "kernel/hrtimer.c",
      "new_id": "49da79ab8486df682bc7f252674b4a01b810c108",
      "new_mode": 33188,
      "new_path": "kernel/hrtimer.c"
    },
    {
      "type": "modify",
      "old_id": "1ad6dd46111920d10c5d83f2f90c1aeeb81ca66d",
      "old_mode": 33188,
      "old_path": "kernel/time/clockevents.c",
      "new_id": "a6dcd67b041d200fc61f2b2de06890e8a5c65443",
      "new_mode": 33188,
      "new_path": "kernel/time/clockevents.c"
    }
  ]
}
