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
This commit is contained in:
commit
422a253483
@ -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,
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
|||||||
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)
|
|||||||
atomic_inc(¤t->signal->live);
|
atomic_inc(¤t->signal->live);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);
|
sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);
|
||||||
|
|
||||||
if (sig)
|
|
||||||
posix_cpu_timers_init_group(sig);
|
|
||||||
|
|
||||||
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)
|
|||||||
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 @@ retry_private:
|
|||||||
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,
|
|||||||
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)
|
|||||||
|
|
||||||
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(¤t->sighand->siglock);
|
spin_lock_irq(¤t->sighand->siglock);
|
||||||
set_process_cpu_timer(current, CPUCLOCK_PROF, &cputime, NULL);
|
set_process_cpu_timer(current, CPUCLOCK_PROF, &cputime, NULL);
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
|
@ -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)
|
|||||||
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 { \
|
|||||||
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)
|
|||||||
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:
|
||||||
|
Loading…
Reference in New Issue
Block a user