Browse Source

Apply affinity

Serj Kalichev 10 years ago
parent
commit
7d6c11a256
6 changed files with 39 additions and 4 deletions
  1. 15 0
      balance.c
  2. 1 1
      balance.h
  3. 1 1
      birq.c
  4. 2 2
      cpu_parse.c
  5. 1 0
      irq.h
  6. 19 0
      irq_parse.c

+ 15 - 0
balance.c

@@ -89,3 +89,18 @@ int balance(lub_list_t *cpus, lub_list_t *balance_irqs)
 	}
 	return 0;
 }
+
+int apply_affinity(lub_list_t *balance_irqs)
+{
+	lub_list_node_t *iter;
+
+	for (iter = lub_list_iterator_init(balance_irqs); iter;
+		iter = lub_list_iterator_next(iter)) {
+		irq_t *irq;
+		irq = (irq_t *)lub_list_node__get_data(iter);
+		if (!irq->cpu)
+			continue;
+		irq_set_affinity(irq, irq->cpu->cpumask);
+	}
+	return 0;
+}

+ 1 - 1
balance.h

@@ -6,6 +6,6 @@
 #include "cpu.h"
 
 int balance(lub_list_t *cpus, lub_list_t *balance_irqs);
-//int move_irq_to_cpu(irq_t *irq, cpu_t *cpu);
+int apply_affinity(lub_list_t *balance_irqs);
 
 #endif

+ 1 - 1
birq.c

@@ -190,7 +190,7 @@ int main(int argc, char **argv)
 		parse_proc_stat(cpus, irqs);
 		show_statistics(cpus);
 		balance(cpus, balance_irqs);
-		/* TODO: Apply changes here */
+		apply_affinity(balance_irqs);
 		while ((node = lub_list__get_tail(balance_irqs))) {
 			lub_list_del(balance_irqs, node);
 			lub_list_node_free(node);

+ 2 - 2
cpu_parse.c

@@ -43,6 +43,8 @@ static cpu_t * cpu_new(unsigned int id)
 	new->old_load_irq = 0;
 	new->load = 0;
 	new->irqs = lub_list_new(irq_list_compare);
+	cpus_clear(new->cpumask);
+	cpu_set(new->id, new->cpumask);
 
 	return new;
 }
@@ -180,8 +182,6 @@ int scan_cpus(lub_list_t *cpus)
 		new = cpu_new(id);
 		new->package_id = package_id;
 		new->core_id = core_id;
-		cpus_clear(new->cpumask);
-		cpu_set(new->id, new->cpumask);
 		cpu_list_add(cpus, new);
 	}
 

+ 1 - 0
irq.h

@@ -28,5 +28,6 @@ int irq_list_populate(lub_list_t *irqs, lub_list_t *balance_irqs);
 int irq_list_free(lub_list_t *irqs);
 int irq_list_show(lub_list_t *irqs);
 irq_t * irq_list_search(lub_list_t *irqs, unsigned int num);
+int irq_set_affinity(irq_t *irq, cpumask_t cpumask);
 
 #endif

+ 19 - 0
irq_parse.c

@@ -273,3 +273,22 @@ int irq_list_populate(lub_list_t *irqs, lub_list_t *balance_irqs)
 
 	return 0;
 }
+
+int irq_set_affinity(irq_t *irq, cpumask_t cpumask)
+{
+	char path[PATH_MAX];
+	char buf[NR_CPUS + 1];
+	FILE *fd;
+
+	if (!irq)
+		return -1;
+
+	sprintf(path, "%s/%u/smp_affinity", PROC_IRQ, irq->irq);
+	if (!(fd = fopen(path, "w")))
+		return -1;
+	cpumask_scnprintf(buf, sizeof(buf), cpumask);
+	fprintf(fd, "%s", buf);
+	fclose(fd);
+
+	return 0;
+}