Merge branch 'irq/urgent' into irq/core
Reason: Get mainline fixes integrated. Further patches conflict with
them
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
+11
-3
@@ -56,6 +56,7 @@ void move_masked_irq(int irq)
|
||||
void move_native_irq(int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
bool masked;
|
||||
|
||||
if (likely(!(desc->status & IRQ_MOVE_PENDING)))
|
||||
return;
|
||||
@@ -63,8 +64,15 @@ void move_native_irq(int irq)
|
||||
if (unlikely(desc->status & IRQ_DISABLED))
|
||||
return;
|
||||
|
||||
desc->irq_data.chip->irq_mask(&desc->irq_data);
|
||||
/*
|
||||
* Be careful vs. already masked interrupts. If this is a
|
||||
* threaded interrupt with ONESHOT set, we can end up with an
|
||||
* interrupt storm.
|
||||
*/
|
||||
masked = desc->status & IRQ_MASKED;
|
||||
if (!masked)
|
||||
desc->irq_data.chip->irq_mask(&desc->irq_data);
|
||||
move_masked_irq(irq);
|
||||
desc->irq_data.chip->irq_unmask(&desc->irq_data);
|
||||
if (!masked)
|
||||
desc->irq_data.chip->irq_unmask(&desc->irq_data);
|
||||
}
|
||||
|
||||
|
||||
+54
-11
@@ -719,9 +719,7 @@ void destroy_params(const struct kernel_param *params, unsigned num)
|
||||
params[i].ops->free(params[i].arg);
|
||||
}
|
||||
|
||||
static void __init kernel_add_sysfs_param(const char *name,
|
||||
struct kernel_param *kparam,
|
||||
unsigned int name_skip)
|
||||
static struct module_kobject * __init locate_module_kobject(const char *name)
|
||||
{
|
||||
struct module_kobject *mk;
|
||||
struct kobject *kobj;
|
||||
@@ -729,10 +727,7 @@ static void __init kernel_add_sysfs_param(const char *name,
|
||||
|
||||
kobj = kset_find_obj(module_kset, name);
|
||||
if (kobj) {
|
||||
/* We already have one. Remove params so we can add more. */
|
||||
mk = to_module_kobject(kobj);
|
||||
/* We need to remove it before adding parameters. */
|
||||
sysfs_remove_group(&mk->kobj, &mk->mp->grp);
|
||||
} else {
|
||||
mk = kzalloc(sizeof(struct module_kobject), GFP_KERNEL);
|
||||
BUG_ON(!mk);
|
||||
@@ -743,15 +738,36 @@ static void __init kernel_add_sysfs_param(const char *name,
|
||||
"%s", name);
|
||||
if (err) {
|
||||
kobject_put(&mk->kobj);
|
||||
printk(KERN_ERR "Module '%s' failed add to sysfs, "
|
||||
"error number %d\n", name, err);
|
||||
printk(KERN_ERR "The system will be unstable now.\n");
|
||||
return;
|
||||
printk(KERN_ERR
|
||||
"Module '%s' failed add to sysfs, error number %d\n",
|
||||
name, err);
|
||||
printk(KERN_ERR
|
||||
"The system will be unstable now.\n");
|
||||
return NULL;
|
||||
}
|
||||
/* So that exit path is even. */
|
||||
|
||||
/* So that we hold reference in both cases. */
|
||||
kobject_get(&mk->kobj);
|
||||
}
|
||||
|
||||
return mk;
|
||||
}
|
||||
|
||||
static void __init kernel_add_sysfs_param(const char *name,
|
||||
struct kernel_param *kparam,
|
||||
unsigned int name_skip)
|
||||
{
|
||||
struct module_kobject *mk;
|
||||
int err;
|
||||
|
||||
mk = locate_module_kobject(name);
|
||||
if (!mk)
|
||||
return;
|
||||
|
||||
/* We need to remove old parameters before adding more. */
|
||||
if (mk->mp)
|
||||
sysfs_remove_group(&mk->kobj, &mk->mp->grp);
|
||||
|
||||
/* These should not fail at boot. */
|
||||
err = add_sysfs_param(mk, kparam, kparam->name + name_skip);
|
||||
BUG_ON(err);
|
||||
@@ -796,6 +812,32 @@ static void __init param_sysfs_builtin(void)
|
||||
}
|
||||
}
|
||||
|
||||
ssize_t __modver_version_show(struct module_attribute *mattr,
|
||||
struct module *mod, char *buf)
|
||||
{
|
||||
struct module_version_attribute *vattr =
|
||||
container_of(mattr, struct module_version_attribute, mattr);
|
||||
|
||||
return sprintf(buf, "%s\n", vattr->version);
|
||||
}
|
||||
|
||||
extern struct module_version_attribute __start___modver[], __stop___modver[];
|
||||
|
||||
static void __init version_sysfs_builtin(void)
|
||||
{
|
||||
const struct module_version_attribute *vattr;
|
||||
struct module_kobject *mk;
|
||||
int err;
|
||||
|
||||
for (vattr = __start___modver; vattr < __stop___modver; vattr++) {
|
||||
mk = locate_module_kobject(vattr->module_name);
|
||||
if (mk) {
|
||||
err = sysfs_create_file(&mk->kobj, &vattr->mattr.attr);
|
||||
kobject_uevent(&mk->kobj, KOBJ_ADD);
|
||||
kobject_put(&mk->kobj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* module-related sysfs stuff */
|
||||
|
||||
@@ -875,6 +917,7 @@ static int __init param_sysfs_init(void)
|
||||
}
|
||||
module_sysfs_initialized = 1;
|
||||
|
||||
version_sysfs_builtin();
|
||||
param_sysfs_builtin();
|
||||
|
||||
return 0;
|
||||
|
||||
+32
-24
@@ -1901,11 +1901,12 @@ static void __perf_event_read(void *info)
|
||||
return;
|
||||
|
||||
raw_spin_lock(&ctx->lock);
|
||||
update_context_time(ctx);
|
||||
if (ctx->is_active)
|
||||
update_context_time(ctx);
|
||||
update_event_times(event);
|
||||
if (event->state == PERF_EVENT_STATE_ACTIVE)
|
||||
event->pmu->read(event);
|
||||
raw_spin_unlock(&ctx->lock);
|
||||
|
||||
event->pmu->read(event);
|
||||
}
|
||||
|
||||
static inline u64 perf_event_count(struct perf_event *event)
|
||||
@@ -1999,8 +2000,7 @@ static int alloc_callchain_buffers(void)
|
||||
* accessed from NMI. Use a temporary manual per cpu allocation
|
||||
* until that gets sorted out.
|
||||
*/
|
||||
size = sizeof(*entries) + sizeof(struct perf_callchain_entry *) *
|
||||
num_possible_cpus();
|
||||
size = offsetof(struct callchain_cpus_entries, cpu_entries[nr_cpu_ids]);
|
||||
|
||||
entries = kzalloc(size, GFP_KERNEL);
|
||||
if (!entries)
|
||||
@@ -2201,13 +2201,6 @@ find_lively_task_by_vpid(pid_t vpid)
|
||||
if (!task)
|
||||
return ERR_PTR(-ESRCH);
|
||||
|
||||
/*
|
||||
* Can't attach events to a dying task.
|
||||
*/
|
||||
err = -ESRCH;
|
||||
if (task->flags & PF_EXITING)
|
||||
goto errout;
|
||||
|
||||
/* Reuse ptrace permission checks for now. */
|
||||
err = -EACCES;
|
||||
if (!ptrace_may_access(task, PTRACE_MODE_READ))
|
||||
@@ -2268,14 +2261,27 @@ retry:
|
||||
|
||||
get_ctx(ctx);
|
||||
|
||||
if (cmpxchg(&task->perf_event_ctxp[ctxn], NULL, ctx)) {
|
||||
/*
|
||||
* We raced with some other task; use
|
||||
* the context they set.
|
||||
*/
|
||||
err = 0;
|
||||
mutex_lock(&task->perf_event_mutex);
|
||||
/*
|
||||
* If it has already passed perf_event_exit_task().
|
||||
* we must see PF_EXITING, it takes this mutex too.
|
||||
*/
|
||||
if (task->flags & PF_EXITING)
|
||||
err = -ESRCH;
|
||||
else if (task->perf_event_ctxp[ctxn])
|
||||
err = -EAGAIN;
|
||||
else
|
||||
rcu_assign_pointer(task->perf_event_ctxp[ctxn], ctx);
|
||||
mutex_unlock(&task->perf_event_mutex);
|
||||
|
||||
if (unlikely(err)) {
|
||||
put_task_struct(task);
|
||||
kfree(ctx);
|
||||
goto retry;
|
||||
|
||||
if (err == -EAGAIN)
|
||||
goto retry;
|
||||
goto errout;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5374,6 +5380,8 @@ free_dev:
|
||||
goto out;
|
||||
}
|
||||
|
||||
static struct lock_class_key cpuctx_mutex;
|
||||
|
||||
int perf_pmu_register(struct pmu *pmu, char *name, int type)
|
||||
{
|
||||
int cpu, ret;
|
||||
@@ -5422,6 +5430,7 @@ skip_type:
|
||||
|
||||
cpuctx = per_cpu_ptr(pmu->pmu_cpu_context, cpu);
|
||||
__perf_event_init_context(&cpuctx->ctx);
|
||||
lockdep_set_class(&cpuctx->ctx.mutex, &cpuctx_mutex);
|
||||
cpuctx->ctx.type = cpu_context;
|
||||
cpuctx->ctx.pmu = pmu;
|
||||
cpuctx->jiffies_interval = 1;
|
||||
@@ -6127,7 +6136,7 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn)
|
||||
* scheduled, so we are now safe from rescheduling changing
|
||||
* our context.
|
||||
*/
|
||||
child_ctx = child->perf_event_ctxp[ctxn];
|
||||
child_ctx = rcu_dereference_raw(child->perf_event_ctxp[ctxn]);
|
||||
task_ctx_sched_out(child_ctx, EVENT_ALL);
|
||||
|
||||
/*
|
||||
@@ -6440,11 +6449,6 @@ int perf_event_init_context(struct task_struct *child, int ctxn)
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
child->perf_event_ctxp[ctxn] = NULL;
|
||||
|
||||
mutex_init(&child->perf_event_mutex);
|
||||
INIT_LIST_HEAD(&child->perf_event_list);
|
||||
|
||||
if (likely(!parent->perf_event_ctxp[ctxn]))
|
||||
return 0;
|
||||
|
||||
@@ -6533,6 +6537,10 @@ int perf_event_init_task(struct task_struct *child)
|
||||
{
|
||||
int ctxn, ret;
|
||||
|
||||
memset(child->perf_event_ctxp, 0, sizeof(child->perf_event_ctxp));
|
||||
mutex_init(&child->perf_event_mutex);
|
||||
INIT_LIST_HEAD(&child->perf_event_list);
|
||||
|
||||
for_each_task_context_nr(ctxn) {
|
||||
ret = perf_event_init_context(child, ctxn);
|
||||
if (ret)
|
||||
|
||||
+54
-46
@@ -97,7 +97,7 @@ static int console_locked, console_suspended;
|
||||
/*
|
||||
* logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars
|
||||
* It is also used in interesting ways to provide interlocking in
|
||||
* release_console_sem().
|
||||
* console_unlock();.
|
||||
*/
|
||||
static DEFINE_SPINLOCK(logbuf_lock);
|
||||
|
||||
@@ -501,7 +501,7 @@ static void _call_console_drivers(unsigned start,
|
||||
/*
|
||||
* Call the console drivers, asking them to write out
|
||||
* log_buf[start] to log_buf[end - 1].
|
||||
* The console_sem must be held.
|
||||
* The console_lock must be held.
|
||||
*/
|
||||
static void call_console_drivers(unsigned start, unsigned end)
|
||||
{
|
||||
@@ -604,11 +604,11 @@ static int have_callable_console(void)
|
||||
*
|
||||
* This is printk(). It can be called from any context. We want it to work.
|
||||
*
|
||||
* We try to grab the console_sem. If we succeed, it's easy - we log the output and
|
||||
* We try to grab the console_lock. If we succeed, it's easy - we log the output and
|
||||
* call the console drivers. If we fail to get the semaphore we place the output
|
||||
* into the log buffer and return. The current holder of the console_sem will
|
||||
* notice the new output in release_console_sem() and will send it to the
|
||||
* consoles before releasing the semaphore.
|
||||
* notice the new output in console_unlock(); and will send it to the
|
||||
* consoles before releasing the lock.
|
||||
*
|
||||
* One effect of this deferred printing is that code which calls printk() and
|
||||
* then changes console_loglevel may break. This is because console_loglevel
|
||||
@@ -659,19 +659,19 @@ static inline int can_use_console(unsigned int cpu)
|
||||
/*
|
||||
* Try to get console ownership to actually show the kernel
|
||||
* messages from a 'printk'. Return true (and with the
|
||||
* console_semaphore held, and 'console_locked' set) if it
|
||||
* console_lock held, and 'console_locked' set) if it
|
||||
* is successful, false otherwise.
|
||||
*
|
||||
* This gets called with the 'logbuf_lock' spinlock held and
|
||||
* interrupts disabled. It should return with 'lockbuf_lock'
|
||||
* released but interrupts still disabled.
|
||||
*/
|
||||
static int acquire_console_semaphore_for_printk(unsigned int cpu)
|
||||
static int console_trylock_for_printk(unsigned int cpu)
|
||||
__releases(&logbuf_lock)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
if (!try_acquire_console_sem()) {
|
||||
if (console_trylock()) {
|
||||
retval = 1;
|
||||
|
||||
/*
|
||||
@@ -827,12 +827,12 @@ asmlinkage int vprintk(const char *fmt, va_list args)
|
||||
* actual magic (print out buffers, wake up klogd,
|
||||
* etc).
|
||||
*
|
||||
* The acquire_console_semaphore_for_printk() function
|
||||
* The console_trylock_for_printk() function
|
||||
* will release 'logbuf_lock' regardless of whether it
|
||||
* actually gets the semaphore or not.
|
||||
*/
|
||||
if (acquire_console_semaphore_for_printk(this_cpu))
|
||||
release_console_sem();
|
||||
if (console_trylock_for_printk(this_cpu))
|
||||
console_unlock();
|
||||
|
||||
lockdep_on();
|
||||
out_restore_irqs:
|
||||
@@ -993,7 +993,7 @@ void suspend_console(void)
|
||||
if (!console_suspend_enabled)
|
||||
return;
|
||||
printk("Suspending console(s) (use no_console_suspend to debug)\n");
|
||||
acquire_console_sem();
|
||||
console_lock();
|
||||
console_suspended = 1;
|
||||
up(&console_sem);
|
||||
}
|
||||
@@ -1004,7 +1004,7 @@ void resume_console(void)
|
||||
return;
|
||||
down(&console_sem);
|
||||
console_suspended = 0;
|
||||
release_console_sem();
|
||||
console_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1027,21 +1027,21 @@ static int __cpuinit console_cpu_notify(struct notifier_block *self,
|
||||
case CPU_DYING:
|
||||
case CPU_DOWN_FAILED:
|
||||
case CPU_UP_CANCELED:
|
||||
acquire_console_sem();
|
||||
release_console_sem();
|
||||
console_lock();
|
||||
console_unlock();
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* acquire_console_sem - lock the console system for exclusive use.
|
||||
* console_lock - lock the console system for exclusive use.
|
||||
*
|
||||
* Acquires a semaphore which guarantees that the caller has
|
||||
* Acquires a lock which guarantees that the caller has
|
||||
* exclusive access to the console system and the console_drivers list.
|
||||
*
|
||||
* Can sleep, returns nothing.
|
||||
*/
|
||||
void acquire_console_sem(void)
|
||||
void console_lock(void)
|
||||
{
|
||||
BUG_ON(in_interrupt());
|
||||
down(&console_sem);
|
||||
@@ -1050,21 +1050,29 @@ void acquire_console_sem(void)
|
||||
console_locked = 1;
|
||||
console_may_schedule = 1;
|
||||
}
|
||||
EXPORT_SYMBOL(acquire_console_sem);
|
||||
EXPORT_SYMBOL(console_lock);
|
||||
|
||||
int try_acquire_console_sem(void)
|
||||
/**
|
||||
* console_trylock - try to lock the console system for exclusive use.
|
||||
*
|
||||
* Tried to acquire a lock which guarantees that the caller has
|
||||
* exclusive access to the console system and the console_drivers list.
|
||||
*
|
||||
* returns 1 on success, and 0 on failure to acquire the lock.
|
||||
*/
|
||||
int console_trylock(void)
|
||||
{
|
||||
if (down_trylock(&console_sem))
|
||||
return -1;
|
||||
return 0;
|
||||
if (console_suspended) {
|
||||
up(&console_sem);
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
console_locked = 1;
|
||||
console_may_schedule = 0;
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(try_acquire_console_sem);
|
||||
EXPORT_SYMBOL(console_trylock);
|
||||
|
||||
int is_console_locked(void)
|
||||
{
|
||||
@@ -1095,20 +1103,20 @@ void wake_up_klogd(void)
|
||||
}
|
||||
|
||||
/**
|
||||
* release_console_sem - unlock the console system
|
||||
* console_unlock - unlock the console system
|
||||
*
|
||||
* Releases the semaphore which the caller holds on the console system
|
||||
* Releases the console_lock which the caller holds on the console system
|
||||
* and the console driver list.
|
||||
*
|
||||
* While the semaphore was held, console output may have been buffered
|
||||
* by printk(). If this is the case, release_console_sem() emits
|
||||
* the output prior to releasing the semaphore.
|
||||
* While the console_lock was held, console output may have been buffered
|
||||
* by printk(). If this is the case, console_unlock(); emits
|
||||
* the output prior to releasing the lock.
|
||||
*
|
||||
* If there is output waiting for klogd, we wake it up.
|
||||
*
|
||||
* release_console_sem() may be called from any context.
|
||||
* console_unlock(); may be called from any context.
|
||||
*/
|
||||
void release_console_sem(void)
|
||||
void console_unlock(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned _con_start, _log_end;
|
||||
@@ -1141,7 +1149,7 @@ void release_console_sem(void)
|
||||
if (wake_klogd)
|
||||
wake_up_klogd();
|
||||
}
|
||||
EXPORT_SYMBOL(release_console_sem);
|
||||
EXPORT_SYMBOL(console_unlock);
|
||||
|
||||
/**
|
||||
* console_conditional_schedule - yield the CPU if required
|
||||
@@ -1150,7 +1158,7 @@ EXPORT_SYMBOL(release_console_sem);
|
||||
* if this CPU should yield the CPU to another task, do
|
||||
* so here.
|
||||
*
|
||||
* Must be called within acquire_console_sem().
|
||||
* Must be called within console_lock();.
|
||||
*/
|
||||
void __sched console_conditional_schedule(void)
|
||||
{
|
||||
@@ -1171,14 +1179,14 @@ void console_unblank(void)
|
||||
if (down_trylock(&console_sem) != 0)
|
||||
return;
|
||||
} else
|
||||
acquire_console_sem();
|
||||
console_lock();
|
||||
|
||||
console_locked = 1;
|
||||
console_may_schedule = 0;
|
||||
for_each_console(c)
|
||||
if ((c->flags & CON_ENABLED) && c->unblank)
|
||||
c->unblank();
|
||||
release_console_sem();
|
||||
console_unlock();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1189,7 +1197,7 @@ struct tty_driver *console_device(int *index)
|
||||
struct console *c;
|
||||
struct tty_driver *driver = NULL;
|
||||
|
||||
acquire_console_sem();
|
||||
console_lock();
|
||||
for_each_console(c) {
|
||||
if (!c->device)
|
||||
continue;
|
||||
@@ -1197,7 +1205,7 @@ struct tty_driver *console_device(int *index)
|
||||
if (driver)
|
||||
break;
|
||||
}
|
||||
release_console_sem();
|
||||
console_unlock();
|
||||
return driver;
|
||||
}
|
||||
|
||||
@@ -1208,17 +1216,17 @@ struct tty_driver *console_device(int *index)
|
||||
*/
|
||||
void console_stop(struct console *console)
|
||||
{
|
||||
acquire_console_sem();
|
||||
console_lock();
|
||||
console->flags &= ~CON_ENABLED;
|
||||
release_console_sem();
|
||||
console_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL(console_stop);
|
||||
|
||||
void console_start(struct console *console)
|
||||
{
|
||||
acquire_console_sem();
|
||||
console_lock();
|
||||
console->flags |= CON_ENABLED;
|
||||
release_console_sem();
|
||||
console_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL(console_start);
|
||||
|
||||
@@ -1340,7 +1348,7 @@ void register_console(struct console *newcon)
|
||||
* Put this console in the list - keep the
|
||||
* preferred driver at the head of the list.
|
||||
*/
|
||||
acquire_console_sem();
|
||||
console_lock();
|
||||
if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) {
|
||||
newcon->next = console_drivers;
|
||||
console_drivers = newcon;
|
||||
@@ -1352,14 +1360,14 @@ void register_console(struct console *newcon)
|
||||
}
|
||||
if (newcon->flags & CON_PRINTBUFFER) {
|
||||
/*
|
||||
* release_console_sem() will print out the buffered messages
|
||||
* console_unlock(); will print out the buffered messages
|
||||
* for us.
|
||||
*/
|
||||
spin_lock_irqsave(&logbuf_lock, flags);
|
||||
con_start = log_start;
|
||||
spin_unlock_irqrestore(&logbuf_lock, flags);
|
||||
}
|
||||
release_console_sem();
|
||||
console_unlock();
|
||||
console_sysfs_notify();
|
||||
|
||||
/*
|
||||
@@ -1396,7 +1404,7 @@ int unregister_console(struct console *console)
|
||||
return braille_unregister_console(console);
|
||||
#endif
|
||||
|
||||
acquire_console_sem();
|
||||
console_lock();
|
||||
if (console_drivers == console) {
|
||||
console_drivers=console->next;
|
||||
res = 0;
|
||||
@@ -1418,7 +1426,7 @@ int unregister_console(struct console *console)
|
||||
if (console_drivers != NULL && console->flags & CON_CONSDEV)
|
||||
console_drivers->flags |= CON_CONSDEV;
|
||||
|
||||
release_console_sem();
|
||||
console_unlock();
|
||||
console_sysfs_notify();
|
||||
return res;
|
||||
}
|
||||
|
||||
+58
-33
@@ -699,7 +699,8 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se)
|
||||
cfs_rq->nr_running--;
|
||||
}
|
||||
|
||||
#if defined CONFIG_SMP && defined CONFIG_FAIR_GROUP_SCHED
|
||||
#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||
# ifdef CONFIG_SMP
|
||||
static void update_cfs_rq_load_contribution(struct cfs_rq *cfs_rq,
|
||||
int global_update)
|
||||
{
|
||||
@@ -721,10 +722,10 @@ static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update)
|
||||
u64 now, delta;
|
||||
unsigned long load = cfs_rq->load.weight;
|
||||
|
||||
if (!cfs_rq)
|
||||
if (cfs_rq->tg == &root_task_group)
|
||||
return;
|
||||
|
||||
now = rq_of(cfs_rq)->clock;
|
||||
now = rq_of(cfs_rq)->clock_task;
|
||||
delta = now - cfs_rq->load_stamp;
|
||||
|
||||
/* truncate load history at 4 idle periods */
|
||||
@@ -762,6 +763,51 @@ static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update)
|
||||
list_del_leaf_cfs_rq(cfs_rq);
|
||||
}
|
||||
|
||||
static long calc_cfs_shares(struct cfs_rq *cfs_rq, struct task_group *tg,
|
||||
long weight_delta)
|
||||
{
|
||||
long load_weight, load, shares;
|
||||
|
||||
load = cfs_rq->load.weight + weight_delta;
|
||||
|
||||
load_weight = atomic_read(&tg->load_weight);
|
||||
load_weight -= cfs_rq->load_contribution;
|
||||
load_weight += load;
|
||||
|
||||
shares = (tg->shares * load);
|
||||
if (load_weight)
|
||||
shares /= load_weight;
|
||||
|
||||
if (shares < MIN_SHARES)
|
||||
shares = MIN_SHARES;
|
||||
if (shares > tg->shares)
|
||||
shares = tg->shares;
|
||||
|
||||
return shares;
|
||||
}
|
||||
|
||||
static void update_entity_shares_tick(struct cfs_rq *cfs_rq)
|
||||
{
|
||||
if (cfs_rq->load_unacc_exec_time > sysctl_sched_shares_window) {
|
||||
update_cfs_load(cfs_rq, 0);
|
||||
update_cfs_shares(cfs_rq, 0);
|
||||
}
|
||||
}
|
||||
# else /* CONFIG_SMP */
|
||||
static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update)
|
||||
{
|
||||
}
|
||||
|
||||
static inline long calc_cfs_shares(struct cfs_rq *cfs_rq, struct task_group *tg,
|
||||
long weight_delta)
|
||||
{
|
||||
return tg->shares;
|
||||
}
|
||||
|
||||
static inline void update_entity_shares_tick(struct cfs_rq *cfs_rq)
|
||||
{
|
||||
}
|
||||
# endif /* CONFIG_SMP */
|
||||
static void reweight_entity(struct cfs_rq *cfs_rq, struct sched_entity *se,
|
||||
unsigned long weight)
|
||||
{
|
||||
@@ -782,41 +828,20 @@ static void update_cfs_shares(struct cfs_rq *cfs_rq, long weight_delta)
|
||||
{
|
||||
struct task_group *tg;
|
||||
struct sched_entity *se;
|
||||
long load_weight, load, shares;
|
||||
|
||||
if (!cfs_rq)
|
||||
return;
|
||||
long shares;
|
||||
|
||||
tg = cfs_rq->tg;
|
||||
se = tg->se[cpu_of(rq_of(cfs_rq))];
|
||||
if (!se)
|
||||
return;
|
||||
|
||||
load = cfs_rq->load.weight + weight_delta;
|
||||
|
||||
load_weight = atomic_read(&tg->load_weight);
|
||||
load_weight -= cfs_rq->load_contribution;
|
||||
load_weight += load;
|
||||
|
||||
shares = (tg->shares * load);
|
||||
if (load_weight)
|
||||
shares /= load_weight;
|
||||
|
||||
if (shares < MIN_SHARES)
|
||||
shares = MIN_SHARES;
|
||||
if (shares > tg->shares)
|
||||
shares = tg->shares;
|
||||
#ifndef CONFIG_SMP
|
||||
if (likely(se->load.weight == tg->shares))
|
||||
return;
|
||||
#endif
|
||||
shares = calc_cfs_shares(cfs_rq, tg, weight_delta);
|
||||
|
||||
reweight_entity(cfs_rq_of(se), se, shares);
|
||||
}
|
||||
|
||||
static void update_entity_shares_tick(struct cfs_rq *cfs_rq)
|
||||
{
|
||||
if (cfs_rq->load_unacc_exec_time > sysctl_sched_shares_window) {
|
||||
update_cfs_load(cfs_rq, 0);
|
||||
update_cfs_shares(cfs_rq, 0);
|
||||
}
|
||||
}
|
||||
#else /* CONFIG_FAIR_GROUP_SCHED */
|
||||
static void update_cfs_load(struct cfs_rq *cfs_rq, int global_update)
|
||||
{
|
||||
@@ -1404,7 +1429,7 @@ static inline unsigned long effective_load(struct task_group *tg, int cpu,
|
||||
|
||||
static int wake_affine(struct sched_domain *sd, struct task_struct *p, int sync)
|
||||
{
|
||||
unsigned long this_load, load;
|
||||
s64 this_load, load;
|
||||
int idx, this_cpu, prev_cpu;
|
||||
unsigned long tl_per_task;
|
||||
struct task_group *tg;
|
||||
@@ -1443,8 +1468,8 @@ static int wake_affine(struct sched_domain *sd, struct task_struct *p, int sync)
|
||||
* Otherwise check if either cpus are near enough in load to allow this
|
||||
* task to be woken on this_cpu.
|
||||
*/
|
||||
if (this_load) {
|
||||
unsigned long this_eff_load, prev_eff_load;
|
||||
if (this_load > 0) {
|
||||
s64 this_eff_load, prev_eff_load;
|
||||
|
||||
this_eff_load = 100;
|
||||
this_eff_load *= power_of(prev_cpu);
|
||||
|
||||
+1
-1
@@ -625,7 +625,7 @@ static void update_curr_rt(struct rq *rq)
|
||||
struct rt_rq *rt_rq = rt_rq_of_se(rt_se);
|
||||
u64 delta_exec;
|
||||
|
||||
if (!task_has_rt_policy(curr))
|
||||
if (curr->sched_class != &rt_sched_class)
|
||||
return;
|
||||
|
||||
delta_exec = rq->clock_task - curr->se.exec_start;
|
||||
|
||||
+2
-1
@@ -1385,7 +1385,8 @@ static int check_prlimit_permission(struct task_struct *task)
|
||||
const struct cred *cred = current_cred(), *tcred;
|
||||
|
||||
tcred = __task_cred(task);
|
||||
if ((cred->uid != tcred->euid ||
|
||||
if (current != task &&
|
||||
(cred->uid != tcred->euid ||
|
||||
cred->uid != tcred->suid ||
|
||||
cred->uid != tcred->uid ||
|
||||
cred->gid != tcred->egid ||
|
||||
|
||||
+2
-1
@@ -170,7 +170,8 @@ static int proc_taint(struct ctl_table *table, int write,
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MAGIC_SYSRQ
|
||||
static int __sysrq_enabled; /* Note: sysrq code ises it's own private copy */
|
||||
/* Note: sysrq code uses it's own private copy */
|
||||
static int __sysrq_enabled = SYSRQ_DEFAULT_ENABLE;
|
||||
|
||||
static int sysrq_sysctl_handler(ctl_table *table, int write,
|
||||
void __user *buffer, size_t *lenp,
|
||||
|
||||
@@ -642,8 +642,7 @@ static void tick_nohz_switch_to_nohz(void)
|
||||
}
|
||||
local_irq_enable();
|
||||
|
||||
printk(KERN_INFO "Switched to NOHz mode on CPU #%d\n",
|
||||
smp_processor_id());
|
||||
printk(KERN_INFO "Switched to NOHz mode on CPU #%d\n", smp_processor_id());
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -795,8 +794,10 @@ void tick_setup_sched_timer(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NO_HZ
|
||||
if (tick_nohz_enabled)
|
||||
if (tick_nohz_enabled) {
|
||||
ts->nohz_mode = NOHZ_MODE_HIGHRES;
|
||||
printk(KERN_INFO "Switched to NOHz mode on CPU #%d\n", smp_processor_id());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif /* HIGH_RES_TIMERS */
|
||||
|
||||
+19
-24
@@ -27,7 +27,7 @@
|
||||
#include <asm/irq_regs.h>
|
||||
#include <linux/perf_event.h>
|
||||
|
||||
int watchdog_enabled;
|
||||
int watchdog_enabled = 1;
|
||||
int __read_mostly softlockup_thresh = 60;
|
||||
|
||||
static DEFINE_PER_CPU(unsigned long, watchdog_touch_ts);
|
||||
@@ -43,9 +43,6 @@ static DEFINE_PER_CPU(unsigned long, hrtimer_interrupts_saved);
|
||||
static DEFINE_PER_CPU(struct perf_event *, watchdog_ev);
|
||||
#endif
|
||||
|
||||
static int no_watchdog;
|
||||
|
||||
|
||||
/* boot commands */
|
||||
/*
|
||||
* Should we panic when a soft-lockup or hard-lockup occurs:
|
||||
@@ -58,7 +55,7 @@ static int __init hardlockup_panic_setup(char *str)
|
||||
if (!strncmp(str, "panic", 5))
|
||||
hardlockup_panic = 1;
|
||||
else if (!strncmp(str, "0", 1))
|
||||
no_watchdog = 1;
|
||||
watchdog_enabled = 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("nmi_watchdog=", hardlockup_panic_setup);
|
||||
@@ -77,7 +74,7 @@ __setup("softlockup_panic=", softlockup_panic_setup);
|
||||
|
||||
static int __init nowatchdog_setup(char *str)
|
||||
{
|
||||
no_watchdog = 1;
|
||||
watchdog_enabled = 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("nowatchdog", nowatchdog_setup);
|
||||
@@ -85,7 +82,7 @@ __setup("nowatchdog", nowatchdog_setup);
|
||||
/* deprecated */
|
||||
static int __init nosoftlockup_setup(char *str)
|
||||
{
|
||||
no_watchdog = 1;
|
||||
watchdog_enabled = 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("nosoftlockup", nosoftlockup_setup);
|
||||
@@ -432,9 +429,6 @@ static int watchdog_enable(int cpu)
|
||||
wake_up_process(p);
|
||||
}
|
||||
|
||||
/* if any cpu succeeds, watchdog is considered enabled for the system */
|
||||
watchdog_enabled = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -462,12 +456,16 @@ static void watchdog_disable(int cpu)
|
||||
static void watchdog_enable_all_cpus(void)
|
||||
{
|
||||
int cpu;
|
||||
int result = 0;
|
||||
|
||||
watchdog_enabled = 0;
|
||||
|
||||
for_each_online_cpu(cpu)
|
||||
result += watchdog_enable(cpu);
|
||||
if (!watchdog_enable(cpu))
|
||||
/* if any cpu succeeds, watchdog is considered
|
||||
enabled for the system */
|
||||
watchdog_enabled = 1;
|
||||
|
||||
if (result)
|
||||
if (!watchdog_enabled)
|
||||
printk(KERN_ERR "watchdog: failed to be enabled on some cpus\n");
|
||||
|
||||
}
|
||||
@@ -476,9 +474,6 @@ static void watchdog_disable_all_cpus(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
if (no_watchdog)
|
||||
return;
|
||||
|
||||
for_each_online_cpu(cpu)
|
||||
watchdog_disable(cpu);
|
||||
|
||||
@@ -498,10 +493,12 @@ int proc_dowatchdog_enabled(struct ctl_table *table, int write,
|
||||
{
|
||||
proc_dointvec(table, write, buffer, length, ppos);
|
||||
|
||||
if (watchdog_enabled)
|
||||
watchdog_enable_all_cpus();
|
||||
else
|
||||
watchdog_disable_all_cpus();
|
||||
if (write) {
|
||||
if (watchdog_enabled)
|
||||
watchdog_enable_all_cpus();
|
||||
else
|
||||
watchdog_disable_all_cpus();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -530,7 +527,8 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
||||
break;
|
||||
case CPU_ONLINE:
|
||||
case CPU_ONLINE_FROZEN:
|
||||
err = watchdog_enable(hotcpu);
|
||||
if (watchdog_enabled)
|
||||
err = watchdog_enable(hotcpu);
|
||||
break;
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
case CPU_UP_CANCELED:
|
||||
@@ -555,9 +553,6 @@ void __init lockup_detector_init(void)
|
||||
void *cpu = (void *)(long)smp_processor_id();
|
||||
int err;
|
||||
|
||||
if (no_watchdog)
|
||||
return;
|
||||
|
||||
err = cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu);
|
||||
WARN_ON(notifier_to_errno(err));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user