Browse Source

Unfinished get_affinity()

Serj Kalichev 10 years ago
parent
commit
9768b76d93
3 changed files with 54 additions and 19 deletions
  1. 1 0
      irq.h
  2. 47 18
      irq_parse.c
  3. 6 1
      statistics.c

+ 1 - 0
irq.h

@@ -10,6 +10,7 @@ struct irq_s {
 	char *desc; /* IRQ text description - device list */
 	int refresh; /* Refresh flag. It !=0 if irq was found while populate */
 	cpumask_t local_cpus; /* Local CPUs for this IRQs */
+	cpumask_t affinity; /* Real current affinity form /proc/irq/.../smp_affinity */
 	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 */

+ 47 - 18
irq_parse.c

@@ -197,6 +197,51 @@ static int parse_sysfs(lub_list_t *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;
+}
+
+static int irq_get_affinity(irq_t *irq)
+{
+	char path[PATH_MAX];
+	FILE *fd;
+	char *str = NULL;
+	size_t sz;
+
+	if (!irq)
+		return -1;
+
+	sprintf(path, "%s/%u/smp_affinity", PROC_IRQ, irq->irq);
+	if (!(fd = fopen(path, "r")))
+		return -1;
+	if (getline(&str, &sz, fd) < 0) {
+		fclose(fd);
+		return -1;
+	}
+	fclose(fd);
+printf("3QQQQQQQQQQ %u, %s\n", irq->irq, str);
+	cpumask_parse_user(str, strlen(str), irq->affinity);
+	free(str);
+
+	return 0;
+}
+
+
 /* Parse /proc/interrupts to get actual IRQ list */
 int scan_irqs(lub_list_t *irqs, lub_list_t *balance_irqs)
 {
@@ -242,6 +287,8 @@ int scan_irqs(lub_list_t *irqs, lub_list_t *balance_irqs)
 		free(irq->desc);
 		irq->desc = strndup(tok, endptr - tok);
 
+		irq_get_affinity(irq);
+
 		if (new) {
 			/* By default all CPUs are local for IRQ. Real local
 			   CPUs will be find while sysfs scan. */
@@ -281,21 +328,3 @@ int scan_irqs(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;
-}

+ 6 - 1
statistics.c

@@ -134,9 +134,14 @@ void show_statistics(lub_list_t *cpus, int verbose)
 			continue;
 		for (irq_iter = lub_list_iterator_init(cpu->irqs); irq_iter;
 		irq_iter = lub_list_iterator_next(irq_iter)) {
+			char buf[NR_CPUS + 1];
 			irq_t *irq;
+			if (cpus_full(irq->affinity))
+				snprintf(buf, sizeof(buf), "*");
+			else
+				cpumask_scnprintf(buf, sizeof(buf), irq->affinity);
 			irq = (irq_t *)lub_list_node__get_data(irq_iter);
-			printf("    IRQ %3u, dmf %d, intr %llu, %s\n", irq->irq, irq->dont_move, irq->intr, irq->desc);
+			printf("    IRQ %3u, [%s], dmf %d, intr %llu, %s\n", irq->irq, buf, irq->dont_move, irq->intr, irq->desc);
 		}
 	}
 }