diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kprobes.c | 15 | ||||
| -rw-r--r-- | kernel/sched.c | 22 |
2 files changed, 23 insertions, 14 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 1e0250cb9486..d4998f81e229 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
| @@ -699,8 +699,9 @@ static int __register_kprobes(struct kprobe **kps, int num, | |||
| 699 | return -EINVAL; | 699 | return -EINVAL; |
| 700 | for (i = 0; i < num; i++) { | 700 | for (i = 0; i < num; i++) { |
| 701 | ret = __register_kprobe(kps[i], called_from); | 701 | ret = __register_kprobe(kps[i], called_from); |
| 702 | if (ret < 0 && i > 0) { | 702 | if (ret < 0) { |
| 703 | unregister_kprobes(kps, i); | 703 | if (i > 0) |
| 704 | unregister_kprobes(kps, i); | ||
| 704 | break; | 705 | break; |
| 705 | } | 706 | } |
| 706 | } | 707 | } |
| @@ -776,8 +777,9 @@ static int __register_jprobes(struct jprobe **jps, int num, | |||
| 776 | jp->kp.break_handler = longjmp_break_handler; | 777 | jp->kp.break_handler = longjmp_break_handler; |
| 777 | ret = __register_kprobe(&jp->kp, called_from); | 778 | ret = __register_kprobe(&jp->kp, called_from); |
| 778 | } | 779 | } |
| 779 | if (ret < 0 && i > 0) { | 780 | if (ret < 0) { |
| 780 | unregister_jprobes(jps, i); | 781 | if (i > 0) |
| 782 | unregister_jprobes(jps, i); | ||
| 781 | break; | 783 | break; |
| 782 | } | 784 | } |
| 783 | } | 785 | } |
| @@ -920,8 +922,9 @@ static int __register_kretprobes(struct kretprobe **rps, int num, | |||
| 920 | return -EINVAL; | 922 | return -EINVAL; |
| 921 | for (i = 0; i < num; i++) { | 923 | for (i = 0; i < num; i++) { |
| 922 | ret = __register_kretprobe(rps[i], called_from); | 924 | ret = __register_kretprobe(rps[i], called_from); |
| 923 | if (ret < 0 && i > 0) { | 925 | if (ret < 0) { |
| 924 | unregister_kretprobes(rps, i); | 926 | if (i > 0) |
| 927 | unregister_kretprobes(rps, i); | ||
| 925 | break; | 928 | break; |
| 926 | } | 929 | } |
| 927 | } | 930 | } |
diff --git a/kernel/sched.c b/kernel/sched.c index bfb8ad8ed171..eaf6751e7612 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -312,12 +312,15 @@ static DEFINE_SPINLOCK(task_group_lock); | |||
| 312 | #endif | 312 | #endif |
| 313 | 313 | ||
| 314 | /* | 314 | /* |
| 315 | * A weight of 0, 1 or ULONG_MAX can cause arithmetics problems. | 315 | * A weight of 0 or 1 can cause arithmetics problems. |
| 316 | * A weight of a cfs_rq is the sum of weights of which entities | ||
| 317 | * are queued on this cfs_rq, so a weight of a entity should not be | ||
| 318 | * too large, so as the shares value of a task group. | ||
| 316 | * (The default weight is 1024 - so there's no practical | 319 | * (The default weight is 1024 - so there's no practical |
| 317 | * limitation from this.) | 320 | * limitation from this.) |
| 318 | */ | 321 | */ |
| 319 | #define MIN_SHARES 2 | 322 | #define MIN_SHARES 2 |
| 320 | #define MAX_SHARES (ULONG_MAX - 1) | 323 | #define MAX_SHARES (1UL << 18) |
| 321 | 324 | ||
| 322 | static int init_task_group_load = INIT_TASK_GROUP_LOAD; | 325 | static int init_task_group_load = INIT_TASK_GROUP_LOAD; |
| 323 | #endif | 326 | #endif |
| @@ -1337,8 +1340,13 @@ calc_delta_mine(unsigned long delta_exec, unsigned long weight, | |||
| 1337 | { | 1340 | { |
| 1338 | u64 tmp; | 1341 | u64 tmp; |
| 1339 | 1342 | ||
| 1340 | if (!lw->inv_weight) | 1343 | if (!lw->inv_weight) { |
| 1341 | lw->inv_weight = 1 + (WMULT_CONST-lw->weight/2)/(lw->weight+1); | 1344 | if (BITS_PER_LONG > 32 && unlikely(lw->weight >= WMULT_CONST)) |
| 1345 | lw->inv_weight = 1; | ||
| 1346 | else | ||
| 1347 | lw->inv_weight = 1 + (WMULT_CONST-lw->weight/2) | ||
| 1348 | / (lw->weight+1); | ||
| 1349 | } | ||
| 1342 | 1350 | ||
| 1343 | tmp = (u64)delta_exec * weight; | 1351 | tmp = (u64)delta_exec * weight; |
| 1344 | /* | 1352 | /* |
| @@ -4159,12 +4167,10 @@ need_resched_nonpreemptible: | |||
| 4159 | clear_tsk_need_resched(prev); | 4167 | clear_tsk_need_resched(prev); |
| 4160 | 4168 | ||
| 4161 | if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) { | 4169 | if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) { |
| 4162 | if (unlikely((prev->state & TASK_INTERRUPTIBLE) && | 4170 | if (unlikely(signal_pending_state(prev->state, prev))) |
| 4163 | signal_pending(prev))) { | ||
| 4164 | prev->state = TASK_RUNNING; | 4171 | prev->state = TASK_RUNNING; |
| 4165 | } else { | 4172 | else |
| 4166 | deactivate_task(rq, prev, 1); | 4173 | deactivate_task(rq, prev, 1); |
| 4167 | } | ||
| 4168 | switch_count = &prev->nvcsw; | 4174 | switch_count = &prev->nvcsw; |
| 4169 | } | 4175 | } |
| 4170 | 4176 | ||
