summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kprobes.c6
-rw-r--r--kernel/module.c2
-rw-r--r--kernel/panic.c7
-rw-r--r--kernel/sched.c32
-rw-r--r--kernel/time.c2
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;