Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b9b63b0c authored by Syed Rameez Mustafa's avatar Syed Rameez Mustafa
Browse files

sched/hmp: Fix memory leak when task fork fails



The scheduler allocates memory for the task load structures during
fork. It then relies to sched_exit() to be called to free that memory.
However, if the fork itself fails at any point after the allocation,
the memory is left unclaimed forever. Fix this memory leak by freeing
the allocated memory under error conditions.

Change-Id: I14a8290c9fcc4174ec80560e9f9d7bcdb119761f
Signed-off-by: default avatarSyed Rameez Mustafa <rameezmustafa@codeaurora.org>
parent 576259be
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2393,6 +2393,7 @@ struct cpu_cycle_counter_cb {
};

#ifdef CONFIG_SCHED_HMP
extern void free_task_load_ptrs(struct task_struct *p);
extern int sched_set_window(u64 window_start, unsigned int window_size);
extern unsigned long sched_get_busy(int cpu);
extern void sched_get_cpus_busy(struct sched_load *busy,
@@ -2418,6 +2419,8 @@ extern int sched_set_group_id(struct task_struct *p, unsigned int group_id);
extern unsigned int sched_get_group_id(struct task_struct *p);

#else /* CONFIG_SCHED_HMP */
static inline void free_task_load_ptrs(struct task_struct *p) { }

static inline u64 sched_ktime_clock(void)
{
	return 0;
+1 −0
Original line number Diff line number Diff line
@@ -1654,6 +1654,7 @@ bad_fork_cleanup_audit:
bad_fork_cleanup_perf:
	perf_event_free_task(p);
bad_fork_cleanup_policy:
	free_task_load_ptrs(p);
#ifdef CONFIG_NUMA
	mpol_put(p->mempolicy);
bad_fork_cleanup_threadgroup_lock:
+0 −3
Original line number Diff line number Diff line
@@ -1079,7 +1079,6 @@ extern unsigned int __read_mostly sched_downmigrate;
extern unsigned int  __read_mostly sysctl_sched_spill_nr_run;
extern unsigned int  __read_mostly sched_load_granule;

extern void free_task_load_ptrs(struct task_struct *p);
extern void init_new_task_load(struct task_struct *p, bool idle_task);
extern u64 sched_ktime_clock(void);
extern int got_boost_kick(void);
@@ -1528,8 +1527,6 @@ static inline struct sched_cluster *rq_cluster(struct rq *rq)
	return NULL;
}

static inline void free_task_load_ptrs(struct task_struct *p) { }

static inline void init_new_task_load(struct task_struct *p, bool idle_task)
{
}