Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a5736426eb |
@@ -1,6 +1,6 @@
|
|||||||
#
|
#
|
||||||
# Automatically generated file; DO NOT EDIT.
|
# Automatically generated file; DO NOT EDIT.
|
||||||
# Linux/x86 6.2.0-rc4 Kernel Configuration
|
# Linux/x86 6.2.0-rc1 Kernel Configuration
|
||||||
#
|
#
|
||||||
CONFIG_CC_VERSION_TEXT="gcc (GCC) 12.2.0"
|
CONFIG_CC_VERSION_TEXT="gcc (GCC) 12.2.0"
|
||||||
CONFIG_CC_IS_GCC=y
|
CONFIG_CC_IS_GCC=y
|
||||||
@@ -206,7 +206,6 @@ CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
|
|||||||
CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y
|
CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y
|
||||||
CONFIG_CC_HAS_INT128=y
|
CONFIG_CC_HAS_INT128=y
|
||||||
CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
|
CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
|
||||||
CONFIG_GCC11_NO_ARRAY_BOUNDS=y
|
|
||||||
CONFIG_GCC12_NO_ARRAY_BOUNDS=y
|
CONFIG_GCC12_NO_ARRAY_BOUNDS=y
|
||||||
CONFIG_CC_NO_ARRAY_BOUNDS=y
|
CONFIG_CC_NO_ARRAY_BOUNDS=y
|
||||||
CONFIG_ARCH_SUPPORTS_INT128=y
|
CONFIG_ARCH_SUPPORTS_INT128=y
|
||||||
@@ -242,7 +241,6 @@ CONFIG_UTS_NS=y
|
|||||||
CONFIG_TIME_NS=y
|
CONFIG_TIME_NS=y
|
||||||
CONFIG_IPC_NS=y
|
CONFIG_IPC_NS=y
|
||||||
CONFIG_USER_NS=y
|
CONFIG_USER_NS=y
|
||||||
CONFIG_USER_NS_UNPRIVILEGED=y
|
|
||||||
CONFIG_PID_NS=y
|
CONFIG_PID_NS=y
|
||||||
CONFIG_NET_NS=y
|
CONFIG_NET_NS=y
|
||||||
CONFIG_CHECKPOINT_RESTORE=y
|
CONFIG_CHECKPOINT_RESTORE=y
|
||||||
@@ -2548,7 +2546,6 @@ CONFIG_BLK_DEV_NBD=m
|
|||||||
CONFIG_BLK_DEV_RAM=m
|
CONFIG_BLK_DEV_RAM=m
|
||||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=16384
|
CONFIG_BLK_DEV_RAM_SIZE=16384
|
||||||
# CONFIG_CDROM_PKTCDVD is not set
|
|
||||||
CONFIG_ATA_OVER_ETH=m
|
CONFIG_ATA_OVER_ETH=m
|
||||||
CONFIG_XEN_BLKDEV_FRONTEND=m
|
CONFIG_XEN_BLKDEV_FRONTEND=m
|
||||||
CONFIG_XEN_BLKDEV_BACKEND=m
|
CONFIG_XEN_BLKDEV_BACKEND=m
|
||||||
|
@@ -284,8 +284,7 @@ _set_cpu_scheduler() {
|
|||||||
elif [ "$_kver" = "601" ]; then
|
elif [ "$_kver" = "601" ]; then
|
||||||
_avail_cpu_scheds=("cfs" "pds" "bmq" "tt" "bore")
|
_avail_cpu_scheds=("cfs" "pds" "bmq" "tt" "bore")
|
||||||
elif [ "$_kver" = "602" ]; then
|
elif [ "$_kver" = "602" ]; then
|
||||||
_avail_cpu_scheds=("cfs" "pds" "bmq" "tt" "bore")
|
_avail_cpu_scheds=("cfs" "tt" "bore")
|
||||||
_projectc_unoff=1
|
|
||||||
else
|
else
|
||||||
_avail_cpu_scheds=("cfs")
|
_avail_cpu_scheds=("cfs")
|
||||||
fi
|
fi
|
||||||
@@ -723,7 +722,7 @@ _tkg_srcprep() {
|
|||||||
elif [ "$_kver" = "518" ]; then
|
elif [ "$_kver" = "518" ]; then
|
||||||
rev=2
|
rev=2
|
||||||
elif [ "$_kver" = "601" ]; then
|
elif [ "$_kver" = "601" ]; then
|
||||||
rev=3
|
rev=1
|
||||||
else
|
else
|
||||||
rev=0
|
rev=0
|
||||||
fi
|
fi
|
||||||
@@ -1573,13 +1572,9 @@ CONFIG_DEBUG_INFO_BTF_MODULES=y\r
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# NR_CPUS
|
# NR_CPUS
|
||||||
if [ "$_basever" != "601" ]; then
|
if [ -n "$_NR_CPUS_value" ]; then
|
||||||
if [ -n "$_NR_CPUS_value" ]; then
|
scripts/config --set-val "NR_CPUS" "$_NR_CPUS_value"
|
||||||
scripts/config --set-val "NR_CPUS" "$_NR_CPUS_value"
|
_enable "FORCE_NR_CPUS"
|
||||||
_enable "FORCE_NR_CPUS"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
warning "NR_CPUS is bugged on 6.1.y, so your setting was ignored"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
@@ -5,7 +5,7 @@ index 42af9ca0127e..31747ec54f9d 100644
|
|||||||
@@ -5406,6 +5406,12 @@
|
@@ -5406,6 +5406,12 @@
|
||||||
sa1100ir [NET]
|
sa1100ir [NET]
|
||||||
See drivers/net/irda/sa1100_ir.c.
|
See drivers/net/irda/sa1100_ir.c.
|
||||||
|
|
||||||
+ sched_timeslice=
|
+ sched_timeslice=
|
||||||
+ [KNL] Time slice in ms for Project C BMQ/PDS scheduler.
|
+ [KNL] Time slice in ms for Project C BMQ/PDS scheduler.
|
||||||
+ Format: integer 2, 4
|
+ Format: integer 2, 4
|
||||||
@@ -13,14 +13,14 @@ index 42af9ca0127e..31747ec54f9d 100644
|
|||||||
+ See Documentation/scheduler/sched-BMQ.txt
|
+ See Documentation/scheduler/sched-BMQ.txt
|
||||||
+
|
+
|
||||||
sched_verbose [KNL] Enables verbose scheduler debug messages.
|
sched_verbose [KNL] Enables verbose scheduler debug messages.
|
||||||
|
|
||||||
schedstats= [KNL,X86] Enable or disable scheduled statistics.
|
schedstats= [KNL,X86] Enable or disable scheduled statistics.
|
||||||
diff --git a/Documentation/admin-guide/sysctl/kernel.rst b/Documentation/admin-guide/sysctl/kernel.rst
|
diff --git a/Documentation/admin-guide/sysctl/kernel.rst b/Documentation/admin-guide/sysctl/kernel.rst
|
||||||
index 98d1b198b2b4..d7c78a107f93 100644
|
index 98d1b198b2b4..d7c78a107f93 100644
|
||||||
--- a/Documentation/admin-guide/sysctl/kernel.rst
|
--- a/Documentation/admin-guide/sysctl/kernel.rst
|
||||||
+++ b/Documentation/admin-guide/sysctl/kernel.rst
|
+++ b/Documentation/admin-guide/sysctl/kernel.rst
|
||||||
@@ -1552,3 +1552,13 @@ is 10 seconds.
|
@@ -1552,3 +1552,13 @@ is 10 seconds.
|
||||||
|
|
||||||
The softlockup threshold is (``2 * watchdog_thresh``). Setting this
|
The softlockup threshold is (``2 * watchdog_thresh``). Setting this
|
||||||
tunable to zero will disable lockup detection altogether.
|
tunable to zero will disable lockup detection altogether.
|
||||||
+
|
+
|
||||||
@@ -161,7 +161,7 @@ index 9e479d7d202b..2a8530021b23 100644
|
|||||||
+ (unsigned long long)tsk_seruntime(task),
|
+ (unsigned long long)tsk_seruntime(task),
|
||||||
(unsigned long long)task->sched_info.run_delay,
|
(unsigned long long)task->sched_info.run_delay,
|
||||||
task->sched_info.pcount);
|
task->sched_info.pcount);
|
||||||
|
|
||||||
diff --git a/include/asm-generic/resource.h b/include/asm-generic/resource.h
|
diff --git a/include/asm-generic/resource.h b/include/asm-generic/resource.h
|
||||||
index 8874f681b056..59eb72bf7d5f 100644
|
index 8874f681b056..59eb72bf7d5f 100644
|
||||||
--- a/include/asm-generic/resource.h
|
--- a/include/asm-generic/resource.h
|
||||||
@@ -181,7 +181,7 @@ index ffb6eb55cd13..2e730a59caa2 100644
|
|||||||
+++ b/include/linux/sched.h
|
+++ b/include/linux/sched.h
|
||||||
@@ -762,8 +762,14 @@ struct task_struct {
|
@@ -762,8 +762,14 @@ struct task_struct {
|
||||||
unsigned int ptrace;
|
unsigned int ptrace;
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
- int on_cpu;
|
- int on_cpu;
|
||||||
struct __call_single_node wake_entry;
|
struct __call_single_node wake_entry;
|
||||||
@@ -202,11 +202,11 @@ index ffb6eb55cd13..2e730a59caa2 100644
|
|||||||
+#endif /* !CONFIG_SCHED_ALT */
|
+#endif /* !CONFIG_SCHED_ALT */
|
||||||
#endif
|
#endif
|
||||||
int on_rq;
|
int on_rq;
|
||||||
|
|
||||||
@@ -785,6 +792,20 @@ struct task_struct {
|
@@ -785,6 +792,20 @@ struct task_struct {
|
||||||
int normal_prio;
|
int normal_prio;
|
||||||
unsigned int rt_priority;
|
unsigned int rt_priority;
|
||||||
|
|
||||||
+#ifdef CONFIG_SCHED_ALT
|
+#ifdef CONFIG_SCHED_ALT
|
||||||
+ u64 last_ran;
|
+ u64 last_ran;
|
||||||
+ s64 time_slice;
|
+ s64 time_slice;
|
||||||
@@ -229,13 +229,13 @@ index ffb6eb55cd13..2e730a59caa2 100644
|
|||||||
unsigned int core_occupation;
|
unsigned int core_occupation;
|
||||||
#endif
|
#endif
|
||||||
+#endif /* !CONFIG_SCHED_ALT */
|
+#endif /* !CONFIG_SCHED_ALT */
|
||||||
|
|
||||||
#ifdef CONFIG_CGROUP_SCHED
|
#ifdef CONFIG_CGROUP_SCHED
|
||||||
struct task_group *sched_task_group;
|
struct task_group *sched_task_group;
|
||||||
@@ -1545,6 +1567,15 @@ struct task_struct {
|
@@ -1545,6 +1567,15 @@ struct task_struct {
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
+#ifdef CONFIG_SCHED_ALT
|
+#ifdef CONFIG_SCHED_ALT
|
||||||
+#define tsk_seruntime(t) ((t)->sched_time)
|
+#define tsk_seruntime(t) ((t)->sched_time)
|
||||||
+/* replace the uncertian rt_timeout with 0UL */
|
+/* replace the uncertian rt_timeout with 0UL */
|
||||||
@@ -254,7 +254,7 @@ index 7c83d4d5a971..fa30f98cb2be 100644
|
|||||||
+++ b/include/linux/sched/deadline.h
|
+++ b/include/linux/sched/deadline.h
|
||||||
@@ -1,5 +1,24 @@
|
@@ -1,5 +1,24 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
|
||||||
+#ifdef CONFIG_SCHED_ALT
|
+#ifdef CONFIG_SCHED_ALT
|
||||||
+
|
+
|
||||||
+static inline int dl_task(struct task_struct *p)
|
+static inline int dl_task(struct task_struct *p)
|
||||||
@@ -282,7 +282,7 @@ index 7c83d4d5a971..fa30f98cb2be 100644
|
|||||||
return dl_prio(p->prio);
|
return dl_prio(p->prio);
|
||||||
}
|
}
|
||||||
+#endif /* CONFIG_SCHED_ALT */
|
+#endif /* CONFIG_SCHED_ALT */
|
||||||
|
|
||||||
static inline bool dl_time_before(u64 a, u64 b)
|
static inline bool dl_time_before(u64 a, u64 b)
|
||||||
{
|
{
|
||||||
diff --git a/include/linux/sched/prio.h b/include/linux/sched/prio.h
|
diff --git a/include/linux/sched/prio.h b/include/linux/sched/prio.h
|
||||||
@@ -292,7 +292,7 @@ index ab83d85e1183..6af9ae681116 100644
|
|||||||
@@ -18,6 +18,32 @@
|
@@ -18,6 +18,32 @@
|
||||||
#define MAX_PRIO (MAX_RT_PRIO + NICE_WIDTH)
|
#define MAX_PRIO (MAX_RT_PRIO + NICE_WIDTH)
|
||||||
#define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2)
|
#define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2)
|
||||||
|
|
||||||
+#ifdef CONFIG_SCHED_ALT
|
+#ifdef CONFIG_SCHED_ALT
|
||||||
+
|
+
|
||||||
+/* Undefine MAX_PRIO and DEFAULT_PRIO */
|
+/* Undefine MAX_PRIO and DEFAULT_PRIO */
|
||||||
@@ -327,7 +327,7 @@ index 994c25640e15..8c050a59ece1 100644
|
|||||||
--- a/include/linux/sched/rt.h
|
--- a/include/linux/sched/rt.h
|
||||||
+++ b/include/linux/sched/rt.h
|
+++ b/include/linux/sched/rt.h
|
||||||
@@ -24,8 +24,10 @@ static inline bool task_is_realtime(struct task_struct *tsk)
|
@@ -24,8 +24,10 @@ static inline bool task_is_realtime(struct task_struct *tsk)
|
||||||
|
|
||||||
if (policy == SCHED_FIFO || policy == SCHED_RR)
|
if (policy == SCHED_FIFO || policy == SCHED_RR)
|
||||||
return true;
|
return true;
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
@@ -336,15 +336,15 @@ index 994c25640e15..8c050a59ece1 100644
|
|||||||
+#endif
|
+#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h
|
diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h
|
||||||
index 816df6cc444e..c8da08e18c91 100644
|
index 816df6cc444e..c8da08e18c91 100644
|
||||||
--- a/include/linux/sched/topology.h
|
--- a/include/linux/sched/topology.h
|
||||||
+++ b/include/linux/sched/topology.h
|
+++ b/include/linux/sched/topology.h
|
||||||
@@ -234,7 +234,8 @@ static inline bool cpus_share_cache(int this_cpu, int that_cpu)
|
@@ -234,7 +234,8 @@ static inline bool cpus_share_cache(int this_cpu, int that_cpu)
|
||||||
|
|
||||||
#endif /* !CONFIG_SMP */
|
#endif /* !CONFIG_SMP */
|
||||||
|
|
||||||
-#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
|
-#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
|
||||||
+#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) && \
|
+#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) && \
|
||||||
+ !defined(CONFIG_SCHED_ALT)
|
+ !defined(CONFIG_SCHED_ALT)
|
||||||
@@ -364,9 +364,9 @@ index 94125d3b6893..c87ba766d354 100644
|
|||||||
This feature enables the scheduler to track the clamped utilization
|
This feature enables the scheduler to track the clamped utilization
|
||||||
of each CPU based on RUNNABLE tasks scheduled on that CPU.
|
of each CPU based on RUNNABLE tasks scheduled on that CPU.
|
||||||
@@ -865,6 +866,35 @@ config UCLAMP_BUCKETS_COUNT
|
@@ -865,6 +866,35 @@ config UCLAMP_BUCKETS_COUNT
|
||||||
|
|
||||||
If in doubt, use the default value.
|
If in doubt, use the default value.
|
||||||
|
|
||||||
+menuconfig SCHED_ALT
|
+menuconfig SCHED_ALT
|
||||||
+ bool "Alternative CPU Schedulers"
|
+ bool "Alternative CPU Schedulers"
|
||||||
+ default y
|
+ default y
|
||||||
@@ -397,7 +397,7 @@ index 94125d3b6893..c87ba766d354 100644
|
|||||||
+endif
|
+endif
|
||||||
+
|
+
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -918,6 +948,7 @@ config NUMA_BALANCING
|
@@ -918,6 +948,7 @@ config NUMA_BALANCING
|
||||||
depends on ARCH_SUPPORTS_NUMA_BALANCING
|
depends on ARCH_SUPPORTS_NUMA_BALANCING
|
||||||
@@ -410,7 +410,7 @@ index 94125d3b6893..c87ba766d354 100644
|
|||||||
@@ -1015,6 +1046,7 @@ config FAIR_GROUP_SCHED
|
@@ -1015,6 +1046,7 @@ config FAIR_GROUP_SCHED
|
||||||
depends on CGROUP_SCHED
|
depends on CGROUP_SCHED
|
||||||
default CGROUP_SCHED
|
default CGROUP_SCHED
|
||||||
|
|
||||||
+if !SCHED_ALT
|
+if !SCHED_ALT
|
||||||
config CFS_BANDWIDTH
|
config CFS_BANDWIDTH
|
||||||
bool "CPU bandwidth provisioning for FAIR_GROUP_SCHED"
|
bool "CPU bandwidth provisioning for FAIR_GROUP_SCHED"
|
||||||
@@ -418,13 +418,13 @@ index 94125d3b6893..c87ba766d354 100644
|
|||||||
@@ -1037,6 +1069,7 @@ config RT_GROUP_SCHED
|
@@ -1037,6 +1069,7 @@ config RT_GROUP_SCHED
|
||||||
realtime bandwidth for them.
|
realtime bandwidth for them.
|
||||||
See Documentation/scheduler/sched-rt-group.rst for more information.
|
See Documentation/scheduler/sched-rt-group.rst for more information.
|
||||||
|
|
||||||
+endif #!SCHED_ALT
|
+endif #!SCHED_ALT
|
||||||
endif #CGROUP_SCHED
|
endif #CGROUP_SCHED
|
||||||
|
|
||||||
config UCLAMP_TASK_GROUP
|
config UCLAMP_TASK_GROUP
|
||||||
@@ -1281,6 +1314,7 @@ config CHECKPOINT_RESTORE
|
@@ -1281,6 +1314,7 @@ config CHECKPOINT_RESTORE
|
||||||
|
|
||||||
config SCHED_AUTOGROUP
|
config SCHED_AUTOGROUP
|
||||||
bool "Automatic process group scheduling"
|
bool "Automatic process group scheduling"
|
||||||
+ depends on !SCHED_ALT
|
+ depends on !SCHED_ALT
|
||||||
@@ -482,7 +482,7 @@ index c2f1fd95a821..41654679b1b2 100644
|
|||||||
--- a/kernel/Kconfig.preempt
|
--- a/kernel/Kconfig.preempt
|
||||||
+++ b/kernel/Kconfig.preempt
|
+++ b/kernel/Kconfig.preempt
|
||||||
@@ -117,7 +117,7 @@ config PREEMPT_DYNAMIC
|
@@ -117,7 +117,7 @@ config PREEMPT_DYNAMIC
|
||||||
|
|
||||||
config SCHED_CORE
|
config SCHED_CORE
|
||||||
bool "Core Scheduling for SMT"
|
bool "Core Scheduling for SMT"
|
||||||
- depends on SCHED_SMT
|
- depends on SCHED_SMT
|
||||||
@@ -497,7 +497,7 @@ index b474289c15b8..a23224b45b03 100644
|
|||||||
@@ -787,7 +787,7 @@ static int validate_change(struct cpuset *cur, struct cpuset *trial)
|
@@ -787,7 +787,7 @@ static int validate_change(struct cpuset *cur, struct cpuset *trial)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
-#ifdef CONFIG_SMP
|
-#ifdef CONFIG_SMP
|
||||||
+#if defined(CONFIG_SMP) && !defined(CONFIG_SCHED_ALT)
|
+#if defined(CONFIG_SMP) && !defined(CONFIG_SCHED_ALT)
|
||||||
/*
|
/*
|
||||||
@@ -522,9 +522,9 @@ index e39cb696cfbd..463423572e09 100644
|
|||||||
t2 = tsk->sched_info.run_delay;
|
t2 = tsk->sched_info.run_delay;
|
||||||
- t3 = tsk->se.sum_exec_runtime;
|
- t3 = tsk->se.sum_exec_runtime;
|
||||||
+ t3 = tsk_seruntime(tsk);
|
+ t3 = tsk_seruntime(tsk);
|
||||||
|
|
||||||
d->cpu_count += t1;
|
d->cpu_count += t1;
|
||||||
|
|
||||||
diff --git a/kernel/exit.c b/kernel/exit.c
|
diff --git a/kernel/exit.c b/kernel/exit.c
|
||||||
index 35e0a31a0315..64e368441cf4 100644
|
index 35e0a31a0315..64e368441cf4 100644
|
||||||
--- a/kernel/exit.c
|
--- a/kernel/exit.c
|
||||||
@@ -532,11 +532,11 @@ index 35e0a31a0315..64e368441cf4 100644
|
|||||||
@@ -125,7 +125,7 @@ static void __exit_signal(struct task_struct *tsk)
|
@@ -125,7 +125,7 @@ static void __exit_signal(struct task_struct *tsk)
|
||||||
sig->curr_target = next_thread(tsk);
|
sig->curr_target = next_thread(tsk);
|
||||||
}
|
}
|
||||||
|
|
||||||
- add_device_randomness((const void*) &tsk->se.sum_exec_runtime,
|
- add_device_randomness((const void*) &tsk->se.sum_exec_runtime,
|
||||||
+ add_device_randomness((const void*) &tsk_seruntime(tsk),
|
+ add_device_randomness((const void*) &tsk_seruntime(tsk),
|
||||||
sizeof(unsigned long long));
|
sizeof(unsigned long long));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -146,7 +146,7 @@ static void __exit_signal(struct task_struct *tsk)
|
@@ -146,7 +146,7 @@ static void __exit_signal(struct task_struct *tsk)
|
||||||
sig->inblock += task_io_get_inblock(tsk);
|
sig->inblock += task_io_get_inblock(tsk);
|
||||||
@@ -558,14 +558,14 @@ index 7779ee8abc2a..5b9893cdfb1b 100644
|
|||||||
- waiter->deadline = task->dl.deadline;
|
- waiter->deadline = task->dl.deadline;
|
||||||
+ waiter->deadline = __tsk_deadline(task);
|
+ waiter->deadline = __tsk_deadline(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only use with rt_mutex_waiter_{less,equal}()
|
* Only use with rt_mutex_waiter_{less,equal}()
|
||||||
*/
|
*/
|
||||||
#define task_to_waiter(p) \
|
#define task_to_waiter(p) \
|
||||||
- &(struct rt_mutex_waiter){ .prio = __waiter_prio(p), .deadline = (p)->dl.deadline }
|
- &(struct rt_mutex_waiter){ .prio = __waiter_prio(p), .deadline = (p)->dl.deadline }
|
||||||
+ &(struct rt_mutex_waiter){ .prio = __waiter_prio(p), .deadline = __tsk_deadline(p) }
|
+ &(struct rt_mutex_waiter){ .prio = __waiter_prio(p), .deadline = __tsk_deadline(p) }
|
||||||
|
|
||||||
static __always_inline int rt_mutex_waiter_less(struct rt_mutex_waiter *left,
|
static __always_inline int rt_mutex_waiter_less(struct rt_mutex_waiter *left,
|
||||||
struct rt_mutex_waiter *right)
|
struct rt_mutex_waiter *right)
|
||||||
{
|
{
|
||||||
@@ -574,7 +574,7 @@ index 7779ee8abc2a..5b9893cdfb1b 100644
|
|||||||
+#else
|
+#else
|
||||||
if (left->prio < right->prio)
|
if (left->prio < right->prio)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_BMQ
|
+#ifndef CONFIG_SCHED_BMQ
|
||||||
/*
|
/*
|
||||||
* If both waiters have dl_prio(), we check the deadlines of the
|
* If both waiters have dl_prio(), we check the deadlines of the
|
||||||
@@ -584,11 +584,11 @@ index 7779ee8abc2a..5b9893cdfb1b 100644
|
|||||||
if (dl_prio(left->prio))
|
if (dl_prio(left->prio))
|
||||||
return dl_time_before(left->deadline, right->deadline);
|
return dl_time_before(left->deadline, right->deadline);
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
+#endif
|
+#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static __always_inline int rt_mutex_waiter_equal(struct rt_mutex_waiter *left,
|
static __always_inline int rt_mutex_waiter_equal(struct rt_mutex_waiter *left,
|
||||||
struct rt_mutex_waiter *right)
|
struct rt_mutex_waiter *right)
|
||||||
{
|
{
|
||||||
@@ -597,7 +597,7 @@ index 7779ee8abc2a..5b9893cdfb1b 100644
|
|||||||
+#else
|
+#else
|
||||||
if (left->prio != right->prio)
|
if (left->prio != right->prio)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_BMQ
|
+#ifndef CONFIG_SCHED_BMQ
|
||||||
/*
|
/*
|
||||||
* If both waiters have dl_prio(), we check the deadlines of the
|
* If both waiters have dl_prio(), we check the deadlines of the
|
||||||
@@ -607,11 +607,11 @@ index 7779ee8abc2a..5b9893cdfb1b 100644
|
|||||||
if (dl_prio(left->prio))
|
if (dl_prio(left->prio))
|
||||||
return left->deadline == right->deadline;
|
return left->deadline == right->deadline;
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
+#endif
|
+#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool rt_mutex_steal(struct rt_mutex_waiter *waiter,
|
static inline bool rt_mutex_steal(struct rt_mutex_waiter *waiter,
|
||||||
diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile
|
diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile
|
||||||
index 976092b7bd45..31d587c16ec1 100644
|
index 976092b7bd45..31d587c16ec1 100644
|
||||||
@@ -632,10 +632,10 @@ index 976092b7bd45..31d587c16ec1 100644
|
|||||||
obj-y += build_utility.o
|
obj-y += build_utility.o
|
||||||
diff --git a/kernel/sched/alt_core.c b/kernel/sched/alt_core.c
|
diff --git a/kernel/sched/alt_core.c b/kernel/sched/alt_core.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 000000000000..acb8657e811d
|
index 000000000000..572eab74418f
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/kernel/sched/alt_core.c
|
+++ b/kernel/sched/alt_core.c
|
||||||
@@ -0,0 +1,7978 @@
|
@@ -0,0 +1,7961 @@
|
||||||
+/*
|
+/*
|
||||||
+ * kernel/sched/alt_core.c
|
+ * kernel/sched/alt_core.c
|
||||||
+ *
|
+ *
|
||||||
@@ -665,6 +665,7 @@ index 000000000000..acb8657e811d
|
|||||||
+#include <linux/init_task.h>
|
+#include <linux/init_task.h>
|
||||||
+#include <linux/kcov.h>
|
+#include <linux/kcov.h>
|
||||||
+#include <linux/kprobes.h>
|
+#include <linux/kprobes.h>
|
||||||
|
+#include <linux/profile.h>
|
||||||
+#include <linux/nmi.h>
|
+#include <linux/nmi.h>
|
||||||
+#include <linux/scs.h>
|
+#include <linux/scs.h>
|
||||||
+
|
+
|
||||||
@@ -705,7 +706,7 @@ index 000000000000..acb8657e811d
|
|||||||
+#define sched_feat(x) (0)
|
+#define sched_feat(x) (0)
|
||||||
+#endif /* CONFIG_SCHED_DEBUG */
|
+#endif /* CONFIG_SCHED_DEBUG */
|
||||||
+
|
+
|
||||||
+#define ALT_SCHED_VERSION "v6.1-r3"
|
+#define ALT_SCHED_VERSION "v6.1-r1"
|
||||||
+
|
+
|
||||||
+/* rt_prio(prio) defined in include/linux/sched/rt.h */
|
+/* rt_prio(prio) defined in include/linux/sched/rt.h */
|
||||||
+#define rt_task(p) rt_prio((p)->prio)
|
+#define rt_task(p) rt_prio((p)->prio)
|
||||||
@@ -814,14 +815,14 @@ index 000000000000..acb8657e811d
|
|||||||
+clear_recorded_preempt_mask(int pr, int low, int high, int cpu)
|
+clear_recorded_preempt_mask(int pr, int low, int high, int cpu)
|
||||||
+{
|
+{
|
||||||
+ if (low < pr && pr <= high)
|
+ if (low < pr && pr <= high)
|
||||||
+ cpumask_clear_cpu(cpu, sched_preempt_mask + SCHED_QUEUE_BITS - pr);
|
+ cpumask_clear_cpu(cpu, sched_preempt_mask + SCHED_QUEUE_BITS - 1 - pr);
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+static inline void
|
+static inline void
|
||||||
+set_recorded_preempt_mask(int pr, int low, int high, int cpu)
|
+set_recorded_preempt_mask(int pr, int low, int high, int cpu)
|
||||||
+{
|
+{
|
||||||
+ if (low < pr && pr <= high)
|
+ if (low < pr && pr <= high)
|
||||||
+ cpumask_set_cpu(cpu, sched_preempt_mask + SCHED_QUEUE_BITS - pr);
|
+ cpumask_set_cpu(cpu, sched_preempt_mask + SCHED_QUEUE_BITS - 1 - pr);
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+static atomic_t sched_prio_record = ATOMIC_INIT(0);
|
+static atomic_t sched_prio_record = ATOMIC_INIT(0);
|
||||||
@@ -1391,8 +1392,8 @@ index 000000000000..acb8657e811d
|
|||||||
+ * Context: rq->lock
|
+ * Context: rq->lock
|
||||||
+ */
|
+ */
|
||||||
+#define __SCHED_DEQUEUE_TASK(p, rq, flags) \
|
+#define __SCHED_DEQUEUE_TASK(p, rq, flags) \
|
||||||
+ sched_info_dequeue(rq, p); \
|
|
||||||
+ psi_dequeue(p, flags & DEQUEUE_SLEEP); \
|
+ psi_dequeue(p, flags & DEQUEUE_SLEEP); \
|
||||||
|
+ sched_info_dequeue(rq, p); \
|
||||||
+ \
|
+ \
|
||||||
+ list_del(&p->sq_node); \
|
+ list_del(&p->sq_node); \
|
||||||
+ if (list_empty(&rq->queue.heads[p->sq_idx])) \
|
+ if (list_empty(&rq->queue.heads[p->sq_idx])) \
|
||||||
@@ -2029,13 +2030,11 @@ index 000000000000..acb8657e811d
|
|||||||
+
|
+
|
||||||
+ WARN_ON_ONCE(is_migration_disabled(p));
|
+ WARN_ON_ONCE(is_migration_disabled(p));
|
||||||
+#endif
|
+#endif
|
||||||
|
+ if (task_cpu(p) == new_cpu)
|
||||||
|
+ return;
|
||||||
+ trace_sched_migrate_task(p, new_cpu);
|
+ trace_sched_migrate_task(p, new_cpu);
|
||||||
+
|
+ rseq_migrate(p);
|
||||||
+ if (task_cpu(p) != new_cpu)
|
+ perf_event_task_migrate(p);
|
||||||
+ {
|
|
||||||
+ rseq_migrate(p);
|
|
||||||
+ perf_event_task_migrate(p);
|
|
||||||
+ }
|
|
||||||
+
|
+
|
||||||
+ __set_task_cpu(p, new_cpu);
|
+ __set_task_cpu(p, new_cpu);
|
||||||
+}
|
+}
|
||||||
@@ -5111,15 +5110,15 @@ index 000000000000..acb8657e811d
|
|||||||
+ if (src_rq->nr_running < 2)
|
+ if (src_rq->nr_running < 2)
|
||||||
+ cpumask_clear_cpu(i, &sched_rq_pending_mask);
|
+ cpumask_clear_cpu(i, &sched_rq_pending_mask);
|
||||||
+
|
+
|
||||||
+ spin_release(&src_rq->lock.dep_map, _RET_IP_);
|
|
||||||
+ do_raw_spin_unlock(&src_rq->lock);
|
|
||||||
+
|
|
||||||
+ rq->nr_running += nr_migrated;
|
+ rq->nr_running += nr_migrated;
|
||||||
+ if (rq->nr_running > 1)
|
+ if (rq->nr_running > 1)
|
||||||
+ cpumask_set_cpu(cpu, &sched_rq_pending_mask);
|
+ cpumask_set_cpu(cpu, &sched_rq_pending_mask);
|
||||||
+
|
+
|
||||||
+ cpufreq_update_util(rq, 0);
|
+ cpufreq_update_util(rq, 0);
|
||||||
+
|
+
|
||||||
|
+ spin_release(&src_rq->lock.dep_map, _RET_IP_);
|
||||||
|
+ do_raw_spin_unlock(&src_rq->lock);
|
||||||
|
+
|
||||||
+ return 1;
|
+ return 1;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
@@ -5148,7 +5147,7 @@ index 000000000000..acb8657e811d
|
|||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+static inline struct task_struct *
|
+static inline struct task_struct *
|
||||||
+choose_next_task(struct rq *rq, int cpu)
|
+choose_next_task(struct rq *rq, int cpu, struct task_struct *prev)
|
||||||
+{
|
+{
|
||||||
+ struct task_struct *next;
|
+ struct task_struct *next;
|
||||||
+
|
+
|
||||||
@@ -5335,7 +5334,7 @@ index 000000000000..acb8657e811d
|
|||||||
+
|
+
|
||||||
+ check_curr(prev, rq);
|
+ check_curr(prev, rq);
|
||||||
+
|
+
|
||||||
+ next = choose_next_task(rq, cpu);
|
+ next = choose_next_task(rq, cpu, prev);
|
||||||
+ clear_tsk_need_resched(prev);
|
+ clear_tsk_need_resched(prev);
|
||||||
+ clear_preempt_need_resched();
|
+ clear_preempt_need_resched();
|
||||||
+#ifdef CONFIG_SCHED_DEBUG
|
+#ifdef CONFIG_SCHED_DEBUG
|
||||||
@@ -5765,7 +5764,6 @@ index 000000000000..acb8657e811d
|
|||||||
+ return;
|
+ return;
|
||||||
+
|
+
|
||||||
+ rq = __task_access_lock(p, &lock);
|
+ rq = __task_access_lock(p, &lock);
|
||||||
+ update_rq_clock(rq);
|
|
||||||
+ /*
|
+ /*
|
||||||
+ * Set under pi_lock && rq->lock, such that the value can be used under
|
+ * Set under pi_lock && rq->lock, such that the value can be used under
|
||||||
+ * either lock.
|
+ * either lock.
|
||||||
@@ -6645,13 +6643,6 @@ index 000000000000..acb8657e811d
|
|||||||
+ return retval;
|
+ return retval;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+#ifdef CONFIG_SMP
|
|
||||||
+int dl_task_check_affinity(struct task_struct *p, const struct cpumask *mask)
|
|
||||||
+{
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+static int
|
+static int
|
||||||
+__sched_setaffinity(struct task_struct *p, const struct cpumask *mask)
|
+__sched_setaffinity(struct task_struct *p, const struct cpumask *mask)
|
||||||
+{
|
+{
|
||||||
@@ -8036,14 +8027,6 @@ index 000000000000..acb8657e811d
|
|||||||
+
|
+
|
||||||
+ sched_smp_initialized = true;
|
+ sched_smp_initialized = true;
|
||||||
+}
|
+}
|
||||||
+
|
|
||||||
+static int __init migration_init(void)
|
|
||||||
+{
|
|
||||||
+ sched_cpu_starting(smp_processor_id());
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+early_initcall(migration_init);
|
|
||||||
+
|
|
||||||
+#else
|
+#else
|
||||||
+void __init sched_init_smp(void)
|
+void __init sched_init_smp(void)
|
||||||
+{
|
+{
|
||||||
@@ -8653,15 +8636,14 @@ index 000000000000..1212a031700e
|
|||||||
+{}
|
+{}
|
||||||
diff --git a/kernel/sched/alt_sched.h b/kernel/sched/alt_sched.h
|
diff --git a/kernel/sched/alt_sched.h b/kernel/sched/alt_sched.h
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 000000000000..c32403ed82b6
|
index 000000000000..e3b6320a397a
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/kernel/sched/alt_sched.h
|
+++ b/kernel/sched/alt_sched.h
|
||||||
@@ -0,0 +1,668 @@
|
@@ -0,0 +1,667 @@
|
||||||
+#ifndef ALT_SCHED_H
|
+#ifndef ALT_SCHED_H
|
||||||
+#define ALT_SCHED_H
|
+#define ALT_SCHED_H
|
||||||
+
|
+
|
||||||
+#include <linux/context_tracking.h>
|
+#include <linux/context_tracking.h>
|
||||||
+#include <linux/profile.h>
|
|
||||||
+#include <linux/psi.h>
|
+#include <linux/psi.h>
|
||||||
+#include <linux/stop_machine.h>
|
+#include <linux/stop_machine.h>
|
||||||
+#include <linux/syscalls.h>
|
+#include <linux/syscalls.h>
|
||||||
@@ -9446,23 +9428,23 @@ index d9dc9ab3773f..71a25540d65e 100644
|
|||||||
--- a/kernel/sched/build_policy.c
|
--- a/kernel/sched/build_policy.c
|
||||||
+++ b/kernel/sched/build_policy.c
|
+++ b/kernel/sched/build_policy.c
|
||||||
@@ -42,13 +42,19 @@
|
@@ -42,13 +42,19 @@
|
||||||
|
|
||||||
#include "idle.c"
|
#include "idle.c"
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
#include "rt.c"
|
#include "rt.c"
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
# include "cpudeadline.c"
|
# include "cpudeadline.c"
|
||||||
+#endif
|
+#endif
|
||||||
# include "pelt.c"
|
# include "pelt.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cputime.c"
|
#include "cputime.c"
|
||||||
-#include "deadline.c"
|
-#include "deadline.c"
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
+#include "deadline.c"
|
+#include "deadline.c"
|
||||||
+#endif
|
+#endif
|
||||||
@@ -9471,7 +9453,7 @@ index 99bdd96f454f..23f80a86d2d7 100644
|
|||||||
--- a/kernel/sched/build_utility.c
|
--- a/kernel/sched/build_utility.c
|
||||||
+++ b/kernel/sched/build_utility.c
|
+++ b/kernel/sched/build_utility.c
|
||||||
@@ -85,7 +85,9 @@
|
@@ -85,7 +85,9 @@
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
# include "cpupri.c"
|
# include "cpupri.c"
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
@@ -9479,14 +9461,14 @@ index 99bdd96f454f..23f80a86d2d7 100644
|
|||||||
+#endif
|
+#endif
|
||||||
# include "topology.c"
|
# include "topology.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
|
diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
|
||||||
index 1207c78f85c1..68812e0756cb 100644
|
index 1207c78f85c1..68812e0756cb 100644
|
||||||
--- a/kernel/sched/cpufreq_schedutil.c
|
--- a/kernel/sched/cpufreq_schedutil.c
|
||||||
+++ b/kernel/sched/cpufreq_schedutil.c
|
+++ b/kernel/sched/cpufreq_schedutil.c
|
||||||
@@ -159,9 +159,14 @@ static void sugov_get_util(struct sugov_cpu *sg_cpu)
|
@@ -159,9 +159,14 @@ static void sugov_get_util(struct sugov_cpu *sg_cpu)
|
||||||
struct rq *rq = cpu_rq(sg_cpu->cpu);
|
struct rq *rq = cpu_rq(sg_cpu->cpu);
|
||||||
|
|
||||||
sg_cpu->max = arch_scale_cpu_capacity(sg_cpu->cpu);
|
sg_cpu->max = arch_scale_cpu_capacity(sg_cpu->cpu);
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
sg_cpu->bw_dl = cpu_bw_dl(rq);
|
sg_cpu->bw_dl = cpu_bw_dl(rq);
|
||||||
@@ -9497,7 +9479,7 @@ index 1207c78f85c1..68812e0756cb 100644
|
|||||||
+ sg_cpu->util = rq_load_util(rq, sg_cpu->max);
|
+ sg_cpu->util = rq_load_util(rq, sg_cpu->max);
|
||||||
+#endif /* CONFIG_SCHED_ALT */
|
+#endif /* CONFIG_SCHED_ALT */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -305,8 +310,10 @@ static inline bool sugov_cpu_is_busy(struct sugov_cpu *sg_cpu) { return false; }
|
@@ -305,8 +310,10 @@ static inline bool sugov_cpu_is_busy(struct sugov_cpu *sg_cpu) { return false; }
|
||||||
*/
|
*/
|
||||||
@@ -9508,11 +9490,11 @@ index 1207c78f85c1..68812e0756cb 100644
|
|||||||
sg_cpu->sg_policy->limits_changed = true;
|
sg_cpu->sg_policy->limits_changed = true;
|
||||||
+#endif
|
+#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool sugov_update_single_common(struct sugov_cpu *sg_cpu,
|
static inline bool sugov_update_single_common(struct sugov_cpu *sg_cpu,
|
||||||
@@ -606,6 +613,7 @@ static int sugov_kthread_create(struct sugov_policy *sg_policy)
|
@@ -606,6 +613,7 @@ static int sugov_kthread_create(struct sugov_policy *sg_policy)
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = sched_setattr_nocheck(thread, &attr);
|
ret = sched_setattr_nocheck(thread, &attr);
|
||||||
+
|
+
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@@ -9527,7 +9509,7 @@ index 1207c78f85c1..68812e0756cb 100644
|
|||||||
+#endif /* CONFIG_SCHED_ALT */
|
+#endif /* CONFIG_SCHED_ALT */
|
||||||
}
|
}
|
||||||
static DECLARE_WORK(rebuild_sd_work, rebuild_sd_workfn);
|
static DECLARE_WORK(rebuild_sd_work, rebuild_sd_workfn);
|
||||||
|
|
||||||
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
|
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
|
||||||
index 95fc77853743..b48b3f9ed47f 100644
|
index 95fc77853743..b48b3f9ed47f 100644
|
||||||
--- a/kernel/sched/cputime.c
|
--- a/kernel/sched/cputime.c
|
||||||
@@ -9535,15 +9517,15 @@ index 95fc77853743..b48b3f9ed47f 100644
|
|||||||
@@ -122,7 +122,7 @@ void account_user_time(struct task_struct *p, u64 cputime)
|
@@ -122,7 +122,7 @@ void account_user_time(struct task_struct *p, u64 cputime)
|
||||||
p->utime += cputime;
|
p->utime += cputime;
|
||||||
account_group_user_time(p, cputime);
|
account_group_user_time(p, cputime);
|
||||||
|
|
||||||
- index = (task_nice(p) > 0) ? CPUTIME_NICE : CPUTIME_USER;
|
- index = (task_nice(p) > 0) ? CPUTIME_NICE : CPUTIME_USER;
|
||||||
+ index = task_running_nice(p) ? CPUTIME_NICE : CPUTIME_USER;
|
+ index = task_running_nice(p) ? CPUTIME_NICE : CPUTIME_USER;
|
||||||
|
|
||||||
/* Add user time to cpustat. */
|
/* Add user time to cpustat. */
|
||||||
task_group_account_field(p, index, cputime);
|
task_group_account_field(p, index, cputime);
|
||||||
@@ -146,7 +146,7 @@ void account_guest_time(struct task_struct *p, u64 cputime)
|
@@ -146,7 +146,7 @@ void account_guest_time(struct task_struct *p, u64 cputime)
|
||||||
p->gtime += cputime;
|
p->gtime += cputime;
|
||||||
|
|
||||||
/* Add guest time to cpustat. */
|
/* Add guest time to cpustat. */
|
||||||
- if (task_nice(p) > 0) {
|
- if (task_nice(p) > 0) {
|
||||||
+ if (task_running_nice(p)) {
|
+ if (task_running_nice(p)) {
|
||||||
@@ -9561,12 +9543,12 @@ index 95fc77853743..b48b3f9ed47f 100644
|
|||||||
static u64 read_sum_exec_runtime(struct task_struct *t)
|
static u64 read_sum_exec_runtime(struct task_struct *t)
|
||||||
@@ -294,7 +294,7 @@ static u64 read_sum_exec_runtime(struct task_struct *t)
|
@@ -294,7 +294,7 @@ static u64 read_sum_exec_runtime(struct task_struct *t)
|
||||||
struct rq *rq;
|
struct rq *rq;
|
||||||
|
|
||||||
rq = task_rq_lock(t, &rf);
|
rq = task_rq_lock(t, &rf);
|
||||||
- ns = t->se.sum_exec_runtime;
|
- ns = t->se.sum_exec_runtime;
|
||||||
+ ns = tsk_seruntime(t);
|
+ ns = tsk_seruntime(t);
|
||||||
task_rq_unlock(rq, t, &rf);
|
task_rq_unlock(rq, t, &rf);
|
||||||
|
|
||||||
return ns;
|
return ns;
|
||||||
@@ -626,7 +626,7 @@ void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev,
|
@@ -626,7 +626,7 @@ void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev,
|
||||||
void task_cputime_adjusted(struct task_struct *p, u64 *ut, u64 *st)
|
void task_cputime_adjusted(struct task_struct *p, u64 *ut, u64 *st)
|
||||||
@@ -9575,7 +9557,7 @@ index 95fc77853743..b48b3f9ed47f 100644
|
|||||||
- .sum_exec_runtime = p->se.sum_exec_runtime,
|
- .sum_exec_runtime = p->se.sum_exec_runtime,
|
||||||
+ .sum_exec_runtime = tsk_seruntime(p),
|
+ .sum_exec_runtime = tsk_seruntime(p),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (task_cputime(p, &cputime.utime, &cputime.stime))
|
if (task_cputime(p, &cputime.utime, &cputime.stime))
|
||||||
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
|
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
|
||||||
index 1637b65ba07a..033c6deeb515 100644
|
index 1637b65ba07a..033c6deeb515 100644
|
||||||
@@ -9584,39 +9566,39 @@ index 1637b65ba07a..033c6deeb515 100644
|
|||||||
@@ -7,6 +7,7 @@
|
@@ -7,6 +7,7 @@
|
||||||
* Copyright(C) 2007, Red Hat, Inc., Ingo Molnar
|
* Copyright(C) 2007, Red Hat, Inc., Ingo Molnar
|
||||||
*/
|
*/
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
/*
|
/*
|
||||||
* This allows printing both to /proc/sched_debug and
|
* This allows printing both to /proc/sched_debug and
|
||||||
* to the console
|
* to the console
|
||||||
@@ -215,6 +216,7 @@ static const struct file_operations sched_scaling_fops = {
|
@@ -215,6 +216,7 @@ static const struct file_operations sched_scaling_fops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* SMP */
|
#endif /* SMP */
|
||||||
+#endif /* !CONFIG_SCHED_ALT */
|
+#endif /* !CONFIG_SCHED_ALT */
|
||||||
|
|
||||||
#ifdef CONFIG_PREEMPT_DYNAMIC
|
#ifdef CONFIG_PREEMPT_DYNAMIC
|
||||||
|
|
||||||
@@ -278,6 +280,7 @@ static const struct file_operations sched_dynamic_fops = {
|
@@ -278,6 +280,7 @@ static const struct file_operations sched_dynamic_fops = {
|
||||||
|
|
||||||
#endif /* CONFIG_PREEMPT_DYNAMIC */
|
#endif /* CONFIG_PREEMPT_DYNAMIC */
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
__read_mostly bool sched_debug_verbose;
|
__read_mostly bool sched_debug_verbose;
|
||||||
|
|
||||||
static const struct seq_operations sched_debug_sops;
|
static const struct seq_operations sched_debug_sops;
|
||||||
@@ -293,6 +296,7 @@ static const struct file_operations sched_debug_fops = {
|
@@ -293,6 +296,7 @@ static const struct file_operations sched_debug_fops = {
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = seq_release,
|
.release = seq_release,
|
||||||
};
|
};
|
||||||
+#endif /* !CONFIG_SCHED_ALT */
|
+#endif /* !CONFIG_SCHED_ALT */
|
||||||
|
|
||||||
static struct dentry *debugfs_sched;
|
static struct dentry *debugfs_sched;
|
||||||
|
|
||||||
@@ -302,12 +306,15 @@ static __init int sched_init_debug(void)
|
@@ -302,12 +306,15 @@ static __init int sched_init_debug(void)
|
||||||
|
|
||||||
debugfs_sched = debugfs_create_dir("sched", NULL);
|
debugfs_sched = debugfs_create_dir("sched", NULL);
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
debugfs_create_file("features", 0644, debugfs_sched, NULL, &sched_feat_fops);
|
debugfs_create_file("features", 0644, debugfs_sched, NULL, &sched_feat_fops);
|
||||||
debugfs_create_bool("verbose", 0644, debugfs_sched, &sched_debug_verbose);
|
debugfs_create_bool("verbose", 0644, debugfs_sched, &sched_debug_verbose);
|
||||||
@@ -9624,31 +9606,31 @@ index 1637b65ba07a..033c6deeb515 100644
|
|||||||
#ifdef CONFIG_PREEMPT_DYNAMIC
|
#ifdef CONFIG_PREEMPT_DYNAMIC
|
||||||
debugfs_create_file("preempt", 0644, debugfs_sched, NULL, &sched_dynamic_fops);
|
debugfs_create_file("preempt", 0644, debugfs_sched, NULL, &sched_dynamic_fops);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
debugfs_create_u32("latency_ns", 0644, debugfs_sched, &sysctl_sched_latency);
|
debugfs_create_u32("latency_ns", 0644, debugfs_sched, &sysctl_sched_latency);
|
||||||
debugfs_create_u32("min_granularity_ns", 0644, debugfs_sched, &sysctl_sched_min_granularity);
|
debugfs_create_u32("min_granularity_ns", 0644, debugfs_sched, &sysctl_sched_min_granularity);
|
||||||
debugfs_create_u32("idle_min_granularity_ns", 0644, debugfs_sched, &sysctl_sched_idle_min_granularity);
|
debugfs_create_u32("idle_min_granularity_ns", 0644, debugfs_sched, &sysctl_sched_idle_min_granularity);
|
||||||
@@ -337,11 +344,13 @@ static __init int sched_init_debug(void)
|
@@ -337,11 +344,13 @@ static __init int sched_init_debug(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
debugfs_create_file("debug", 0444, debugfs_sched, NULL, &sched_debug_fops);
|
debugfs_create_file("debug", 0444, debugfs_sched, NULL, &sched_debug_fops);
|
||||||
+#endif /* !CONFIG_SCHED_ALT */
|
+#endif /* !CONFIG_SCHED_ALT */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
late_initcall(sched_init_debug);
|
late_initcall(sched_init_debug);
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
|
||||||
static cpumask_var_t sd_sysctl_cpus;
|
static cpumask_var_t sd_sysctl_cpus;
|
||||||
@@ -1068,6 +1077,7 @@ void proc_sched_set_task(struct task_struct *p)
|
@@ -1068,6 +1077,7 @@ void proc_sched_set_task(struct task_struct *p)
|
||||||
memset(&p->stats, 0, sizeof(p->stats));
|
memset(&p->stats, 0, sizeof(p->stats));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
+#endif /* !CONFIG_SCHED_ALT */
|
+#endif /* !CONFIG_SCHED_ALT */
|
||||||
|
|
||||||
void resched_latency_warn(int cpu, u64 latency)
|
void resched_latency_warn(int cpu, u64 latency)
|
||||||
{
|
{
|
||||||
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
|
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
|
||||||
@@ -9658,7 +9640,7 @@ index f26ab2675f7d..480d4ad16d45 100644
|
|||||||
@@ -400,6 +400,7 @@ void cpu_startup_entry(enum cpuhp_state state)
|
@@ -400,6 +400,7 @@ void cpu_startup_entry(enum cpuhp_state state)
|
||||||
do_idle();
|
do_idle();
|
||||||
}
|
}
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
/*
|
/*
|
||||||
* idle-task scheduling class.
|
* idle-task scheduling class.
|
||||||
@@ -9808,17 +9790,17 @@ index 0f310768260c..bd38bf738fe9 100644
|
|||||||
@@ -266,6 +266,7 @@ ___update_load_avg(struct sched_avg *sa, unsigned long load)
|
@@ -266,6 +266,7 @@ ___update_load_avg(struct sched_avg *sa, unsigned long load)
|
||||||
WRITE_ONCE(sa->util_avg, sa->util_sum / divider);
|
WRITE_ONCE(sa->util_avg, sa->util_sum / divider);
|
||||||
}
|
}
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
/*
|
/*
|
||||||
* sched_entity:
|
* sched_entity:
|
||||||
*
|
*
|
||||||
@@ -383,8 +384,9 @@ int update_dl_rq_load_avg(u64 now, struct rq *rq, int running)
|
@@ -383,8 +384,9 @@ int update_dl_rq_load_avg(u64 now, struct rq *rq, int running)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
-#ifdef CONFIG_SCHED_THERMAL_PRESSURE
|
-#ifdef CONFIG_SCHED_THERMAL_PRESSURE
|
||||||
+#if defined(CONFIG_SCHED_THERMAL_PRESSURE) && !defined(CONFIG_SCHED_ALT)
|
+#if defined(CONFIG_SCHED_THERMAL_PRESSURE) && !defined(CONFIG_SCHED_ALT)
|
||||||
/*
|
/*
|
||||||
@@ -9831,7 +9813,7 @@ index 3a0e0dc28721..e8a7d84aa5a5 100644
|
|||||||
@@ -1,13 +1,15 @@
|
@@ -1,13 +1,15 @@
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
#include "sched-pelt.h"
|
#include "sched-pelt.h"
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
int __update_load_avg_blocked_se(u64 now, struct sched_entity *se);
|
int __update_load_avg_blocked_se(u64 now, struct sched_entity *se);
|
||||||
int __update_load_avg_se(u64 now, struct cfs_rq *cfs_rq, struct sched_entity *se);
|
int __update_load_avg_se(u64 now, struct cfs_rq *cfs_rq, struct sched_entity *se);
|
||||||
@@ -9839,16 +9821,16 @@ index 3a0e0dc28721..e8a7d84aa5a5 100644
|
|||||||
int update_rt_rq_load_avg(u64 now, struct rq *rq, int running);
|
int update_rt_rq_load_avg(u64 now, struct rq *rq, int running);
|
||||||
int update_dl_rq_load_avg(u64 now, struct rq *rq, int running);
|
int update_dl_rq_load_avg(u64 now, struct rq *rq, int running);
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
-#ifdef CONFIG_SCHED_THERMAL_PRESSURE
|
-#ifdef CONFIG_SCHED_THERMAL_PRESSURE
|
||||||
+#if defined(CONFIG_SCHED_THERMAL_PRESSURE) && !defined(CONFIG_SCHED_ALT)
|
+#if defined(CONFIG_SCHED_THERMAL_PRESSURE) && !defined(CONFIG_SCHED_ALT)
|
||||||
int update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity);
|
int update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity);
|
||||||
|
|
||||||
static inline u64 thermal_load_avg(struct rq *rq)
|
static inline u64 thermal_load_avg(struct rq *rq)
|
||||||
@@ -44,6 +46,7 @@ static inline u32 get_pelt_divider(struct sched_avg *avg)
|
@@ -44,6 +46,7 @@ static inline u32 get_pelt_divider(struct sched_avg *avg)
|
||||||
return PELT_MIN_DIVIDER + avg->period_contrib;
|
return PELT_MIN_DIVIDER + avg->period_contrib;
|
||||||
}
|
}
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
static inline void cfs_se_util_change(struct sched_avg *avg)
|
static inline void cfs_se_util_change(struct sched_avg *avg)
|
||||||
{
|
{
|
||||||
@@ -9858,9 +9840,9 @@ index 3a0e0dc28721..e8a7d84aa5a5 100644
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
+#endif /* CONFIG_SCHED_ALT */
|
+#endif /* CONFIG_SCHED_ALT */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
static inline int
|
static inline int
|
||||||
update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq)
|
update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq)
|
||||||
@@ -9870,7 +9852,7 @@ index 3a0e0dc28721..e8a7d84aa5a5 100644
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity)
|
update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity)
|
||||||
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
|
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
|
||||||
@@ -9880,7 +9862,7 @@ index a4a20046e586..c363693cd869 100644
|
|||||||
@@ -5,6 +5,10 @@
|
@@ -5,6 +5,10 @@
|
||||||
#ifndef _KERNEL_SCHED_SCHED_H
|
#ifndef _KERNEL_SCHED_SCHED_H
|
||||||
#define _KERNEL_SCHED_SCHED_H
|
#define _KERNEL_SCHED_SCHED_H
|
||||||
|
|
||||||
+#ifdef CONFIG_SCHED_ALT
|
+#ifdef CONFIG_SCHED_ALT
|
||||||
+#include "alt_sched.h"
|
+#include "alt_sched.h"
|
||||||
+#else
|
+#else
|
||||||
@@ -9891,7 +9873,7 @@ index a4a20046e586..c363693cd869 100644
|
|||||||
@@ -3183,4 +3187,9 @@ static inline void update_current_exec_runtime(struct task_struct *curr,
|
@@ -3183,4 +3187,9 @@ static inline void update_current_exec_runtime(struct task_struct *curr,
|
||||||
cgroup_account_cputime(curr, delta_exec);
|
cgroup_account_cputime(curr, delta_exec);
|
||||||
}
|
}
|
||||||
|
|
||||||
+static inline int task_running_nice(struct task_struct *p)
|
+static inline int task_running_nice(struct task_struct *p)
|
||||||
+{
|
+{
|
||||||
+ return (task_nice(p) > 0);
|
+ return (task_nice(p) > 0);
|
||||||
@@ -9915,7 +9897,7 @@ index 857f837f52cb..5486c63e4790 100644
|
|||||||
rq = cpu_rq(cpu);
|
rq = cpu_rq(cpu);
|
||||||
@@ -143,6 +145,7 @@ static int show_schedstat(struct seq_file *seq, void *v)
|
@@ -143,6 +145,7 @@ static int show_schedstat(struct seq_file *seq, void *v)
|
||||||
seq_printf(seq, "\n");
|
seq_printf(seq, "\n");
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
/* domain-specific stats */
|
/* domain-specific stats */
|
||||||
@@ -9934,9 +9916,9 @@ index 84a188913cc9..53934e7ef5db 100644
|
|||||||
--- a/kernel/sched/stats.h
|
--- a/kernel/sched/stats.h
|
||||||
+++ b/kernel/sched/stats.h
|
+++ b/kernel/sched/stats.h
|
||||||
@@ -89,6 +89,7 @@ static inline void rq_sched_info_depart (struct rq *rq, unsigned long long delt
|
@@ -89,6 +89,7 @@ static inline void rq_sched_info_depart (struct rq *rq, unsigned long long delt
|
||||||
|
|
||||||
#endif /* CONFIG_SCHEDSTATS */
|
#endif /* CONFIG_SCHEDSTATS */
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
#ifdef CONFIG_FAIR_GROUP_SCHED
|
#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||||
struct sched_entity_stats {
|
struct sched_entity_stats {
|
||||||
@@ -9946,7 +9928,7 @@ index 84a188913cc9..53934e7ef5db 100644
|
|||||||
return &task_of(se)->stats;
|
return &task_of(se)->stats;
|
||||||
}
|
}
|
||||||
+#endif /* CONFIG_SCHED_ALT */
|
+#endif /* CONFIG_SCHED_ALT */
|
||||||
|
|
||||||
#ifdef CONFIG_PSI
|
#ifdef CONFIG_PSI
|
||||||
void psi_task_change(struct task_struct *task, int clear, int set);
|
void psi_task_change(struct task_struct *task, int clear, int set);
|
||||||
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
|
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
|
||||||
@@ -9956,37 +9938,37 @@ index 8739c2a5a54e..d8dd6c15eb47 100644
|
|||||||
@@ -3,6 +3,7 @@
|
@@ -3,6 +3,7 @@
|
||||||
* Scheduler topology setup/handling methods
|
* Scheduler topology setup/handling methods
|
||||||
*/
|
*/
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
DEFINE_MUTEX(sched_domains_mutex);
|
DEFINE_MUTEX(sched_domains_mutex);
|
||||||
|
|
||||||
/* Protected by sched_domains_mutex: */
|
/* Protected by sched_domains_mutex: */
|
||||||
@@ -1413,8 +1414,10 @@ static void asym_cpu_capacity_scan(void)
|
@@ -1413,8 +1414,10 @@ static void asym_cpu_capacity_scan(void)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int default_relax_domain_level = -1;
|
static int default_relax_domain_level = -1;
|
||||||
+#endif /* CONFIG_SCHED_ALT */
|
+#endif /* CONFIG_SCHED_ALT */
|
||||||
int sched_domain_level_max;
|
int sched_domain_level_max;
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
static int __init setup_relax_domain_level(char *str)
|
static int __init setup_relax_domain_level(char *str)
|
||||||
{
|
{
|
||||||
if (kstrtoint(str, 0, &default_relax_domain_level))
|
if (kstrtoint(str, 0, &default_relax_domain_level))
|
||||||
@@ -1647,6 +1650,7 @@ sd_init(struct sched_domain_topology_level *tl,
|
@@ -1647,6 +1650,7 @@ sd_init(struct sched_domain_topology_level *tl,
|
||||||
|
|
||||||
return sd;
|
return sd;
|
||||||
}
|
}
|
||||||
+#endif /* CONFIG_SCHED_ALT */
|
+#endif /* CONFIG_SCHED_ALT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Topology list, bottom-up.
|
* Topology list, bottom-up.
|
||||||
@@ -1683,6 +1687,7 @@ void set_sched_topology(struct sched_domain_topology_level *tl)
|
@@ -1683,6 +1687,7 @@ void set_sched_topology(struct sched_domain_topology_level *tl)
|
||||||
sched_domain_topology_saved = NULL;
|
sched_domain_topology_saved = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
#ifdef CONFIG_NUMA
|
#ifdef CONFIG_NUMA
|
||||||
|
|
||||||
static const struct cpumask *sd_numa_mask(int cpu)
|
static const struct cpumask *sd_numa_mask(int cpu)
|
||||||
@@ -2645,3 +2650,15 @@ void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[],
|
@@ -2645,3 +2650,15 @@ void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[],
|
||||||
partition_sched_domains_locked(ndoms_new, doms_new, dattr_new);
|
partition_sched_domains_locked(ndoms_new, doms_new, dattr_new);
|
||||||
@@ -10009,9 +9991,9 @@ index c6d9dec11b74..2bc42ce8b48e 100644
|
|||||||
--- a/kernel/sysctl.c
|
--- a/kernel/sysctl.c
|
||||||
+++ b/kernel/sysctl.c
|
+++ b/kernel/sysctl.c
|
||||||
@@ -93,6 +93,10 @@ EXPORT_SYMBOL_GPL(sysctl_long_vals);
|
@@ -93,6 +93,10 @@ EXPORT_SYMBOL_GPL(sysctl_long_vals);
|
||||||
|
|
||||||
/* Constants used for minimum and maximum */
|
/* Constants used for minimum and maximum */
|
||||||
|
|
||||||
+#ifdef CONFIG_SCHED_ALT
|
+#ifdef CONFIG_SCHED_ALT
|
||||||
+extern int sched_yield_type;
|
+extern int sched_yield_type;
|
||||||
+#endif
|
+#endif
|
||||||
@@ -10021,7 +10003,7 @@ index c6d9dec11b74..2bc42ce8b48e 100644
|
|||||||
#endif
|
#endif
|
||||||
@@ -1633,6 +1637,7 @@ int proc_do_static_key(struct ctl_table *table, int write,
|
@@ -1633,6 +1637,7 @@ int proc_do_static_key(struct ctl_table *table, int write,
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ctl_table kern_table[] = {
|
static struct ctl_table kern_table[] = {
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
#ifdef CONFIG_NUMA_BALANCING
|
#ifdef CONFIG_NUMA_BALANCING
|
||||||
@@ -10060,13 +10042,13 @@ index 3ae661ab6260..35f0176dcdb0 100644
|
|||||||
@@ -2088,8 +2088,10 @@ long hrtimer_nanosleep(ktime_t rqtp, const enum hrtimer_mode mode,
|
@@ -2088,8 +2088,10 @@ long hrtimer_nanosleep(ktime_t rqtp, const enum hrtimer_mode mode,
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
u64 slack;
|
u64 slack;
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
slack = current->timer_slack_ns;
|
slack = current->timer_slack_ns;
|
||||||
if (dl_task(current) || rt_task(current))
|
if (dl_task(current) || rt_task(current))
|
||||||
+#endif
|
+#endif
|
||||||
slack = 0;
|
slack = 0;
|
||||||
|
|
||||||
hrtimer_init_sleeper_on_stack(&t, clockid, mode);
|
hrtimer_init_sleeper_on_stack(&t, clockid, mode);
|
||||||
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
|
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
|
||||||
index cb925e8ef9a8..67d823510f5c 100644
|
index cb925e8ef9a8..67d823510f5c 100644
|
||||||
@@ -10074,17 +10056,17 @@ index cb925e8ef9a8..67d823510f5c 100644
|
|||||||
+++ b/kernel/time/posix-cpu-timers.c
|
+++ b/kernel/time/posix-cpu-timers.c
|
||||||
@@ -223,7 +223,7 @@ static void task_sample_cputime(struct task_struct *p, u64 *samples)
|
@@ -223,7 +223,7 @@ static void task_sample_cputime(struct task_struct *p, u64 *samples)
|
||||||
u64 stime, utime;
|
u64 stime, utime;
|
||||||
|
|
||||||
task_cputime(p, &utime, &stime);
|
task_cputime(p, &utime, &stime);
|
||||||
- store_samples(samples, stime, utime, p->se.sum_exec_runtime);
|
- store_samples(samples, stime, utime, p->se.sum_exec_runtime);
|
||||||
+ store_samples(samples, stime, utime, tsk_seruntime(p));
|
+ store_samples(samples, stime, utime, tsk_seruntime(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void proc_sample_cputime_atomic(struct task_cputime_atomic *at,
|
static void proc_sample_cputime_atomic(struct task_cputime_atomic *at,
|
||||||
@@ -866,6 +866,7 @@ static void collect_posix_cputimers(struct posix_cputimers *pct, u64 *samples,
|
@@ -866,6 +866,7 @@ static void collect_posix_cputimers(struct posix_cputimers *pct, u64 *samples,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
static inline void check_dl_overrun(struct task_struct *tsk)
|
static inline void check_dl_overrun(struct task_struct *tsk)
|
||||||
{
|
{
|
||||||
@@ -10094,18 +10076,18 @@ index cb925e8ef9a8..67d823510f5c 100644
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
static bool check_rlimit(u64 time, u64 limit, int signo, bool rt, bool hard)
|
static bool check_rlimit(u64 time, u64 limit, int signo, bool rt, bool hard)
|
||||||
{
|
{
|
||||||
@@ -900,8 +902,10 @@ static void check_thread_timers(struct task_struct *tsk,
|
@@ -900,8 +902,10 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||||
u64 samples[CPUCLOCK_MAX];
|
u64 samples[CPUCLOCK_MAX];
|
||||||
unsigned long soft;
|
unsigned long soft;
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
if (dl_task(tsk))
|
if (dl_task(tsk))
|
||||||
check_dl_overrun(tsk);
|
check_dl_overrun(tsk);
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
if (expiry_cache_is_inactive(pct))
|
if (expiry_cache_is_inactive(pct))
|
||||||
return;
|
return;
|
||||||
@@ -915,7 +919,7 @@ static void check_thread_timers(struct task_struct *tsk,
|
@@ -915,7 +919,7 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||||
@@ -10115,17 +10097,17 @@ index cb925e8ef9a8..67d823510f5c 100644
|
|||||||
- unsigned long rttime = tsk->rt.timeout * (USEC_PER_SEC / HZ);
|
- unsigned long rttime = tsk->rt.timeout * (USEC_PER_SEC / HZ);
|
||||||
+ unsigned long rttime = tsk_rttimeout(tsk) * (USEC_PER_SEC / HZ);
|
+ unsigned long rttime = tsk_rttimeout(tsk) * (USEC_PER_SEC / HZ);
|
||||||
unsigned long hard = task_rlimit_max(tsk, RLIMIT_RTTIME);
|
unsigned long hard = task_rlimit_max(tsk, RLIMIT_RTTIME);
|
||||||
|
|
||||||
/* At the hard limit, send SIGKILL. No further action. */
|
/* At the hard limit, send SIGKILL. No further action. */
|
||||||
@@ -1151,8 +1155,10 @@ static inline bool fastpath_timer_check(struct task_struct *tsk)
|
@@ -1151,8 +1155,10 @@ static inline bool fastpath_timer_check(struct task_struct *tsk)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
+#ifndef CONFIG_SCHED_ALT
|
+#ifndef CONFIG_SCHED_ALT
|
||||||
if (dl_task(tsk) && tsk->dl.dl_overrun)
|
if (dl_task(tsk) && tsk->dl.dl_overrun)
|
||||||
return true;
|
return true;
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c
|
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c
|
||||||
@@ -10147,4 +10129,4 @@ index a2d301f58ced..2ccdede8585c 100644
|
|||||||
+#endif
|
+#endif
|
||||||
};
|
};
|
||||||
struct wakeup_test_data *x = data;
|
struct wakeup_test_data *x = data;
|
||||||
|
|
@@ -2540,3 +2540,41 @@ index 41fd8352ab6561..1d2f77835de5f0 100644
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
|
From 07fa6df737871f5e491ec70f499963aedd679f2a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Pablo Neira Ayuso <pablo@netfilter.org>
|
||||||
|
Date: Wed, 11 Jan 2023 17:07:33 +0100
|
||||||
|
Subject: [PATCH] netfilter: nft_payload: incorrect arithmetics when fetching
|
||||||
|
VLAN header bits
|
||||||
|
|
||||||
|
commit 696e1a48b1a1b01edad542a1ef293665864a4dd0 upstream.
|
||||||
|
|
||||||
|
If the offset + length goes over the ethernet + vlan header, then the
|
||||||
|
length is adjusted to copy the bytes that are within the boundaries of
|
||||||
|
the vlan_ethhdr scratchpad area. The remaining bytes beyond ethernet +
|
||||||
|
vlan header are copied directly from the skbuff data area.
|
||||||
|
|
||||||
|
Fix incorrect arithmetic operator: subtract, not add, the size of the
|
||||||
|
vlan header in case of double-tagged packets to adjust the length
|
||||||
|
accordingly to address CVE-2023-0179.
|
||||||
|
|
||||||
|
Reported-by: Davide Ornaghi <d.ornaghi97@gmail.com>
|
||||||
|
Fixes: f6ae9f120dad ("netfilter: nft_payload: add C-VLAN support")
|
||||||
|
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
net/netfilter/nft_payload.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/net/netfilter/nft_payload.c b/net/netfilter/nft_payload.c
|
||||||
|
index 4edd899aeb9bb5..d7de2ecb287eba 100644
|
||||||
|
--- a/net/netfilter/nft_payload.c
|
||||||
|
+++ b/net/netfilter/nft_payload.c
|
||||||
|
@@ -62,7 +62,7 @@ nft_payload_copy_vlan(u32 *d, const struct sk_buff *skb, u8 offset, u8 len)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (offset + len > VLAN_ETH_HLEN + vlan_hlen)
|
||||||
|
- ethlen -= offset + len - VLAN_ETH_HLEN + vlan_hlen;
|
||||||
|
+ ethlen -= offset + len - VLAN_ETH_HLEN - vlan_hlen;
|
||||||
|
|
||||||
|
memcpy(dst_u8, vlanh + offset - vlan_hlen, ethlen);
|
||||||
|
|
||||||
|
@@ -1,90 +0,0 @@
|
|||||||
From f7f49141a5dbe9c99d78196b58c44307fb2e6be3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Tk-Glitch <ti3nou@gmail.com>
|
|
||||||
Date: Wed, 4 Jul 2018 04:30:08 +0200
|
|
||||||
Subject: glitched - PDS
|
|
||||||
|
|
||||||
diff --git a/kernel/Kconfig.hz b/kernel/Kconfig.hz
|
|
||||||
index 2a202a846757..1d9c7ed79b11 100644
|
|
||||||
--- a/kernel/Kconfig.hz
|
|
||||||
+++ b/kernel/Kconfig.hz
|
|
||||||
@@ -4,7 +4,7 @@
|
|
||||||
|
|
||||||
choice
|
|
||||||
prompt "Timer frequency"
|
|
||||||
- default HZ_250
|
|
||||||
+ default HZ_500
|
|
||||||
help
|
|
||||||
Allows the configuration of the timer frequency. It is customary
|
|
||||||
to have the timer interrupt run at 1000 Hz but 100 Hz may be more
|
|
||||||
@@ -39,6 +39,13 @@ choice
|
|
||||||
on SMP and NUMA systems and exactly dividing by both PAL and
|
|
||||||
NTSC frame rates for video and multimedia work.
|
|
||||||
|
|
||||||
+ config HZ_500
|
|
||||||
+ bool "500 HZ"
|
|
||||||
+ help
|
|
||||||
+ 500 Hz is a balanced timer frequency. Provides fast interactivity
|
|
||||||
+ on desktops with great smoothness without increasing CPU power
|
|
||||||
+ consumption and sacrificing the battery life on laptops.
|
|
||||||
+
|
|
||||||
config HZ_1000
|
|
||||||
bool "1000 HZ"
|
|
||||||
help
|
|
||||||
@@ -52,6 +59,7 @@ config HZ
|
|
||||||
default 100 if HZ_100
|
|
||||||
default 250 if HZ_250
|
|
||||||
default 300 if HZ_300
|
|
||||||
+ default 500 if HZ_500
|
|
||||||
default 1000 if HZ_1000
|
|
||||||
|
|
||||||
config SCHED_HRTICK
|
|
||||||
|
|
||||||
diff --git a/kernel/Kconfig.hz b/kernel/Kconfig.hz
|
|
||||||
index 2a202a846757..1d9c7ed79b11 100644
|
|
||||||
--- a/kernel/Kconfig.hz
|
|
||||||
+++ b/kernel/Kconfig.hz
|
|
||||||
@@ -4,7 +4,7 @@
|
|
||||||
|
|
||||||
choice
|
|
||||||
prompt "Timer frequency"
|
|
||||||
- default HZ_500
|
|
||||||
+ default HZ_750
|
|
||||||
help
|
|
||||||
Allows the configuration of the timer frequency. It is customary
|
|
||||||
to have the timer interrupt run at 1000 Hz but 100 Hz may be more
|
|
||||||
@@ -46,6 +46,13 @@ choice
|
|
||||||
on desktops with great smoothness without increasing CPU power
|
|
||||||
consumption and sacrificing the battery life on laptops.
|
|
||||||
|
|
||||||
+ config HZ_750
|
|
||||||
+ bool "750 HZ"
|
|
||||||
+ help
|
|
||||||
+ 750 Hz is a good timer frequency for desktops. Provides fast
|
|
||||||
+ interactivity with great smoothness without sacrificing too
|
|
||||||
+ much throughput.
|
|
||||||
+
|
|
||||||
config HZ_1000
|
|
||||||
bool "1000 HZ"
|
|
||||||
help
|
|
||||||
@@ -60,6 +67,7 @@ config HZ
|
|
||||||
default 250 if HZ_250
|
|
||||||
default 300 if HZ_300
|
|
||||||
default 500 if HZ_500
|
|
||||||
+ default 750 if HZ_750
|
|
||||||
default 1000 if HZ_1000
|
|
||||||
|
|
||||||
config SCHED_HRTICK
|
|
||||||
|
|
||||||
diff --git a/mm/vmscan.c b/mm/vmscan.c
|
|
||||||
index 9270a4370d54..30d01e647417 100644
|
|
||||||
--- a/mm/vmscan.c
|
|
||||||
+++ b/mm/vmscan.c
|
|
||||||
@@ -169,7 +169,7 @@
|
|
||||||
/*
|
|
||||||
* From 0 .. 200. Higher means more swappy.
|
|
||||||
*/
|
|
||||||
-int vm_swappiness = 60;
|
|
||||||
+int vm_swappiness = 20;
|
|
||||||
|
|
||||||
static void set_task_reclaim_state(struct task_struct *task,
|
|
||||||
struct reclaim_state *rs)
|
|
File diff suppressed because it is too large
Load Diff
@@ -64,3 +64,253 @@ index 2c7171e0b0010..85de313ddec29 100644
|
|||||||
select CPU_FREQ_GOV_PERFORMANCE
|
select CPU_FREQ_GOV_PERFORMANCE
|
||||||
help
|
help
|
||||||
|
|
||||||
|
From 0c079d3f88df5f8286cd5c91b54bdac7c819be85 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Auld <matthew.auld@intel.com>
|
||||||
|
Date: Tue, 6 Dec 2022 16:11:41 +0000
|
||||||
|
Subject: [PATCH] drm/i915: improve the catch-all evict to handle lock
|
||||||
|
contention
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
The catch-all evict can fail due to object lock contention, since it
|
||||||
|
only goes as far as trylocking the object, due to us already holding the
|
||||||
|
vm->mutex. Doing a full object lock here can deadlock, since the
|
||||||
|
vm->mutex is always our inner lock. Add another execbuf pass which drops
|
||||||
|
the vm->mutex and then tries to grab the object will the full lock,
|
||||||
|
before then retrying the eviction. This should be good enough for now to
|
||||||
|
fix the immediate regression with userspace seeing -ENOSPC from execbuf
|
||||||
|
due to contended object locks during GTT eviction.
|
||||||
|
|
||||||
|
Testcase: igt@gem_ppgtt@shrink-vs-evict-*
|
||||||
|
Fixes: 7e00897be8bf ("drm/i915: Add object locking to i915_gem_evict_for_node and i915_gem_evict_something, v2.")
|
||||||
|
References: https://gitlab.freedesktop.org/drm/intel/-/issues/7627
|
||||||
|
References: https://gitlab.freedesktop.org/drm/intel/-/issues/7570
|
||||||
|
References: https://bugzilla.mozilla.org/show_bug.cgi?id=1779558
|
||||||
|
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
|
||||||
|
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
|
||||||
|
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
|
||||||
|
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
|
||||||
|
Cc: Andrzej Hajda <andrzej.hajda@intel.com>
|
||||||
|
Cc: Mani Milani <mani@chromium.org>
|
||||||
|
Cc: <stable@vger.kernel.org> # v5.18+
|
||||||
|
|
||||||
|
Revision 1 of https://patchwork.freedesktop.org/series/111686/
|
||||||
|
---
|
||||||
|
.../gpu/drm/i915/gem/i915_gem_execbuffer.c | 25 +++++++++++--
|
||||||
|
drivers/gpu/drm/i915/gem/i915_gem_mman.c | 2 +-
|
||||||
|
drivers/gpu/drm/i915/i915_gem_evict.c | 37 ++++++++++++++-----
|
||||||
|
drivers/gpu/drm/i915/i915_gem_evict.h | 4 +-
|
||||||
|
drivers/gpu/drm/i915/i915_vma.c | 2 +-
|
||||||
|
.../gpu/drm/i915/selftests/i915_gem_evict.c | 4 +-
|
||||||
|
6 files changed, 56 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
|
||||||
|
index 845023c14eb36f..094e92ed28db4f 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
|
||||||
|
@@ -741,25 +741,44 @@ static int eb_reserve(struct i915_execbuffer *eb)
|
||||||
|
*
|
||||||
|
* Defragmenting is skipped if all objects are pinned at a fixed location.
|
||||||
|
*/
|
||||||
|
- for (pass = 0; pass <= 2; pass++) {
|
||||||
|
+ for (pass = 0; pass <= 3; pass++) {
|
||||||
|
int pin_flags = PIN_USER | PIN_VALIDATE;
|
||||||
|
|
||||||
|
if (pass == 0)
|
||||||
|
pin_flags |= PIN_NONBLOCK;
|
||||||
|
|
||||||
|
if (pass >= 1)
|
||||||
|
- unpinned = eb_unbind(eb, pass == 2);
|
||||||
|
+ unpinned = eb_unbind(eb, pass >= 2);
|
||||||
|
|
||||||
|
if (pass == 2) {
|
||||||
|
err = mutex_lock_interruptible(&eb->context->vm->mutex);
|
||||||
|
if (!err) {
|
||||||
|
- err = i915_gem_evict_vm(eb->context->vm, &eb->ww);
|
||||||
|
+ err = i915_gem_evict_vm(eb->context->vm, &eb->ww, NULL);
|
||||||
|
mutex_unlock(&eb->context->vm->mutex);
|
||||||
|
}
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (pass == 3) {
|
||||||
|
+retry:
|
||||||
|
+ err = mutex_lock_interruptible(&eb->context->vm->mutex);
|
||||||
|
+ if (!err) {
|
||||||
|
+ struct drm_i915_gem_object *busy_bo = NULL;
|
||||||
|
+
|
||||||
|
+ err = i915_gem_evict_vm(eb->context->vm, &eb->ww, &busy_bo);
|
||||||
|
+ mutex_unlock(&eb->context->vm->mutex);
|
||||||
|
+ if (err && busy_bo) {
|
||||||
|
+ err = i915_gem_object_lock(busy_bo, &eb->ww);
|
||||||
|
+ i915_gem_object_put(busy_bo);
|
||||||
|
+ if (!err)
|
||||||
|
+ goto retry;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if (err)
|
||||||
|
+ return err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
list_for_each_entry(ev, &eb->unbound, bind_link) {
|
||||||
|
err = eb_reserve_vma(eb, ev, pin_flags);
|
||||||
|
if (err)
|
||||||
|
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
|
||||||
|
index 73d9eda1d6b7a6..c83d98e1dc5da0 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
|
||||||
|
@@ -369,7 +369,7 @@ static vm_fault_t vm_fault_gtt(struct vm_fault *vmf)
|
||||||
|
if (vma == ERR_PTR(-ENOSPC)) {
|
||||||
|
ret = mutex_lock_interruptible(&ggtt->vm.mutex);
|
||||||
|
if (!ret) {
|
||||||
|
- ret = i915_gem_evict_vm(&ggtt->vm, &ww);
|
||||||
|
+ ret = i915_gem_evict_vm(&ggtt->vm, &ww, NULL);
|
||||||
|
mutex_unlock(&ggtt->vm.mutex);
|
||||||
|
}
|
||||||
|
if (ret)
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
|
||||||
|
index f025ee4fa52618..a4b4d9b7d26c7a 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_gem_evict.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_gem_evict.c
|
||||||
|
@@ -416,6 +416,11 @@ int i915_gem_evict_for_node(struct i915_address_space *vm,
|
||||||
|
* @vm: Address space to cleanse
|
||||||
|
* @ww: An optional struct i915_gem_ww_ctx. If not NULL, i915_gem_evict_vm
|
||||||
|
* will be able to evict vma's locked by the ww as well.
|
||||||
|
+ * @busy_bo: Optional pointer to struct drm_i915_gem_object. If not NULL, then
|
||||||
|
+ * in the event i915_gem_evict_vm() is unable to trylock an object for eviction,
|
||||||
|
+ * then @busy_bo will point to it. -EBUSY is also returned. The caller must drop
|
||||||
|
+ * the vm->mutex, before trying again to acquire the contended lock. The caller
|
||||||
|
+ * also owns a reference to the object.
|
||||||
|
*
|
||||||
|
* This function evicts all vmas from a vm.
|
||||||
|
*
|
||||||
|
@@ -425,7 +430,8 @@ int i915_gem_evict_for_node(struct i915_address_space *vm,
|
||||||
|
* To clarify: This is for freeing up virtual address space, not for freeing
|
||||||
|
* memory in e.g. the shrinker.
|
||||||
|
*/
|
||||||
|
-int i915_gem_evict_vm(struct i915_address_space *vm, struct i915_gem_ww_ctx *ww)
|
||||||
|
+int i915_gem_evict_vm(struct i915_address_space *vm, struct i915_gem_ww_ctx *ww,
|
||||||
|
+ struct drm_i915_gem_object **busy_bo)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
@@ -457,15 +463,22 @@ int i915_gem_evict_vm(struct i915_address_space *vm, struct i915_gem_ww_ctx *ww)
|
||||||
|
* the resv is shared among multiple objects, we still
|
||||||
|
* need the object ref.
|
||||||
|
*/
|
||||||
|
- if (dying_vma(vma) ||
|
||||||
|
+ if (!i915_gem_object_get_rcu(vma->obj) ||
|
||||||
|
(ww && (dma_resv_locking_ctx(vma->obj->base.resv) == &ww->ctx))) {
|
||||||
|
__i915_vma_pin(vma);
|
||||||
|
list_add(&vma->evict_link, &locked_eviction_list);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!i915_gem_object_trylock(vma->obj, ww))
|
||||||
|
+ if (!i915_gem_object_trylock(vma->obj, ww)) {
|
||||||
|
+ if (busy_bo) {
|
||||||
|
+ *busy_bo = vma->obj; /* holds ref */
|
||||||
|
+ ret = -EBUSY;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ i915_gem_object_put(vma->obj);
|
||||||
|
continue;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
__i915_vma_pin(vma);
|
||||||
|
list_add(&vma->evict_link, &eviction_list);
|
||||||
|
@@ -473,25 +486,29 @@ int i915_gem_evict_vm(struct i915_address_space *vm, struct i915_gem_ww_ctx *ww)
|
||||||
|
if (list_empty(&eviction_list) && list_empty(&locked_eviction_list))
|
||||||
|
break;
|
||||||
|
|
||||||
|
- ret = 0;
|
||||||
|
/* Unbind locked objects first, before unlocking the eviction_list */
|
||||||
|
list_for_each_entry_safe(vma, vn, &locked_eviction_list, evict_link) {
|
||||||
|
__i915_vma_unpin(vma);
|
||||||
|
|
||||||
|
- if (ret == 0)
|
||||||
|
+ if (ret == 0) {
|
||||||
|
ret = __i915_vma_unbind(vma);
|
||||||
|
- if (ret != -EINTR) /* "Get me out of here!" */
|
||||||
|
- ret = 0;
|
||||||
|
+ if (ret != -EINTR) /* "Get me out of here!" */
|
||||||
|
+ ret = 0;
|
||||||
|
+ }
|
||||||
|
+ if (!dying_vma(vma))
|
||||||
|
+ i915_gem_object_put(vma->obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
list_for_each_entry_safe(vma, vn, &eviction_list, evict_link) {
|
||||||
|
__i915_vma_unpin(vma);
|
||||||
|
- if (ret == 0)
|
||||||
|
+ if (ret == 0) {
|
||||||
|
ret = __i915_vma_unbind(vma);
|
||||||
|
- if (ret != -EINTR) /* "Get me out of here!" */
|
||||||
|
- ret = 0;
|
||||||
|
+ if (ret != -EINTR) /* "Get me out of here!" */
|
||||||
|
+ ret = 0;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
i915_gem_object_unlock(vma->obj);
|
||||||
|
+ i915_gem_object_put(vma->obj);
|
||||||
|
}
|
||||||
|
} while (ret == 0);
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.h b/drivers/gpu/drm/i915/i915_gem_evict.h
|
||||||
|
index e593c530f9bd7a..bf0ee0e4fe6088 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_gem_evict.h
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_gem_evict.h
|
||||||
|
@@ -11,6 +11,7 @@
|
||||||
|
struct drm_mm_node;
|
||||||
|
struct i915_address_space;
|
||||||
|
struct i915_gem_ww_ctx;
|
||||||
|
+struct drm_i915_gem_object;
|
||||||
|
|
||||||
|
int __must_check i915_gem_evict_something(struct i915_address_space *vm,
|
||||||
|
struct i915_gem_ww_ctx *ww,
|
||||||
|
@@ -23,6 +24,7 @@ int __must_check i915_gem_evict_for_node(struct i915_address_space *vm,
|
||||||
|
struct drm_mm_node *node,
|
||||||
|
unsigned int flags);
|
||||||
|
int i915_gem_evict_vm(struct i915_address_space *vm,
|
||||||
|
- struct i915_gem_ww_ctx *ww);
|
||||||
|
+ struct i915_gem_ww_ctx *ww,
|
||||||
|
+ struct drm_i915_gem_object **busy_bo);
|
||||||
|
|
||||||
|
#endif /* __I915_GEM_EVICT_H__ */
|
||||||
|
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
|
||||||
|
index f17c09ead7d778..4d06875de14a14 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/i915_vma.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/i915_vma.c
|
||||||
|
@@ -1569,7 +1569,7 @@ static int __i915_ggtt_pin(struct i915_vma *vma, struct i915_gem_ww_ctx *ww,
|
||||||
|
* locked objects when called from execbuf when pinning
|
||||||
|
* is removed. This would probably regress badly.
|
||||||
|
*/
|
||||||
|
- i915_gem_evict_vm(vm, NULL);
|
||||||
|
+ i915_gem_evict_vm(vm, NULL, NULL);
|
||||||
|
mutex_unlock(&vm->mutex);
|
||||||
|
}
|
||||||
|
} while (1);
|
||||||
|
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
|
||||||
|
index 8c6517d29b8e0c..37068542aafe7f 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
|
||||||
|
@@ -344,7 +344,7 @@ static int igt_evict_vm(void *arg)
|
||||||
|
|
||||||
|
/* Everything is pinned, nothing should happen */
|
||||||
|
mutex_lock(&ggtt->vm.mutex);
|
||||||
|
- err = i915_gem_evict_vm(&ggtt->vm, NULL);
|
||||||
|
+ err = i915_gem_evict_vm(&ggtt->vm, NULL, NULL);
|
||||||
|
mutex_unlock(&ggtt->vm.mutex);
|
||||||
|
if (err) {
|
||||||
|
pr_err("i915_gem_evict_vm on a full GGTT returned err=%d]\n",
|
||||||
|
@@ -356,7 +356,7 @@ static int igt_evict_vm(void *arg)
|
||||||
|
|
||||||
|
for_i915_gem_ww(&ww, err, false) {
|
||||||
|
mutex_lock(&ggtt->vm.mutex);
|
||||||
|
- err = i915_gem_evict_vm(&ggtt->vm, &ww);
|
||||||
|
+ err = i915_gem_evict_vm(&ggtt->vm, &ww, NULL);
|
||||||
|
mutex_unlock(&ggtt->vm.mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user