]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
s390/hiperdispatch: Add steal time averaging
authorMete Durlu <meted@linux.ibm.com>
Mon, 12 Aug 2024 11:39:35 +0000 (13:39 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Thu, 29 Aug 2024 20:56:35 +0000 (22:56 +0200)
The measurements done by hiperdispatch can have sudden spikes and dips
during run time. To prevent these outliers effecting the decision making
process and causing adjustment overhead, use weighted average of the
steal time.

Acked-by: Vasily Gorbik <gor@linux.ibm.com>
Co-developed-by: Tobias Huschle <huschle@linux.ibm.com>
Signed-off-by: Tobias Huschle <huschle@linux.ibm.com>
Signed-off-by: Mete Durlu <meted@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/kernel/hiperdispatch.c

index 233872d59b76436a9d919f5e65d34166a3e32ae8..ed5b2d7d11c4f345d04f6f45ec0600debe46d60f 100644 (file)
@@ -56,6 +56,7 @@
 #define HD_DELAY_FACTOR                        (4)
 #define HD_DELAY_INTERVAL              (HZ / 4)
 #define HD_STEAL_THRESHOLD             30
+#define HD_STEAL_AVG_WEIGHT            16
 
 static cpumask_t hd_vl_coremask;       /* Mask containing all vertical low COREs */
 static cpumask_t hd_vmvl_cpumask;      /* Mask containing vertical medium and low CPUs */
@@ -136,6 +137,14 @@ int hd_enable_hiperdispatch(void)
        return 1;
 }
 
+static unsigned long hd_steal_avg(unsigned long new)
+{
+       static unsigned long steal;
+
+       steal = (steal * (HD_STEAL_AVG_WEIGHT - 1) + new) / HD_STEAL_AVG_WEIGHT;
+       return steal;
+}
+
 static unsigned long hd_calculate_steal_percentage(void)
 {
        unsigned long time_delta, steal_delta, steal, percentage;
@@ -185,7 +194,7 @@ static void hd_capacity_work_fn(struct work_struct *work)
                mutex_unlock(&smp_cpu_state_mutex);
                return;
        }
-       steal_percentage = hd_calculate_steal_percentage();
+       steal_percentage = hd_steal_avg(hd_calculate_steal_percentage());
        if (steal_percentage < HD_STEAL_THRESHOLD)
                new_cores = hd_online_cores;
        else