Commit 422a2534 authored by Linus Torvalds's avatar Linus Torvalds

Merge branches 'core-fixes-for-linus', 'irq-fixes-for-linus' and...

Merge branches 'core-fixes-for-linus', 'irq-fixes-for-linus' and 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  printk: fix wrong format string iter for printk
  futex: comment requeue key reference semantics

* 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  irq: fix cpumask memory leak on offstack cpumask kernels

* 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  posix-timers: fix RLIMIT_CPU && setitimer(CPUCLOCK_PROF)
  posix-timers: fix RLIMIT_CPU && fork()
  timers: add missing kernel-doc
...@@ -487,6 +487,16 @@ static inline void init_copy_desc_masks(struct irq_desc *old_desc, ...@@ -487,6 +487,16 @@ static inline void init_copy_desc_masks(struct irq_desc *old_desc,
#endif #endif
} }
static inline void free_desc_masks(struct irq_desc *old_desc,
struct irq_desc *new_desc)
{
free_cpumask_var(old_desc->affinity);
#ifdef CONFIG_GENERIC_PENDING_IRQ
free_cpumask_var(old_desc->pending_mask);
#endif
}
#else /* !CONFIG_SMP */ #else /* !CONFIG_SMP */
static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu, static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu,
...@@ -500,6 +510,10 @@ static inline void init_copy_desc_masks(struct irq_desc *old_desc, ...@@ -500,6 +510,10 @@ static inline void init_copy_desc_masks(struct irq_desc *old_desc,
{ {
} }
static inline void free_desc_masks(struct irq_desc *old_desc,
struct irq_desc *new_desc)
{
}
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
#endif /* _LINUX_IRQ_H */ #endif /* _LINUX_IRQ_H */
...@@ -800,6 +800,12 @@ static void posix_cpu_timers_init_group(struct signal_struct *sig) ...@@ -800,6 +800,12 @@ static void posix_cpu_timers_init_group(struct signal_struct *sig)
sig->cputime_expires.virt_exp = cputime_zero; sig->cputime_expires.virt_exp = cputime_zero;
sig->cputime_expires.sched_exp = 0; sig->cputime_expires.sched_exp = 0;
if (sig->rlim[RLIMIT_CPU].rlim_cur != RLIM_INFINITY) {
sig->cputime_expires.prof_exp =
secs_to_cputime(sig->rlim[RLIMIT_CPU].rlim_cur);
sig->cputimer.running = 1;
}
/* The timer lists. */ /* The timer lists. */
INIT_LIST_HEAD(&sig->cpu_timers[0]); INIT_LIST_HEAD(&sig->cpu_timers[0]);
INIT_LIST_HEAD(&sig->cpu_timers[1]); INIT_LIST_HEAD(&sig->cpu_timers[1]);
...@@ -815,11 +821,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) ...@@ -815,11 +821,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
atomic_inc(&current->signal->live); atomic_inc(&current->signal->live);
return 0; return 0;
} }
sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);
if (sig)
posix_cpu_timers_init_group(sig);
sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);
tsk->signal = sig; tsk->signal = sig;
if (!sig) if (!sig)
return -ENOMEM; return -ENOMEM;
...@@ -859,6 +862,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk) ...@@ -859,6 +862,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
memcpy(sig->rlim, current->signal->rlim, sizeof sig->rlim); memcpy(sig->rlim, current->signal->rlim, sizeof sig->rlim);
task_unlock(current->group_leader); task_unlock(current->group_leader);
posix_cpu_timers_init_group(sig);
acct_init_pacct(&sig->pacct); acct_init_pacct(&sig->pacct);
tty_audit_fork(sig); tty_audit_fork(sig);
......
...@@ -883,7 +883,12 @@ static int futex_requeue(u32 __user *uaddr1, int fshared, u32 __user *uaddr2, ...@@ -883,7 +883,12 @@ static int futex_requeue(u32 __user *uaddr1, int fshared, u32 __user *uaddr2,
out_unlock: out_unlock:
double_unlock_hb(hb1, hb2); double_unlock_hb(hb1, hb2);
/* drop_futex_key_refs() must be called outside the spinlocks. */ /*
* drop_futex_key_refs() must be called outside the spinlocks. During
* the requeue we moved futex_q's from the hash bucket at key1 to the
* one at key2 and updated their key pointer. We no longer need to
* hold the references to key1.
*/
while (--drop_count >= 0) while (--drop_count >= 0)
drop_futex_key_refs(&key1); drop_futex_key_refs(&key1);
......
...@@ -54,6 +54,7 @@ static bool init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, ...@@ -54,6 +54,7 @@ static bool init_copy_one_irq_desc(int irq, struct irq_desc *old_desc,
static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc)
{ {
free_kstat_irqs(old_desc, desc); free_kstat_irqs(old_desc, desc);
free_desc_masks(old_desc, desc);
arch_free_chip_data(old_desc, desc); arch_free_chip_data(old_desc, desc);
} }
......
...@@ -18,7 +18,7 @@ void update_rlimit_cpu(unsigned long rlim_new) ...@@ -18,7 +18,7 @@ void update_rlimit_cpu(unsigned long rlim_new)
cputime = secs_to_cputime(rlim_new); cputime = secs_to_cputime(rlim_new);
if (cputime_eq(current->signal->it_prof_expires, cputime_zero) || if (cputime_eq(current->signal->it_prof_expires, cputime_zero) ||
cputime_lt(current->signal->it_prof_expires, cputime)) { cputime_gt(current->signal->it_prof_expires, cputime)) {
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->sighand->siglock);
set_process_cpu_timer(current, CPUCLOCK_PROF, &cputime, NULL); set_process_cpu_timer(current, CPUCLOCK_PROF, &cputime, NULL);
spin_unlock_irq(&current->sighand->siglock); spin_unlock_irq(&current->sighand->siglock);
......
...@@ -531,10 +531,13 @@ static void __init_timer(struct timer_list *timer, ...@@ -531,10 +531,13 @@ static void __init_timer(struct timer_list *timer,
} }
/** /**
* init_timer - initialize a timer. * init_timer_key - initialize a timer
* @timer: the timer to be initialized * @timer: the timer to be initialized
* @name: name of the timer
* @key: lockdep class key of the fake lock used for tracking timer
* sync lock dependencies
* *
* init_timer() must be done to a timer prior calling *any* of the * init_timer_key() must be done to a timer prior calling *any* of the
* other timer functions. * other timer functions.
*/ */
void init_timer_key(struct timer_list *timer, void init_timer_key(struct timer_list *timer,
......
...@@ -1051,13 +1051,6 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) ...@@ -1051,13 +1051,6 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
if (str < end) if (str < end)
*str = '%'; *str = '%';
++str; ++str;
if (*fmt) {
if (str < end)
*str = *fmt;
++str;
} else {
--fmt;
}
break; break;
case FORMAT_TYPE_NRCHARS: { case FORMAT_TYPE_NRCHARS: {
...@@ -1339,8 +1332,6 @@ do { \ ...@@ -1339,8 +1332,6 @@ do { \
break; break;
case FORMAT_TYPE_INVALID: case FORMAT_TYPE_INVALID:
if (!*fmt)
--fmt;
break; break;
case FORMAT_TYPE_NRCHARS: { case FORMAT_TYPE_NRCHARS: {
...@@ -1523,13 +1514,6 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf) ...@@ -1523,13 +1514,6 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
if (str < end) if (str < end)
*str = '%'; *str = '%';
++str; ++str;
if (*fmt) {
if (str < end)
*str = *fmt;
++str;
} else {
--fmt;
}
break; break;
case FORMAT_TYPE_NRCHARS: case FORMAT_TYPE_NRCHARS:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment