621 lines
21 KiB
Diff
621 lines
21 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Arjan van de Ven <arjan@linux.intel.com>
|
|
Date: Mon, 14 Mar 2016 11:10:58 -0600
|
|
Subject: [PATCH] pci pme wakeups
|
|
|
|
Reduce wakeups for PME checks, which are a workaround for miswired
|
|
boards (sadly, too many of them) in laptops.
|
|
---
|
|
drivers/pci/pci.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
|
|
index c9338f9..6974fbf 100644
|
|
--- a/drivers/pci/pci.c
|
|
+++ b/drivers/pci/pci.c
|
|
@@ -62,7 +62,7 @@ struct pci_pme_device {
|
|
struct pci_dev *dev;
|
|
};
|
|
|
|
-#define PME_TIMEOUT 1000 /* How long between PME checks */
|
|
+#define PME_TIMEOUT 4000 /* How long between PME checks */
|
|
|
|
static void pci_dev_d3_sleep(struct pci_dev *dev)
|
|
{
|
|
--
|
|
https://clearlinux.org
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Arjan van de Ven <arjan@linux.intel.com>
|
|
Date: Sat, 19 Mar 2016 21:32:19 -0400
|
|
Subject: [PATCH] intel_idle: tweak cpuidle cstates
|
|
|
|
Increase target_residency in cpuidle cstate
|
|
|
|
Tune intel_idle to be a bit less agressive;
|
|
Clear linux is cleaner in hygiene (wakupes) than the average linux,
|
|
so we can afford changing these in a way that increases
|
|
performance while keeping power efficiency
|
|
---
|
|
drivers/idle/intel_idle.c | 44 +++++++++++++++++++--------------------
|
|
1 file changed, 22 insertions(+), 22 deletions(-)
|
|
|
|
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
|
|
index f449584..c994d24 100644
|
|
--- a/drivers/idle/intel_idle.c
|
|
+++ b/drivers/idle/intel_idle.c
|
|
@@ -531,7 +531,7 @@ static struct cpuidle_state hsw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x01",
|
|
.flags = MWAIT2flg(0x01) | CPUIDLE_FLAG_ALWAYS_ENABLE,
|
|
.exit_latency = 10,
|
|
- .target_residency = 20,
|
|
+ .target_residency = 120,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -539,7 +539,7 @@ static struct cpuidle_state hsw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x10",
|
|
.flags = MWAIT2flg(0x10) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 33,
|
|
- .target_residency = 100,
|
|
+ .target_residency = 900,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -547,7 +547,7 @@ static struct cpuidle_state hsw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x20",
|
|
.flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 133,
|
|
- .target_residency = 400,
|
|
+ .target_residency = 1000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -555,7 +555,7 @@ static struct cpuidle_state hsw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x32",
|
|
.flags = MWAIT2flg(0x32) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 166,
|
|
- .target_residency = 500,
|
|
+ .target_residency = 1500,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -563,7 +563,7 @@ static struct cpuidle_state hsw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x40",
|
|
.flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 300,
|
|
- .target_residency = 900,
|
|
+ .target_residency = 2000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -571,7 +571,7 @@ static struct cpuidle_state hsw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x50",
|
|
.flags = MWAIT2flg(0x50) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 600,
|
|
- .target_residency = 1800,
|
|
+ .target_residency = 5000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -579,7 +579,7 @@ static struct cpuidle_state hsw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x60",
|
|
.flags = MWAIT2flg(0x60) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 2600,
|
|
- .target_residency = 7700,
|
|
+ .target_residency = 9000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -599,7 +599,7 @@ static struct cpuidle_state bdw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x01",
|
|
.flags = MWAIT2flg(0x01) | CPUIDLE_FLAG_ALWAYS_ENABLE,
|
|
.exit_latency = 10,
|
|
- .target_residency = 20,
|
|
+ .target_residency = 120,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -607,7 +607,7 @@ static struct cpuidle_state bdw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x10",
|
|
.flags = MWAIT2flg(0x10) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 40,
|
|
- .target_residency = 100,
|
|
+ .target_residency = 1000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -615,7 +615,7 @@ static struct cpuidle_state bdw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x20",
|
|
.flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 133,
|
|
- .target_residency = 400,
|
|
+ .target_residency = 1000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -623,7 +623,7 @@ static struct cpuidle_state bdw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x32",
|
|
.flags = MWAIT2flg(0x32) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 166,
|
|
- .target_residency = 500,
|
|
+ .target_residency = 2000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -631,7 +631,7 @@ static struct cpuidle_state bdw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x40",
|
|
.flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 300,
|
|
- .target_residency = 900,
|
|
+ .target_residency = 4000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -639,7 +639,7 @@ static struct cpuidle_state bdw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x50",
|
|
.flags = MWAIT2flg(0x50) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 600,
|
|
- .target_residency = 1800,
|
|
+ .target_residency = 7000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -647,7 +647,7 @@ static struct cpuidle_state bdw_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x60",
|
|
.flags = MWAIT2flg(0x60) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 2600,
|
|
- .target_residency = 7700,
|
|
+ .target_residency = 9000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -668,7 +668,7 @@ static struct cpuidle_state skl_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x01",
|
|
.flags = MWAIT2flg(0x01) | CPUIDLE_FLAG_ALWAYS_ENABLE,
|
|
.exit_latency = 10,
|
|
- .target_residency = 20,
|
|
+ .target_residency = 120,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -676,7 +676,7 @@ static struct cpuidle_state skl_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x10",
|
|
.flags = MWAIT2flg(0x10) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 70,
|
|
- .target_residency = 100,
|
|
+ .target_residency = 1000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -684,7 +684,7 @@ static struct cpuidle_state skl_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x20",
|
|
.flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 85,
|
|
- .target_residency = 200,
|
|
+ .target_residency = 600,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -692,7 +692,7 @@ static struct cpuidle_state skl_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x33",
|
|
.flags = MWAIT2flg(0x33) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 124,
|
|
- .target_residency = 800,
|
|
+ .target_residency = 3000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -700,7 +700,7 @@ static struct cpuidle_state skl_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x40",
|
|
.flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 200,
|
|
- .target_residency = 800,
|
|
+ .target_residency = 3200,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -708,7 +708,7 @@ static struct cpuidle_state skl_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x50",
|
|
.flags = MWAIT2flg(0x50) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 480,
|
|
- .target_residency = 5000,
|
|
+ .target_residency = 9000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -716,7 +716,7 @@ static struct cpuidle_state skl_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x60",
|
|
.flags = MWAIT2flg(0x60) | CPUIDLE_FLAG_TLB_FLUSHED,
|
|
.exit_latency = 890,
|
|
- .target_residency = 5000,
|
|
+ .target_residency = 9000,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
@@ -737,7 +737,7 @@ static struct cpuidle_state skx_cstates[] __initdata = {
|
|
.desc = "MWAIT 0x01",
|
|
.flags = MWAIT2flg(0x01) | CPUIDLE_FLAG_ALWAYS_ENABLE,
|
|
.exit_latency = 10,
|
|
- .target_residency = 20,
|
|
+ .target_residency = 300,
|
|
.enter = &intel_idle,
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
{
|
|
--
|
|
https://clearlinux.org
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Arjan van de Ven <arjan@linux.intel.com>
|
|
Date: Fri, 6 Jan 2017 15:34:09 +0000
|
|
Subject: [PATCH] ipv4/tcp: allow the memory tuning for tcp to go a little
|
|
bigger than default
|
|
|
|
---
|
|
net/ipv4/tcp.c | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
|
|
index 30c1142..4345075 100644
|
|
--- a/net/ipv4/tcp.c
|
|
+++ b/net/ipv4/tcp.c
|
|
@@ -4201,8 +4201,8 @@ void __init tcp_init(void)
|
|
tcp_init_mem();
|
|
/* Set per-socket limits to no more than 1/128 the pressure threshold */
|
|
limit = nr_free_buffer_pages() << (PAGE_SHIFT - 7);
|
|
- max_wshare = min(4UL*1024*1024, limit);
|
|
- max_rshare = min(6UL*1024*1024, limit);
|
|
+ max_wshare = min(16UL*1024*1024, limit);
|
|
+ max_rshare = min(16UL*1024*1024, limit);
|
|
|
|
init_net.ipv4.sysctl_tcp_wmem[0] = SK_MEM_QUANTUM;
|
|
init_net.ipv4.sysctl_tcp_wmem[1] = 16*1024;
|
|
--
|
|
https://clearlinux.org
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Arjan van de Ven <arjan@linux.intel.com>
|
|
Date: Sun, 18 Feb 2018 23:35:41 +0000
|
|
Subject: [PATCH] locking: rwsem: spin faster
|
|
|
|
tweak rwsem owner spinning a bit
|
|
---
|
|
kernel/locking/rwsem.c | 4 +++-
|
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c
|
|
index f11b9bd..1bbfcc1 100644
|
|
--- a/kernel/locking/rwsem.c
|
|
+++ b/kernel/locking/rwsem.c
|
|
@@ -717,6 +717,7 @@ rwsem_spin_on_owner(struct rw_semaphore *sem, unsigned long nonspinnable)
|
|
struct task_struct *new, *owner;
|
|
unsigned long flags, new_flags;
|
|
enum owner_state state;
|
|
+ int i = 0;
|
|
|
|
owner = rwsem_owner_flags(sem, &flags);
|
|
state = rwsem_owner_state(owner, flags, nonspinnable);
|
|
@@ -750,7 +751,8 @@ rwsem_spin_on_owner(struct rw_semaphore *sem, unsigned long nonspinnable)
|
|
break;
|
|
}
|
|
|
|
- cpu_relax();
|
|
+ if (i++ > 1000)
|
|
+ cpu_relax();
|
|
}
|
|
rcu_read_unlock();
|
|
|
|
--
|
|
https://clearlinux.org
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Arjan van de Ven <arjan@linux.intel.com>
|
|
Date: Thu, 2 Jun 2016 23:36:32 -0500
|
|
Subject: [PATCH] initialize ata before graphics
|
|
|
|
ATA init is the long pole in the boot process, and its asynchronous.
|
|
move the graphics init after it so that ata and graphics initialize
|
|
in parallel
|
|
---
|
|
drivers/Makefile | 15 ++++++++-------
|
|
1 file changed, 8 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/drivers/Makefile b/drivers/Makefile
|
|
index c0cd1b9..af1e2fb 100644
|
|
--- a/drivers/Makefile
|
|
+++ b/drivers/Makefile
|
|
@@ -59,15 +59,8 @@ obj-y += char/
|
|
# iommu/ comes before gpu as gpu are using iommu controllers
|
|
obj-y += iommu/
|
|
|
|
-# gpu/ comes after char for AGP vs DRM startup and after iommu
|
|
-obj-y += gpu/
|
|
-
|
|
obj-$(CONFIG_CONNECTOR) += connector/
|
|
|
|
-# i810fb and intelfb depend on char/agp/
|
|
-obj-$(CONFIG_FB_I810) += video/fbdev/i810/
|
|
-obj-$(CONFIG_FB_INTEL) += video/fbdev/intelfb/
|
|
-
|
|
obj-$(CONFIG_PARPORT) += parport/
|
|
obj-$(CONFIG_NVM) += lightnvm/
|
|
obj-y += base/ block/ misc/ mfd/ nfc/
|
|
@@ -80,6 +73,14 @@ obj-$(CONFIG_IDE) += ide/
|
|
obj-y += scsi/
|
|
obj-y += nvme/
|
|
obj-$(CONFIG_ATA) += ata/
|
|
+
|
|
+# gpu/ comes after char for AGP vs DRM startup and after iommu
|
|
+obj-y += gpu/
|
|
+
|
|
+# i810fb and intelfb depend on char/agp/
|
|
+obj-$(CONFIG_FB_I810) += video/fbdev/i810/
|
|
+obj-$(CONFIG_FB_INTEL) += video/fbdev/intelfb/
|
|
+
|
|
obj-$(CONFIG_TARGET_CORE) += target/
|
|
obj-$(CONFIG_MTD) += mtd/
|
|
obj-$(CONFIG_SPI) += spi/
|
|
--
|
|
https://clearlinux.org
|
|
|
|
From 676c2dc63592f52b716515573a3a825582a371e9 Mon Sep 17 00:00:00 2001
|
|
From: Arjan van de Ven <arjan@linux.intel.com>
|
|
Date: Sat, 8 Dec 2018 18:21:32 +0000
|
|
Subject: [PATCH 1/9] x86/vdso: Use lfence instead of rep and nop
|
|
|
|
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
|
---
|
|
arch/x86/include/asm/vdso/processor.h | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/arch/x86/include/asm/vdso/processor.h b/arch/x86/include/asm/vdso/processor.h
|
|
index 57b1a7034c64..e2c45674f989 100644
|
|
--- a/arch/x86/include/asm/vdso/processor.h
|
|
+++ b/arch/x86/include/asm/vdso/processor.h
|
|
@@ -10,7 +10,7 @@
|
|
/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
|
|
static __always_inline void rep_nop(void)
|
|
{
|
|
- asm volatile("rep; nop" ::: "memory");
|
|
+ asm volatile("lfence" ::: "memory");
|
|
}
|
|
|
|
static __always_inline void cpu_relax(void)
|
|
--
|
|
2.39.1
|
|
|
|
From 48dc9669f8db68adc480ffc2698ed8204440e45b Mon Sep 17 00:00:00 2001
|
|
From: Arjan van de Ven <arjan@linux.intel.com>
|
|
Date: Thu, 13 Dec 2018 01:00:49 +0000
|
|
Subject: [PATCH 2/9] sched/wait: Do accept() in LIFO order for cache
|
|
efficiency
|
|
|
|
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
|
---
|
|
include/linux/wait.h | 2 ++
|
|
kernel/sched/wait.c | 24 ++++++++++++++++++++++++
|
|
net/ipv4/inet_connection_sock.c | 2 +-
|
|
3 files changed, 27 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/include/linux/wait.h b/include/linux/wait.h
|
|
index a0307b516b09..edc21128f387 100644
|
|
--- a/include/linux/wait.h
|
|
+++ b/include/linux/wait.h
|
|
@@ -165,6 +165,7 @@ static inline bool wq_has_sleeper(struct wait_queue_head *wq_head)
|
|
|
|
extern void add_wait_queue(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry);
|
|
extern void add_wait_queue_exclusive(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry);
|
|
+extern void add_wait_queue_exclusive_lifo(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry);
|
|
extern void add_wait_queue_priority(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry);
|
|
extern void remove_wait_queue(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry);
|
|
|
|
@@ -1192,6 +1193,7 @@ do { \
|
|
*/
|
|
void prepare_to_wait(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry, int state);
|
|
bool prepare_to_wait_exclusive(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry, int state);
|
|
+void prepare_to_wait_exclusive_lifo(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry, int state);
|
|
long prepare_to_wait_event(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry, int state);
|
|
void finish_wait(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry);
|
|
long wait_woken(struct wait_queue_entry *wq_entry, unsigned mode, long timeout);
|
|
diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c
|
|
index 133b74730738..1647fb8662eb 100644
|
|
--- a/kernel/sched/wait.c
|
|
+++ b/kernel/sched/wait.c
|
|
@@ -47,6 +47,17 @@ void add_wait_queue_priority(struct wait_queue_head *wq_head, struct wait_queue_
|
|
}
|
|
EXPORT_SYMBOL_GPL(add_wait_queue_priority);
|
|
|
|
+void add_wait_queue_exclusive_lifo(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry)
|
|
+{
|
|
+ unsigned long flags;
|
|
+
|
|
+ wq_entry->flags |= WQ_FLAG_EXCLUSIVE;
|
|
+ spin_lock_irqsave(&wq_head->lock, flags);
|
|
+ __add_wait_queue(wq_head, wq_entry);
|
|
+ spin_unlock_irqrestore(&wq_head->lock, flags);
|
|
+}
|
|
+EXPORT_SYMBOL(add_wait_queue_exclusive_lifo);
|
|
+
|
|
void remove_wait_queue(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry)
|
|
{
|
|
unsigned long flags;
|
|
@@ -293,6 +304,19 @@ prepare_to_wait_exclusive(struct wait_queue_head *wq_head, struct wait_queue_ent
|
|
}
|
|
EXPORT_SYMBOL(prepare_to_wait_exclusive);
|
|
|
|
+void prepare_to_wait_exclusive_lifo(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry, int state)
|
|
+{
|
|
+ unsigned long flags;
|
|
+
|
|
+ wq_entry->flags |= WQ_FLAG_EXCLUSIVE;
|
|
+ spin_lock_irqsave(&wq_head->lock, flags);
|
|
+ if (list_empty(&wq_entry->entry))
|
|
+ __add_wait_queue(wq_head, wq_entry);
|
|
+ set_current_state(state);
|
|
+ spin_unlock_irqrestore(&wq_head->lock, flags);
|
|
+}
|
|
+EXPORT_SYMBOL(prepare_to_wait_exclusive_lifo);
|
|
+
|
|
void init_wait_entry(struct wait_queue_entry *wq_entry, int flags)
|
|
{
|
|
wq_entry->flags = flags;
|
|
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
|
|
index f2c43f67187d..9885bfb429a2 100644
|
|
--- a/net/ipv4/inet_connection_sock.c
|
|
+++ b/net/ipv4/inet_connection_sock.c
|
|
@@ -606,7 +606,7 @@ static int inet_csk_wait_for_connect(struct sock *sk, long timeo)
|
|
* having to remove and re-insert us on the wait queue.
|
|
*/
|
|
for (;;) {
|
|
- prepare_to_wait_exclusive(sk_sleep(sk), &wait,
|
|
+ prepare_to_wait_exclusive_lifo(sk_sleep(sk), &wait,
|
|
TASK_INTERRUPTIBLE);
|
|
release_sock(sk);
|
|
if (reqsk_queue_empty(&icsk->icsk_accept_queue))
|
|
--
|
|
2.39.1
|
|
|
|
|
|
|
|
From afa213811c5490906caf394b20bb4b616fc6f12a Mon Sep 17 00:00:00 2001
|
|
From: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
|
|
Date: Thu, 25 Aug 2022 15:55:26 -0700
|
|
Subject: [PATCH 3/9] sched/fair: Simplify asym_packing logic for SMT sched
|
|
groups
|
|
|
|
When the destination CPU is an SMT sibling and idle, it can only help the
|
|
busiest group if all of its other SMT siblings are also idle. Otherwise,
|
|
there is not increase in throughput.
|
|
|
|
It does not matter whether the busiest group has SMT siblings. Simply
|
|
check if there are any tasks running on the local group before proceeding.
|
|
|
|
Cc: Ben Segall <bsegall@google.com>
|
|
Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
|
|
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
|
|
Cc: Len Brown <len.brown@intel.com>
|
|
Cc: Mel Gorman <mgorman@suse.de>
|
|
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
|
Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
|
|
Cc: Steven Rostedt <rostedt@goodmis.org>
|
|
Cc: Tim C. Chen <tim.c.chen@intel.com>
|
|
Cc: Valentin Schneider <vschneid@redhat.com>
|
|
Cc: x86@kernel.org
|
|
Cc: linux-kernel@vger.kernel.org
|
|
Reviewed-by: Len Brown <len.brown@intel.com>
|
|
Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
|
|
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
|
---
|
|
kernel/sched/fair.c | 29 +++++++++--------------------
|
|
1 file changed, 9 insertions(+), 20 deletions(-)
|
|
|
|
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
|
|
index 345cc5e9fa6e..60f9690a5626 100644
|
|
--- a/kernel/sched/fair.c
|
|
+++ b/kernel/sched/fair.c
|
|
@@ -8921,12 +8921,10 @@ static bool asym_smt_can_pull_tasks(int dst_cpu, struct sd_lb_stats *sds,
|
|
struct sched_group *sg)
|
|
{
|
|
#ifdef CONFIG_SCHED_SMT
|
|
- bool local_is_smt, sg_is_smt;
|
|
+ bool local_is_smt;
|
|
int sg_busy_cpus;
|
|
|
|
local_is_smt = sds->local->flags & SD_SHARE_CPUCAPACITY;
|
|
- sg_is_smt = sg->flags & SD_SHARE_CPUCAPACITY;
|
|
-
|
|
sg_busy_cpus = sgs->group_weight - sgs->idle_cpus;
|
|
|
|
if (!local_is_smt) {
|
|
@@ -8947,25 +8945,16 @@ static bool asym_smt_can_pull_tasks(int dst_cpu, struct sd_lb_stats *sds,
|
|
return sched_asym_prefer(dst_cpu, sg->asym_prefer_cpu);
|
|
}
|
|
|
|
- /* @dst_cpu has SMT siblings. */
|
|
-
|
|
- if (sg_is_smt) {
|
|
- int local_busy_cpus = sds->local->group_weight -
|
|
- sds->local_stat.idle_cpus;
|
|
- int busy_cpus_delta = sg_busy_cpus - local_busy_cpus;
|
|
-
|
|
- if (busy_cpus_delta == 1)
|
|
- return sched_asym_prefer(dst_cpu, sg->asym_prefer_cpu);
|
|
-
|
|
- return false;
|
|
- }
|
|
-
|
|
/*
|
|
- * @sg does not have SMT siblings. Ensure that @sds::local does not end
|
|
- * up with more than one busy SMT sibling and only pull tasks if there
|
|
- * are not busy CPUs (i.e., no CPU has running tasks).
|
|
+ * @dst_cpu has SMT siblings. When both @dst_cpu and the busiest core
|
|
+ * have one or more busy siblings, moving tasks between them results
|
|
+ * in the same throughput. Only if all the siblings of @dst_cpu are
|
|
+ * idle throughput can increase.
|
|
+ *
|
|
+ * If the difference in the number of busy CPUs is two or more, let
|
|
+ * find_busiest_group() take care of it.
|
|
*/
|
|
- if (!sds->local_stat.sum_nr_running)
|
|
+ if (sg_busy_cpus == 1 && !sds->local_stat.sum_nr_running)
|
|
return sched_asym_prefer(dst_cpu, sg->asym_prefer_cpu);
|
|
|
|
return false;
|
|
--
|
|
2.39.1
|
|
|
|
|
|
|
|
From a1f627fd10ced4f5eeae678bc4ba96ea7fa01d7e Mon Sep 17 00:00:00 2001
|
|
From: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
|
|
Date: Thu, 25 Aug 2022 15:55:28 -0700
|
|
Subject: [PATCH 4/9] sched/fair: Let lower-priority CPUs do active balancing
|
|
|
|
When more than one SMT siblings of a physical core are busy, an idle CPU
|
|
of lower priority can help.
|
|
|
|
Indicate that the low priority CPU can do active balancing from the high-
|
|
priority CPU only if they belong to separate cores.
|
|
|
|
Cc: Ben Segall <bsegall@google.com>
|
|
Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
|
|
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
|
|
Cc: Len Brown <len.brown@intel.com>
|
|
Cc: Mel Gorman <mgorman@suse.de>
|
|
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
|
Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
|
|
Cc: Steven Rostedt <rostedt@goodmis.org>
|
|
Cc: Tim C. Chen <tim.c.chen@intel.com>
|
|
Cc: Valentin Schneider <vschneid@redhat.com>
|
|
Cc: x86@kernel.org
|
|
Cc: linux-kernel@vger.kernel.org
|
|
Reviewed-by: Len Brown <len.brown@intel.com>
|
|
Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
|
|
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
|
---
|
|
kernel/sched/fair.c | 7 ++++++-
|
|
1 file changed, 6 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
|
|
index 60f9690a5626..67b0eacad0e9 100644
|
|
--- a/kernel/sched/fair.c
|
|
+++ b/kernel/sched/fair.c
|
|
@@ -10176,9 +10176,14 @@ asym_active_balance(struct lb_env *env)
|
|
* ASYM_PACKING needs to force migrate tasks from busy but
|
|
* lower priority CPUs in order to pack all tasks in the
|
|
* highest priority CPUs.
|
|
+ *
|
|
+ * If the busy CPU has higher priority but is an SMT sibling
|
|
+ * in which other SMT siblings are also busy, a lower-priority
|
|
+ * CPU in a separate core can help.
|
|
*/
|
|
return env->idle != CPU_NOT_IDLE && (env->sd->flags & SD_ASYM_PACKING) &&
|
|
- sched_asym_prefer(env->dst_cpu, env->src_cpu);
|
|
+ (sched_asym_prefer(env->dst_cpu, env->src_cpu) ||
|
|
+ !(env->sd->flags & SD_SHARE_CPUCAPACITY));
|
|
}
|
|
|
|
static inline bool
|
|
--
|
|
2.39.1
|