mirror of https://github.com/OpenIPC/firmware.git
85 lines
2.1 KiB
Diff
85 lines
2.1 KiB
Diff
diff -drupN a/kernel/fork.c b/kernel/fork.c
|
|
--- a/kernel/fork.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/kernel/fork.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -77,6 +77,7 @@
|
|
#include <linux/compiler.h>
|
|
#include <linux/sysctl.h>
|
|
#include <linux/kcov.h>
|
|
+#include <linux/cpufreq_times.h>
|
|
|
|
#include <asm/pgtable.h>
|
|
#include <asm/pgalloc.h>
|
|
@@ -176,19 +177,18 @@ static unsigned long *alloc_thread_stack
|
|
void *stack;
|
|
int i;
|
|
|
|
- local_irq_disable();
|
|
for (i = 0; i < NR_CACHED_STACKS; i++) {
|
|
- struct vm_struct *s = this_cpu_read(cached_stacks[i]);
|
|
+ struct vm_struct *s;
|
|
+
|
|
+ s = this_cpu_xchg(cached_stacks[i], NULL);
|
|
|
|
if (!s)
|
|
continue;
|
|
- this_cpu_write(cached_stacks[i], NULL);
|
|
|
|
+ memset(s->addr, 0, THREAD_SIZE);
|
|
tsk->stack_vm_area = s;
|
|
- local_irq_enable();
|
|
return s->addr;
|
|
}
|
|
- local_irq_enable();
|
|
|
|
stack = __vmalloc_node_range(THREAD_SIZE, THREAD_SIZE,
|
|
VMALLOC_START, VMALLOC_END,
|
|
@@ -217,19 +217,15 @@ static inline void free_thread_stack(str
|
|
kaiser_unmap_thread_stack(tsk->stack);
|
|
#ifdef CONFIG_VMAP_STACK
|
|
if (task_stack_vm_area(tsk)) {
|
|
- unsigned long flags;
|
|
int i;
|
|
|
|
- local_irq_save(flags);
|
|
for (i = 0; i < NR_CACHED_STACKS; i++) {
|
|
- if (this_cpu_read(cached_stacks[i]))
|
|
+ if (this_cpu_cmpxchg(cached_stacks[i],
|
|
+ NULL, tsk->stack_vm_area) != NULL)
|
|
continue;
|
|
|
|
- this_cpu_write(cached_stacks[i], tsk->stack_vm_area);
|
|
- local_irq_restore(flags);
|
|
return;
|
|
}
|
|
- local_irq_restore(flags);
|
|
|
|
vfree(tsk->stack);
|
|
return;
|
|
@@ -339,6 +335,8 @@ void put_task_stack(struct task_struct *
|
|
|
|
void free_task(struct task_struct *tsk)
|
|
{
|
|
+ cpufreq_task_times_exit(tsk);
|
|
+
|
|
#ifndef CONFIG_THREAD_INFO_IN_TASK
|
|
/*
|
|
* The task is finally done with both the stack and thread_info,
|
|
@@ -1527,6 +1525,8 @@ static __latent_entropy struct task_stru
|
|
if (!p)
|
|
goto fork_out;
|
|
|
|
+ cpufreq_task_times_init(p);
|
|
+
|
|
ftrace_graph_init_task(p);
|
|
|
|
rt_mutex_init_task(p);
|
|
@@ -1963,6 +1963,8 @@ long _do_fork(unsigned long clone_flags,
|
|
struct completion vfork;
|
|
struct pid *pid;
|
|
|
|
+ cpufreq_task_times_alloc(p);
|
|
+
|
|
trace_sched_process_fork(current, p);
|
|
|
|
pid = get_task_pid(p, PIDTYPE_PID);
|