From ccf7a1f9f085d940915e2aca163ffa19f788026d Mon Sep 17 00:00:00 2001 From: Miroslav Franc Date: Mar 26 2024 09:07:38 +0000 Subject: s390/vtime: fix average steal time calculation (git-fixes bsc#1221953). --- diff --git a/patches.suse/s390-vtime-fix-average-steal-time-calculation.patch b/patches.suse/s390-vtime-fix-average-steal-time-calculation.patch new file mode 100644 index 0000000..052522e --- /dev/null +++ b/patches.suse/s390-vtime-fix-average-steal-time-calculation.patch @@ -0,0 +1,60 @@ +From: Mete Durlu +Date: Wed, 6 Mar 2024 12:31:52 +0100 +Subject: s390/vtime: fix average steal time calculation +Git-commit: 367c50f78451d3bd7ad70bc5c89f9ba6dec46ca9 +Patch-mainline: v6.9-rc1 +References: git-fixes bsc#1221953 + +Current average steal timer calculation produces volatile and inflated +values. The only user of this value is KVM so far and it uses that to +decide whether or not to yield the vCPU which is seeing steal time. +KVM compares average steal timer to a threshold and if the threshold +is past then it does not allow CPU polling and yields it to host, else +it keeps the CPU by polling. +Since KVM's steal time threshold is very low by default (%10) it most +likely is not effected much by the bloated average steal timer values +because the operating region is pretty small. However there might be +new users in the future who might rely on this number. Fix average +steal timer calculation by changing the formula from: + + avg_steal_timer = avg_steal_timer / 2 + steal_timer; + +to the following: + + avg_steal_timer = (avg_steal_timer + steal_timer) / 2; + +This ensures that avg_steal_timer is actually a naive average of steal +timer values. It now closely follows steal timer values but of course +in a smoother manner. + +Fixes: 152e9b8676c6 ("s390/vtime: steal time exponential moving average") +Signed-off-by: Mete Durlu +Acked-by: Heiko Carstens +Acked-by: Christian Borntraeger +Signed-off-by: Heiko Carstens +Acked-by: Miroslav Franc +--- + arch/s390/kernel/vtime.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c +index e0a88dcaf5cb..24a18e5ef6e8 100644 +--- a/arch/s390/kernel/vtime.c ++++ b/arch/s390/kernel/vtime.c +@@ -210,13 +210,13 @@ void vtime_flush(struct task_struct *tsk) + virt_timer_expire(); + + steal = S390_lowcore.steal_timer; +- avg_steal = S390_lowcore.avg_steal_timer / 2; ++ avg_steal = S390_lowcore.avg_steal_timer; + if ((s64) steal > 0) { + S390_lowcore.steal_timer = 0; + account_steal_time(cputime_to_nsecs(steal)); + avg_steal += steal; + } +- S390_lowcore.avg_steal_timer = avg_steal; ++ S390_lowcore.avg_steal_timer = avg_steal / 2; + } + + /* + diff --git a/series.conf b/series.conf index 39eae20..c0aa04e 100644 --- a/series.conf +++ b/series.conf @@ -65028,6 +65028,7 @@ patches.suse/NFSD-Retransmit-callbacks-after-client-reconnects.patch patches.suse/net-sunrpc-Fix-an-off-by-one-in-rpc_sockaddr2uaddr.patch patches.suse/NFS-Fix-an-off-by-one-in-root_nfs_cat.patch + patches.suse/s390-vtime-fix-average-steal-time-calculation.patch # dhowells/linux-fs keys-uefi patches.suse/0001-KEYS-Allow-unrestricted-boot-time-addition-of-keys-t.patch