aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/s390/kernel/hiperdispatch.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/s390/kernel/hiperdispatch.c b/arch/s390/kernel/hiperdispatch.c
index 233872d59b76..ed5b2d7d11c4 100644
--- a/arch/s390/kernel/hiperdispatch.c
+++ b/arch/s390/kernel/hiperdispatch.c
@@ -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