diff options
Diffstat (limited to 'kernel/futex.c')
-rw-r--r-- | kernel/futex.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/kernel/futex.c b/kernel/futex.c index e43945e995f5..98092c9817f4 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -1266,11 +1266,13 @@ static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared, | |||
1266 | if (!abs_time) | 1266 | if (!abs_time) |
1267 | schedule(); | 1267 | schedule(); |
1268 | else { | 1268 | else { |
1269 | hrtimer_init(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); | 1269 | hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, |
1270 | HRTIMER_MODE_ABS); | ||
1270 | hrtimer_init_sleeper(&t, current); | 1271 | hrtimer_init_sleeper(&t, current); |
1271 | t.timer.expires = *abs_time; | 1272 | t.timer.expires = *abs_time; |
1272 | 1273 | ||
1273 | hrtimer_start(&t.timer, t.timer.expires, HRTIMER_MODE_ABS); | 1274 | hrtimer_start(&t.timer, t.timer.expires, |
1275 | HRTIMER_MODE_ABS); | ||
1274 | if (!hrtimer_active(&t.timer)) | 1276 | if (!hrtimer_active(&t.timer)) |
1275 | t.task = NULL; | 1277 | t.task = NULL; |
1276 | 1278 | ||
@@ -1286,6 +1288,8 @@ static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared, | |||
1286 | 1288 | ||
1287 | /* Flag if a timeout occured */ | 1289 | /* Flag if a timeout occured */ |
1288 | rem = (t.task == NULL); | 1290 | rem = (t.task == NULL); |
1291 | |||
1292 | destroy_hrtimer_on_stack(&t.timer); | ||
1289 | } | 1293 | } |
1290 | } | 1294 | } |
1291 | __set_current_state(TASK_RUNNING); | 1295 | __set_current_state(TASK_RUNNING); |
@@ -1367,7 +1371,8 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, | |||
1367 | 1371 | ||
1368 | if (time) { | 1372 | if (time) { |
1369 | to = &timeout; | 1373 | to = &timeout; |
1370 | hrtimer_init(&to->timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); | 1374 | hrtimer_init_on_stack(&to->timer, CLOCK_REALTIME, |
1375 | HRTIMER_MODE_ABS); | ||
1371 | hrtimer_init_sleeper(to, current); | 1376 | hrtimer_init_sleeper(to, current); |
1372 | to->timer.expires = *time; | 1377 | to->timer.expires = *time; |
1373 | } | 1378 | } |
@@ -1581,6 +1586,8 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, | |||
1581 | unqueue_me_pi(&q); | 1586 | unqueue_me_pi(&q); |
1582 | futex_unlock_mm(fshared); | 1587 | futex_unlock_mm(fshared); |
1583 | 1588 | ||
1589 | if (to) | ||
1590 | destroy_hrtimer_on_stack(&to->timer); | ||
1584 | return ret != -EINTR ? ret : -ERESTARTNOINTR; | 1591 | return ret != -EINTR ? ret : -ERESTARTNOINTR; |
1585 | 1592 | ||
1586 | out_unlock_release_sem: | 1593 | out_unlock_release_sem: |
@@ -1588,6 +1595,8 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, | |||
1588 | 1595 | ||
1589 | out_release_sem: | 1596 | out_release_sem: |
1590 | futex_unlock_mm(fshared); | 1597 | futex_unlock_mm(fshared); |
1598 | if (to) | ||
1599 | destroy_hrtimer_on_stack(&to->timer); | ||
1591 | return ret; | 1600 | return ret; |
1592 | 1601 | ||
1593 | uaddr_faulted: | 1602 | uaddr_faulted: |
@@ -1615,6 +1624,8 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, | |||
1615 | if (!ret && (uval != -EFAULT)) | 1624 | if (!ret && (uval != -EFAULT)) |
1616 | goto retry; | 1625 | goto retry; |
1617 | 1626 | ||
1627 | if (to) | ||
1628 | destroy_hrtimer_on_stack(&to->timer); | ||
1618 | return ret; | 1629 | return ret; |
1619 | } | 1630 | } |
1620 | 1631 | ||