)]}'
{
  "commit": "0729e196147692d84d4c099fcff056eba2ed61d8",
  "tree": "5374dc5cd1cb2cfb3da1174b67ed07685592e83a",
  "parents": [
    "d8d88fbb186fe3ea37b2a58adb32413c98b59656"
  ],
  "author": {
    "name": "Darren Hart",
    "email": "dvhltc@us.ibm.com",
    "time": "Mon Sep 21 22:30:38 2009 -0700"
  },
  "committer": {
    "name": "Ingo Molnar",
    "email": "mingo@elte.hu",
    "time": "Tue Sep 22 10:37:44 2009 +0200"
  },
  "message": "futex: Fix wakeup race by setting TASK_INTERRUPTIBLE before queue_me()\n\nPI futexes do not use the same plist_node_empty() test for wakeup.\nIt was possible for the waiter (in futex_wait_requeue_pi()) to set\nTASK_INTERRUPTIBLE after the waker assigned the rtmutex to the\nwaiter. The waiter would then note the plist was not empty and call\nschedule(). The task would not be found by any subsequeuent futex\nwakeups, resulting in a userspace hang.\n\nBy moving the setting of TASK_INTERRUPTIBLE to before the call to\nqueue_me(), the race with the waker is eliminated. Since we no\nlonger call get_user() from within queue_me(), there is no need to\ndelay the setting of TASK_INTERRUPTIBLE until after the call to\nqueue_me().\n\nThe FUTEX_LOCK_PI operation is not affected as futex_lock_pi()\nrelies entirely on the rtmutex code to handle schedule() and\nwakeup.  The requeue PI code is affected because the waiter starts\nas a non-PI waiter and is woken on a PI futex.\n\nRemove the crusty old comment about holding spinlocks() across\nget_user() as we no longer do that. Correct the locking statement\nwith a description of why the test is performed.\n\nSigned-off-by: Darren Hart \u003cdvhltc@us.ibm.com\u003e\nAcked-by: Peter Zijlstra \u003cpeterz@infradead.org\u003e\nCc: Steven Rostedt \u003crostedt@goodmis.org\u003e\nCc: Eric Dumazet \u003ceric.dumazet@gmail.com\u003e\nCc: Dinakar Guniguntala \u003cdino@in.ibm.com\u003e\nCc: John Stultz \u003cjohnstul@us.ibm.com\u003e\nLKML-Reference: \u003c20090922053038.8717.97838.stgit@Aeon\u003e\nSigned-off-by: Ingo Molnar \u003cmingo@elte.hu\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f92afbe3d3a14c1cd3e867013c67203c21e226a1",
      "old_mode": 33188,
      "old_path": "kernel/futex.c",
      "new_id": "463af2efa5125945ad344c1dd2931ab026431a4b",
      "new_mode": 33188,
      "new_path": "kernel/futex.c"
    }
  ]
}
