diff options
Diffstat (limited to 'kernel/itimer.c')
| -rw-r--r-- | kernel/itimer.c | 33 |
1 files changed, 10 insertions, 23 deletions
diff --git a/kernel/itimer.c b/kernel/itimer.c index ab982747d9bd..db7c358b9a02 100644 --- a/kernel/itimer.c +++ b/kernel/itimer.c | |||
| @@ -55,17 +55,15 @@ int do_getitimer(int which, struct itimerval *value) | |||
| 55 | spin_unlock_irq(&tsk->sighand->siglock); | 55 | spin_unlock_irq(&tsk->sighand->siglock); |
| 56 | break; | 56 | break; |
| 57 | case ITIMER_VIRTUAL: | 57 | case ITIMER_VIRTUAL: |
| 58 | read_lock(&tasklist_lock); | ||
| 59 | spin_lock_irq(&tsk->sighand->siglock); | 58 | spin_lock_irq(&tsk->sighand->siglock); |
| 60 | cval = tsk->signal->it_virt_expires; | 59 | cval = tsk->signal->it_virt_expires; |
| 61 | cinterval = tsk->signal->it_virt_incr; | 60 | cinterval = tsk->signal->it_virt_incr; |
| 62 | if (!cputime_eq(cval, cputime_zero)) { | 61 | if (!cputime_eq(cval, cputime_zero)) { |
| 63 | struct task_struct *t = tsk; | 62 | struct task_cputime cputime; |
| 64 | cputime_t utime = tsk->signal->utime; | 63 | cputime_t utime; |
| 65 | do { | 64 | |
| 66 | utime = cputime_add(utime, t->utime); | 65 | thread_group_cputime(tsk, &cputime); |
| 67 | t = next_thread(t); | 66 | utime = cputime.utime; |
| 68 | } while (t != tsk); | ||
| 69 | if (cputime_le(cval, utime)) { /* about to fire */ | 67 | if (cputime_le(cval, utime)) { /* about to fire */ |
| 70 | cval = jiffies_to_cputime(1); | 68 | cval = jiffies_to_cputime(1); |
| 71 | } else { | 69 | } else { |
| @@ -73,25 +71,19 @@ int do_getitimer(int which, struct itimerval *value) | |||
| 73 | } | 71 | } |
| 74 | } | 72 | } |
| 75 | spin_unlock_irq(&tsk->sighand->siglock); | 73 | spin_unlock_irq(&tsk->sighand->siglock); |
| 76 | read_unlock(&tasklist_lock); | ||
| 77 | cputime_to_timeval(cval, &value->it_value); | 74 | cputime_to_timeval(cval, &value->it_value); |
| 78 | cputime_to_timeval(cinterval, &value->it_interval); | 75 | cputime_to_timeval(cinterval, &value->it_interval); |
| 79 | break; | 76 | break; |
| 80 | case ITIMER_PROF: | 77 | case ITIMER_PROF: |
| 81 | read_lock(&tasklist_lock); | ||
| 82 | spin_lock_irq(&tsk->sighand->siglock); | 78 | spin_lock_irq(&tsk->sighand->siglock); |
| 83 | cval = tsk->signal->it_prof_expires; | 79 | cval = tsk->signal->it_prof_expires; |
| 84 | cinterval = tsk->signal->it_prof_incr; | 80 | cinterval = tsk->signal->it_prof_incr; |
| 85 | if (!cputime_eq(cval, cputime_zero)) { | 81 | if (!cputime_eq(cval, cputime_zero)) { |
| 86 | struct task_struct *t = tsk; | 82 | struct task_cputime times; |
| 87 | cputime_t ptime = cputime_add(tsk->signal->utime, | 83 | cputime_t ptime; |
| 88 | tsk->signal->stime); | 84 | |
| 89 | do { | 85 | thread_group_cputime(tsk, ×); |
| 90 | ptime = cputime_add(ptime, | 86 | ptime = cputime_add(times.utime, times.stime); |
| 91 | cputime_add(t->utime, | ||
| 92 | t->stime)); | ||
| 93 | t = next_thread(t); | ||
| 94 | } while (t != tsk); | ||
| 95 | if (cputime_le(cval, ptime)) { /* about to fire */ | 87 | if (cputime_le(cval, ptime)) { /* about to fire */ |
| 96 | cval = jiffies_to_cputime(1); | 88 | cval = jiffies_to_cputime(1); |
| 97 | } else { | 89 | } else { |
| @@ -99,7 +91,6 @@ int do_getitimer(int which, struct itimerval *value) | |||
| 99 | } | 91 | } |
| 100 | } | 92 | } |
| 101 | spin_unlock_irq(&tsk->sighand->siglock); | 93 | spin_unlock_irq(&tsk->sighand->siglock); |
| 102 | read_unlock(&tasklist_lock); | ||
| 103 | cputime_to_timeval(cval, &value->it_value); | 94 | cputime_to_timeval(cval, &value->it_value); |
| 104 | cputime_to_timeval(cinterval, &value->it_interval); | 95 | cputime_to_timeval(cinterval, &value->it_interval); |
| 105 | break; | 96 | break; |
| @@ -185,7 +176,6 @@ again: | |||
| 185 | case ITIMER_VIRTUAL: | 176 | case ITIMER_VIRTUAL: |
| 186 | nval = timeval_to_cputime(&value->it_value); | 177 | nval = timeval_to_cputime(&value->it_value); |
| 187 | ninterval = timeval_to_cputime(&value->it_interval); | 178 | ninterval = timeval_to_cputime(&value->it_interval); |
| 188 | read_lock(&tasklist_lock); | ||
| 189 | spin_lock_irq(&tsk->sighand->siglock); | 179 | spin_lock_irq(&tsk->sighand->siglock); |
| 190 | cval = tsk->signal->it_virt_expires; | 180 | cval = tsk->signal->it_virt_expires; |
| 191 | cinterval = tsk->signal->it_virt_incr; | 181 | cinterval = tsk->signal->it_virt_incr; |
| @@ -200,7 +190,6 @@ again: | |||
| 200 | tsk->signal->it_virt_expires = nval; | 190 | tsk->signal->it_virt_expires = nval; |
| 201 | tsk->signal->it_virt_incr = ninterval; | 191 | tsk->signal->it_virt_incr = ninterval; |
| 202 | spin_unlock_irq(&tsk->sighand->siglock); | 192 | spin_unlock_irq(&tsk->sighand->siglock); |
| 203 | read_unlock(&tasklist_lock); | ||
| 204 | if (ovalue) { | 193 | if (ovalue) { |
| 205 | cputime_to_timeval(cval, &ovalue->it_value); | 194 | cputime_to_timeval(cval, &ovalue->it_value); |
| 206 | cputime_to_timeval(cinterval, &ovalue->it_interval); | 195 | cputime_to_timeval(cinterval, &ovalue->it_interval); |
| @@ -209,7 +198,6 @@ again: | |||
| 209 | case ITIMER_PROF: | 198 | case ITIMER_PROF: |
| 210 | nval = timeval_to_cputime(&value->it_value); | 199 | nval = timeval_to_cputime(&value->it_value); |
| 211 | ninterval = timeval_to_cputime(&value->it_interval); | 200 | ninterval = timeval_to_cputime(&value->it_interval); |
| 212 | read_lock(&tasklist_lock); | ||
| 213 | spin_lock_irq(&tsk->sighand->siglock); | 201 | spin_lock_irq(&tsk->sighand->siglock); |
| 214 | cval = tsk->signal->it_prof_expires; | 202 | cval = tsk->signal->it_prof_expires; |
| 215 | cinterval = tsk->signal->it_prof_incr; | 203 | cinterval = tsk->signal->it_prof_incr; |
| @@ -224,7 +212,6 @@ again: | |||
| 224 | tsk->signal->it_prof_expires = nval; | 212 | tsk->signal->it_prof_expires = nval; |
| 225 | tsk->signal->it_prof_incr = ninterval; | 213 | tsk->signal->it_prof_incr = ninterval; |
| 226 | spin_unlock_irq(&tsk->sighand->siglock); | 214 | spin_unlock_irq(&tsk->sighand->siglock); |
| 227 | read_unlock(&tasklist_lock); | ||
| 228 | if (ovalue) { | 215 | if (ovalue) { |
| 229 | cputime_to_timeval(cval, &ovalue->it_value); | 216 | cputime_to_timeval(cval, &ovalue->it_value); |
| 230 | cputime_to_timeval(cinterval, &ovalue->it_interval); | 217 | cputime_to_timeval(cinterval, &ovalue->it_interval); |
