diff options
| author | Steve French <sfrench@us.ibm.com> | 2006-03-20 11:58:09 -0500 |
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2006-03-20 11:58:09 -0500 |
| commit | fd4a0b92db6a57cba8d03efbe1cebf91f9124ce0 (patch) | |
| tree | 5886a08bfa1132058b06074f4666a36dc5ddd2a1 /kernel | |
| parent | 88274815f7477dc7550439413ab87c5ce4c5a623 (diff) | |
| parent | 7705a8792b0fc82fd7d4dd923724606bbfd9fb20 (diff) | |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/fork.c | 16 | ||||
| -rw-r--r-- | kernel/posix-timers.c | 1 | ||||
| -rw-r--r-- | kernel/rcupdate.c | 76 | ||||
| -rw-r--r-- | kernel/sched.c | 8 | ||||
| -rw-r--r-- | kernel/sysctl.c | 5 | ||||
| -rw-r--r-- | kernel/timer.c | 4 |
6 files changed, 77 insertions, 33 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index fbea12d7a943..b373322ca497 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -108,8 +108,10 @@ void free_task(struct task_struct *tsk) | |||
| 108 | } | 108 | } |
| 109 | EXPORT_SYMBOL(free_task); | 109 | EXPORT_SYMBOL(free_task); |
| 110 | 110 | ||
| 111 | void __put_task_struct(struct task_struct *tsk) | 111 | void __put_task_struct_cb(struct rcu_head *rhp) |
| 112 | { | 112 | { |
| 113 | struct task_struct *tsk = container_of(rhp, struct task_struct, rcu); | ||
| 114 | |||
| 113 | WARN_ON(!(tsk->exit_state & (EXIT_DEAD | EXIT_ZOMBIE))); | 115 | WARN_ON(!(tsk->exit_state & (EXIT_DEAD | EXIT_ZOMBIE))); |
| 114 | WARN_ON(atomic_read(&tsk->usage)); | 116 | WARN_ON(atomic_read(&tsk->usage)); |
| 115 | WARN_ON(tsk == current); | 117 | WARN_ON(tsk == current); |
| @@ -1060,6 +1062,12 @@ static task_t *copy_process(unsigned long clone_flags, | |||
| 1060 | p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr: NULL; | 1062 | p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr: NULL; |
| 1061 | 1063 | ||
| 1062 | /* | 1064 | /* |
| 1065 | * sigaltstack should be cleared when sharing the same VM | ||
| 1066 | */ | ||
| 1067 | if ((clone_flags & (CLONE_VM|CLONE_VFORK)) == CLONE_VM) | ||
| 1068 | p->sas_ss_sp = p->sas_ss_size = 0; | ||
| 1069 | |||
| 1070 | /* | ||
| 1063 | * Syscall tracing should be turned off in the child regardless | 1071 | * Syscall tracing should be turned off in the child regardless |
| 1064 | * of CLONE_PTRACE. | 1072 | * of CLONE_PTRACE. |
| 1065 | */ | 1073 | */ |
| @@ -1470,9 +1478,7 @@ static int unshare_vm(unsigned long unshare_flags, struct mm_struct **new_mmp) | |||
| 1470 | 1478 | ||
| 1471 | if ((unshare_flags & CLONE_VM) && | 1479 | if ((unshare_flags & CLONE_VM) && |
| 1472 | (mm && atomic_read(&mm->mm_users) > 1)) { | 1480 | (mm && atomic_read(&mm->mm_users) > 1)) { |
| 1473 | *new_mmp = dup_mm(current); | 1481 | return -EINVAL; |
| 1474 | if (!*new_mmp) | ||
| 1475 | return -ENOMEM; | ||
| 1476 | } | 1482 | } |
| 1477 | 1483 | ||
| 1478 | return 0; | 1484 | return 0; |
| @@ -1561,7 +1567,7 @@ asmlinkage long sys_unshare(unsigned long unshare_flags) | |||
| 1561 | 1567 | ||
| 1562 | if (new_sigh) { | 1568 | if (new_sigh) { |
| 1563 | sigh = current->sighand; | 1569 | sigh = current->sighand; |
| 1564 | current->sighand = new_sigh; | 1570 | rcu_assign_pointer(current->sighand, new_sigh); |
| 1565 | new_sigh = sigh; | 1571 | new_sigh = sigh; |
| 1566 | } | 1572 | } |
| 1567 | 1573 | ||
diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c index 216f574b5ffb..fa895fc2ecf5 100644 --- a/kernel/posix-timers.c +++ b/kernel/posix-timers.c | |||
| @@ -353,6 +353,7 @@ static int posix_timer_fn(void *data) | |||
| 353 | hrtimer_forward(&timr->it.real.timer, | 353 | hrtimer_forward(&timr->it.real.timer, |
| 354 | timr->it.real.interval); | 354 | timr->it.real.interval); |
| 355 | ret = HRTIMER_RESTART; | 355 | ret = HRTIMER_RESTART; |
| 356 | ++timr->it_requeue_pending; | ||
| 356 | } | 357 | } |
| 357 | } | 358 | } |
| 358 | 359 | ||
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index 0cf8146bd585..8cf15a569fcd 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
| @@ -67,7 +67,43 @@ DEFINE_PER_CPU(struct rcu_data, rcu_bh_data) = { 0L }; | |||
| 67 | 67 | ||
| 68 | /* Fake initialization required by compiler */ | 68 | /* Fake initialization required by compiler */ |
| 69 | static DEFINE_PER_CPU(struct tasklet_struct, rcu_tasklet) = {NULL}; | 69 | static DEFINE_PER_CPU(struct tasklet_struct, rcu_tasklet) = {NULL}; |
| 70 | static int maxbatch = 10000; | 70 | static int blimit = 10; |
| 71 | static int qhimark = 10000; | ||
| 72 | static int qlowmark = 100; | ||
| 73 | #ifdef CONFIG_SMP | ||
| 74 | static int rsinterval = 1000; | ||
| 75 | #endif | ||
| 76 | |||
| 77 | static atomic_t rcu_barrier_cpu_count; | ||
| 78 | static struct semaphore rcu_barrier_sema; | ||
| 79 | static struct completion rcu_barrier_completion; | ||
| 80 | |||
| 81 | #ifdef CONFIG_SMP | ||
| 82 | static void force_quiescent_state(struct rcu_data *rdp, | ||
| 83 | struct rcu_ctrlblk *rcp) | ||
| 84 | { | ||
| 85 | int cpu; | ||
| 86 | cpumask_t cpumask; | ||
| 87 | set_need_resched(); | ||
| 88 | if (unlikely(rdp->qlen - rdp->last_rs_qlen > rsinterval)) { | ||
| 89 | rdp->last_rs_qlen = rdp->qlen; | ||
| 90 | /* | ||
| 91 | * Don't send IPI to itself. With irqs disabled, | ||
| 92 | * rdp->cpu is the current cpu. | ||
| 93 | */ | ||
| 94 | cpumask = rcp->cpumask; | ||
| 95 | cpu_clear(rdp->cpu, cpumask); | ||
| 96 | for_each_cpu_mask(cpu, cpumask) | ||
| 97 | smp_send_reschedule(cpu); | ||
| 98 | } | ||
| 99 | } | ||
| 100 | #else | ||
| 101 | static inline void force_quiescent_state(struct rcu_data *rdp, | ||
| 102 | struct rcu_ctrlblk *rcp) | ||
| 103 | { | ||
| 104 | set_need_resched(); | ||
| 105 | } | ||
| 106 | #endif | ||
| 71 | 107 | ||
| 72 | /** | 108 | /** |
| 73 | * call_rcu - Queue an RCU callback for invocation after a grace period. | 109 | * call_rcu - Queue an RCU callback for invocation after a grace period. |
| @@ -92,17 +128,13 @@ void fastcall call_rcu(struct rcu_head *head, | |||
| 92 | rdp = &__get_cpu_var(rcu_data); | 128 | rdp = &__get_cpu_var(rcu_data); |
| 93 | *rdp->nxttail = head; | 129 | *rdp->nxttail = head; |
| 94 | rdp->nxttail = &head->next; | 130 | rdp->nxttail = &head->next; |
| 95 | 131 | if (unlikely(++rdp->qlen > qhimark)) { | |
| 96 | if (unlikely(++rdp->count > 10000)) | 132 | rdp->blimit = INT_MAX; |
| 97 | set_need_resched(); | 133 | force_quiescent_state(rdp, &rcu_ctrlblk); |
| 98 | 134 | } | |
| 99 | local_irq_restore(flags); | 135 | local_irq_restore(flags); |
| 100 | } | 136 | } |
| 101 | 137 | ||
| 102 | static atomic_t rcu_barrier_cpu_count; | ||
| 103 | static struct semaphore rcu_barrier_sema; | ||
| 104 | static struct completion rcu_barrier_completion; | ||
| 105 | |||
| 106 | /** | 138 | /** |
| 107 | * call_rcu_bh - Queue an RCU for invocation after a quicker grace period. | 139 | * call_rcu_bh - Queue an RCU for invocation after a quicker grace period. |
| 108 | * @head: structure to be used for queueing the RCU updates. | 140 | * @head: structure to be used for queueing the RCU updates. |
| @@ -131,12 +163,12 @@ void fastcall call_rcu_bh(struct rcu_head *head, | |||
| 131 | rdp = &__get_cpu_var(rcu_bh_data); | 163 | rdp = &__get_cpu_var(rcu_bh_data); |
| 132 | *rdp->nxttail = head; | 164 | *rdp->nxttail = head; |
| 133 | rdp->nxttail = &head->next; | 165 | rdp->nxttail = &head->next; |
| 134 | rdp->count++; | 166 | |
| 135 | /* | 167 | if (unlikely(++rdp->qlen > qhimark)) { |
| 136 | * Should we directly call rcu_do_batch() here ? | 168 | rdp->blimit = INT_MAX; |
| 137 | * if (unlikely(rdp->count > 10000)) | 169 | force_quiescent_state(rdp, &rcu_bh_ctrlblk); |
| 138 | * rcu_do_batch(rdp); | 170 | } |
| 139 | */ | 171 | |
| 140 | local_irq_restore(flags); | 172 | local_irq_restore(flags); |
| 141 | } | 173 | } |
| 142 | 174 | ||
| @@ -199,10 +231,12 @@ static void rcu_do_batch(struct rcu_data *rdp) | |||
| 199 | next = rdp->donelist = list->next; | 231 | next = rdp->donelist = list->next; |
| 200 | list->func(list); | 232 | list->func(list); |
| 201 | list = next; | 233 | list = next; |
| 202 | rdp->count--; | 234 | rdp->qlen--; |
| 203 | if (++count >= maxbatch) | 235 | if (++count >= rdp->blimit) |
| 204 | break; | 236 | break; |
| 205 | } | 237 | } |
| 238 | if (rdp->blimit == INT_MAX && rdp->qlen <= qlowmark) | ||
| 239 | rdp->blimit = blimit; | ||
| 206 | if (!rdp->donelist) | 240 | if (!rdp->donelist) |
| 207 | rdp->donetail = &rdp->donelist; | 241 | rdp->donetail = &rdp->donelist; |
| 208 | else | 242 | else |
| @@ -473,6 +507,7 @@ static void rcu_init_percpu_data(int cpu, struct rcu_ctrlblk *rcp, | |||
| 473 | rdp->quiescbatch = rcp->completed; | 507 | rdp->quiescbatch = rcp->completed; |
| 474 | rdp->qs_pending = 0; | 508 | rdp->qs_pending = 0; |
| 475 | rdp->cpu = cpu; | 509 | rdp->cpu = cpu; |
| 510 | rdp->blimit = blimit; | ||
| 476 | } | 511 | } |
| 477 | 512 | ||
| 478 | static void __devinit rcu_online_cpu(int cpu) | 513 | static void __devinit rcu_online_cpu(int cpu) |
| @@ -567,7 +602,12 @@ void synchronize_kernel(void) | |||
| 567 | synchronize_rcu(); | 602 | synchronize_rcu(); |
| 568 | } | 603 | } |
| 569 | 604 | ||
| 570 | module_param(maxbatch, int, 0); | 605 | module_param(blimit, int, 0); |
| 606 | module_param(qhimark, int, 0); | ||
| 607 | module_param(qlowmark, int, 0); | ||
| 608 | #ifdef CONFIG_SMP | ||
| 609 | module_param(rsinterval, int, 0); | ||
| 610 | #endif | ||
| 571 | EXPORT_SYMBOL_GPL(rcu_batches_completed); | 611 | EXPORT_SYMBOL_GPL(rcu_batches_completed); |
| 572 | EXPORT_SYMBOL(call_rcu); /* WARNING: GPL-only in April 2006. */ | 612 | EXPORT_SYMBOL(call_rcu); /* WARNING: GPL-only in April 2006. */ |
| 573 | EXPORT_SYMBOL(call_rcu_bh); /* WARNING: GPL-only in April 2006. */ | 613 | EXPORT_SYMBOL(call_rcu_bh); /* WARNING: GPL-only in April 2006. */ |
diff --git a/kernel/sched.c b/kernel/sched.c index 3454bb869fd0..4d46e90f59c3 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -178,13 +178,6 @@ static unsigned int task_timeslice(task_t *p) | |||
| 178 | #define task_hot(p, now, sd) ((long long) ((now) - (p)->last_ran) \ | 178 | #define task_hot(p, now, sd) ((long long) ((now) - (p)->last_ran) \ |
| 179 | < (long long) (sd)->cache_hot_time) | 179 | < (long long) (sd)->cache_hot_time) |
| 180 | 180 | ||
| 181 | void __put_task_struct_cb(struct rcu_head *rhp) | ||
| 182 | { | ||
| 183 | __put_task_struct(container_of(rhp, struct task_struct, rcu)); | ||
| 184 | } | ||
| 185 | |||
| 186 | EXPORT_SYMBOL_GPL(__put_task_struct_cb); | ||
| 187 | |||
| 188 | /* | 181 | /* |
| 189 | * These are the runqueue data structures: | 182 | * These are the runqueue data structures: |
| 190 | */ | 183 | */ |
| @@ -4335,6 +4328,7 @@ void __devinit init_idle(task_t *idle, int cpu) | |||
| 4335 | runqueue_t *rq = cpu_rq(cpu); | 4328 | runqueue_t *rq = cpu_rq(cpu); |
| 4336 | unsigned long flags; | 4329 | unsigned long flags; |
| 4337 | 4330 | ||
| 4331 | idle->timestamp = sched_clock(); | ||
| 4338 | idle->sleep_avg = 0; | 4332 | idle->sleep_avg = 0; |
| 4339 | idle->array = NULL; | 4333 | idle->array = NULL; |
| 4340 | idle->prio = MAX_PRIO; | 4334 | idle->prio = MAX_PRIO; |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index de2d9109194e..32b48e8ee36e 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -50,6 +50,9 @@ | |||
| 50 | #include <asm/uaccess.h> | 50 | #include <asm/uaccess.h> |
| 51 | #include <asm/processor.h> | 51 | #include <asm/processor.h> |
| 52 | 52 | ||
| 53 | extern int proc_nr_files(ctl_table *table, int write, struct file *filp, | ||
| 54 | void __user *buffer, size_t *lenp, loff_t *ppos); | ||
| 55 | |||
| 53 | #if defined(CONFIG_SYSCTL) | 56 | #if defined(CONFIG_SYSCTL) |
| 54 | 57 | ||
| 55 | /* External variables not in a header file. */ | 58 | /* External variables not in a header file. */ |
| @@ -943,7 +946,7 @@ static ctl_table fs_table[] = { | |||
| 943 | .data = &files_stat, | 946 | .data = &files_stat, |
| 944 | .maxlen = 3*sizeof(int), | 947 | .maxlen = 3*sizeof(int), |
| 945 | .mode = 0444, | 948 | .mode = 0444, |
| 946 | .proc_handler = &proc_dointvec, | 949 | .proc_handler = &proc_nr_files, |
| 947 | }, | 950 | }, |
| 948 | { | 951 | { |
| 949 | .ctl_name = FS_MAXFILE, | 952 | .ctl_name = FS_MAXFILE, |
diff --git a/kernel/timer.c b/kernel/timer.c index bf7c4193b936..2410c18dbeb1 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
| @@ -1354,8 +1354,8 @@ void __init init_timers(void) | |||
| 1354 | 1354 | ||
| 1355 | #ifdef CONFIG_TIME_INTERPOLATION | 1355 | #ifdef CONFIG_TIME_INTERPOLATION |
| 1356 | 1356 | ||
| 1357 | struct time_interpolator *time_interpolator; | 1357 | struct time_interpolator *time_interpolator __read_mostly; |
| 1358 | static struct time_interpolator *time_interpolator_list; | 1358 | static struct time_interpolator *time_interpolator_list __read_mostly; |
| 1359 | static DEFINE_SPINLOCK(time_interpolator_lock); | 1359 | static DEFINE_SPINLOCK(time_interpolator_lock); |
| 1360 | 1360 | ||
| 1361 | static inline u64 time_interpolator_get_cycles(unsigned int src) | 1361 | static inline u64 time_interpolator_get_cycles(unsigned int src) |
