From cbdb399e6d9a93aa9ae7fa1aa07e98b19009b7c8 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Fri, 16 Sep 2022 20:59:13 -0400 Subject: [PATCH] [DNM] irqlist: initial implementation for migration condition for packing --- irqlist.c | 24 +++++++++++++++++++++++- placement.c | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/irqlist.c b/irqlist.c index 4dd4a83..d18261c 100644 --- a/irqlist.c +++ b/irqlist.c @@ -79,7 +79,7 @@ static void move_candidate_irqs(struct irq_info *info, void *data) unsigned long delta_load = 0; /* Don't rebalance irqs that don't want it */ - if (info->level == BALANCE_NONE) + if (info->level == BALANCE_NONE || info->level == BALANCE_CORE) return; /* Don't move cpus that only have one irq, regardless of load */ @@ -113,6 +113,27 @@ static void move_candidate_irqs(struct irq_info *info, void *data) info->assigned_obj = NULL; } +static void move_candidate_irqs_packing(GList *irqs, struct topo_obj *obj, struct load_balance_info *lb_info) +{ + GList *entry; + entry = g_list_last(irqs); + while (entry) { + struct irq_info *info = entry->data; + + // Only pack BALANCE_CORE irqs + if (info->level != BALANCE_CORE) + continue; + + + if (lb_info->adjustment_load >= obj->max_load / 10 * 9) { + lb_info->adjustment_load -= info->load; + migrate_irq(&info->assigned_obj->interrupts, &rebalance_irq_list, info); + } + + entry = g_list_previous(entry); + } +} + static void migrate_overloaded_irqs(struct topo_obj *obj, void *data) { struct load_balance_info *info = data; @@ -143,6 +164,7 @@ static void migrate_overloaded_irqs(struct topo_obj *obj, void *data) */ info->adjustment_load = obj->load; for_each_irq(obj->interrupts, move_candidate_irqs, info); + move_candidate_irqs_packing(obj->interrupts, obj, info); } } diff --git a/placement.c b/placement.c index d2cdace..2ba2cc4 100644 --- a/placement.c +++ b/placement.c @@ -91,7 +91,7 @@ static void find_best_object_packing(GList *objs, struct irq_info *info, struct (!cpus_intersects(d->mask, unbanned_cpus))) continue; - if (d->load + info->load < d->max_load) { + if (d->load + info->load < d->max_load / 10 * 9) { place->best = d; place->best_cost = d->load + info->load; return;