diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kprobes.c | 6 | ||||
| -rw-r--r-- | kernel/module.c | 2 | ||||
| -rw-r--r-- | kernel/panic.c | 7 | ||||
| -rw-r--r-- | kernel/sched.c | 32 | ||||
| -rw-r--r-- | kernel/time.c | 2 |
5 files changed, 44 insertions, 5 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index ca4e28b4c6a7..d3d1321b0e5c 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -84,10 +84,13 @@ int register_kprobe(struct kprobe *p) ret = -EEXIST; goto out; } + + if ((ret = arch_prepare_kprobe(p)) != 0) { + goto out; + } hlist_add_head(&p->hlist, &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]); - arch_prepare_kprobe(p); p->opcode = *p->addr; *p->addr = BREAKPOINT_INSTRUCTION; flush_icache_range((unsigned long) p->addr, @@ -101,6 +104,7 @@ void unregister_kprobe(struct kprobe *p) { unsigned long flags; spin_lock_irqsave(&kprobe_lock, flags); + arch_remove_kprobe(p); *p->addr = p->opcode; hlist_del(&p->hlist); flush_icache_range((unsigned long) p->addr, diff --git a/kernel/module.c b/kernel/module.c index 07cb91d8f761..0798443ce002 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -576,6 +576,8 @@ sys_delete_module(const char __user *name_user, unsigned int flags) /* Stop the machine so refcounts can't move and disable module. */ ret = try_stop_module(mod, flags, &forced); + if (ret != 0) + goto out; /* Never wait if forced. */ if (!forced && module_refcount(mod) != 0) diff --git a/kernel/panic.c b/kernel/panic.c index 97918d4ff44f..3f93784a4207 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -42,7 +42,7 @@ static long no_blink(long time) } /* Returns how long it waited in ms */ -long (*panic_blink)(long time) = no_blink; +long (*panic_blink)(long time); EXPORT_SYMBOL(panic_blink); /** @@ -75,7 +75,10 @@ NORET_TYPE void panic(const char * fmt, ...) smp_send_stop(); #endif - notifier_call_chain(&panic_notifier_list, 0, buf); + notifier_call_chain(&panic_notifier_list, 0, buf); + + if (!panic_blink) + panic_blink = no_blink; if (panic_timeout > 0) { diff --git a/kernel/sched.c b/kernel/sched.c index 76d8d418eae3..595348452a06 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -4607,3 +4607,35 @@ void __might_sleep(char *file, int line) } EXPORT_SYMBOL(__might_sleep); #endif + +#ifdef CONFIG_MAGIC_SYSRQ +void normalize_rt_tasks(void) +{ + struct task_struct *p; + prio_array_t *array; + unsigned long flags; + runqueue_t *rq; + + read_lock_irq(&tasklist_lock); + for_each_process (p) { + if (!rt_task(p)) + continue; + + rq = task_rq_lock(p, &flags); + + array = p->array; + if (array) + deactivate_task(p, task_rq(p)); + __setscheduler(p, SCHED_NORMAL, 0); + if (array) { + __activate_task(p, task_rq(p)); + resched_task(rq->curr); + } + + task_rq_unlock(rq, &flags); + } + read_unlock_irq(&tasklist_lock); +} + +EXPORT_SYMBOL(normalize_rt_tasks); +#endif /* CONFIG_MAGIC_SYSRQ */ diff --git a/kernel/time.c b/kernel/time.c index 7909444c466a..b6d01cf709c4 100644 --- a/kernel/time.c +++ b/kernel/time.c @@ -487,8 +487,6 @@ int do_settimeofday (struct timespec *tv) return 0; } -EXPORT_SYMBOL(do_settimeofday); - void do_gettimeofday (struct timeval *tv) { unsigned long seq, nsec, usec, sec, offset; |
