Browse Source

Add dont_move flag for IRQs

Serj Kalichev 10 years ago
parent
commit
7bb44338de
4 changed files with 37 additions and 4 deletions
  1. 33 3
      balance.c
  2. 1 0
      irq.h
  3. 2 0
      irq_parse.c
  4. 1 1
      statistics.c

+ 33 - 3
balance.c

@@ -14,6 +14,24 @@
 #include "cpu.h"
 #include "irq.h"
 
+/* Drop the dont_move flag on all IRQs for specified CPU */
+static int drop_dont_move_flag(cpu_t *cpu)
+{
+	lub_list_node_t *iter;
+
+	if (!cpu)
+		return -1;
+
+	for (iter = lub_list_iterator_init(cpu->irqs); iter;
+		iter = lub_list_iterator_next(iter)) {
+		irq_t *irq;
+		irq = (irq_t *)lub_list_node__get_data(iter);
+		irq->dont_move = 0;
+	}
+
+	return 0;
+}
+
 /* Move IRQ to specified CPU. Remove IRQ from the IRQ list
    of old CPU. */
 static int move_irq_to_cpu(irq_t *irq, cpu_t *cpu)
@@ -29,9 +47,12 @@ static int move_irq_to_cpu(irq_t *irq, cpu_t *cpu)
 			lub_list_del(old_cpu->irqs, node);
 			lub_list_node_free(node);
 		}
+		drop_dont_move_flag(old_cpu);
 	}
-	lub_list_add(cpu->irqs, irq);
+	drop_dont_move_flag(cpu);
 	irq->cpu = cpu;
+	lub_list_add(cpu->irqs, irq);
+
 	return 0;
 }
 
@@ -101,8 +122,12 @@ int balance(lub_list_t *cpus, lub_list_t *balance_irqs, float threshold)
 			cpu = choose_cpu(cpus, complement, threshold);
 		}
 		if (cpu) {
+			if (irq->cpu)
+				printf("Move IRQ %u from CPU%u to CPU%u\n",
+					irq->irq, irq->cpu->id, cpu->id);
+			else
+				printf("Move IRQ %u to CPU%u\n", irq->irq, cpu->id);
 			move_irq_to_cpu(irq, cpu);
-			printf("Move IRQ %u to CPU%u\n", irq->irq, cpu->id);
 		}
 	}
 
@@ -159,14 +184,19 @@ int choose_irqs_to_move(lub_list_t *cpus, lub_list_t *balance_irqs, float thresh
 	for (iter = lub_list_iterator_init(overloaded_cpu->irqs); iter;
 		iter = lub_list_iterator_next(iter)) {
 		irq_t *irq = (irq_t *)lub_list_node__get_data(iter);
+		if (irq->dont_move)
+			continue;
 		if (irq->intr >= max_intr) {
 			max_intr = irq->intr;
 			irq_to_move = irq;
 		}
 	}
 
-	if (irq_to_move)
+	if (irq_to_move) {
+		/* Don't move this IRQ while next iteration. */
+		irq_to_move->dont_move = 1;
 		lub_list_add(balance_irqs, irq_to_move);
+	}
 
 	return 0;
 }

+ 1 - 0
irq.h

@@ -13,6 +13,7 @@ struct irq_s {
 	unsigned long long intr; /* Current number of interrupts */
 	unsigned long long old_intr; /* Previous total number of interrupts. */
 	cpu_t *cpu; /* Current IRQ affinity. Reference to correspondent CPU */
+	int dont_move; /* Flag to don't move current IRQ anyway */
 };
 typedef struct irq_s irq_t;
 

+ 2 - 0
irq_parse.c

@@ -35,6 +35,8 @@ static irq_t * irq_new(int num)
 	new->old_intr = 0;
 	new->intr = 0;
 	new->cpu = NULL;
+	new->dont_move = 0;
+
 	return new;
 }
 

+ 1 - 1
statistics.c

@@ -142,7 +142,7 @@ void show_statistics(lub_list_t *cpus)
 		irq_iter = lub_list_iterator_next(irq_iter)) {
 			irq_t *irq;
 			irq = (irq_t *)lub_list_node__get_data(irq_iter);
-			printf("    IRQ %3u, intr %llu, %s\n", irq->irq, irq->intr, irq->desc);
+			printf("    IRQ %3u, dmf %d, intr %llu, %s\n", irq->irq, irq->dont_move, irq->intr, irq->desc);
 		}
 	}
 }