From c924f1df705a301a0ffc01fce4c7712756c8b1d2 Mon Sep 17 00:00:00 2001 From: Zengruan Ye Date: Sat, 13 Jul 2019 19:09:09 +0800 Subject: [PATCH 1/6] feature: irqbalance: aarch64: add the regular to get the correct irq class on hisi board First, get the full irq desc name, include that the name split by blank, just like (hisi_sas_v2_hw sata). We use the irq type to mark the begin of the name. Second, for hisi bord, we consider to match the IRQ_SCSI class (which the irqbalance service concerned, and the eth device match follow the open community rule) by keywords group hisi & sas or hisi & sata. Signed-off-by: wanghaibin --- procinterrupts.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/procinterrupts.c b/procinterrupts.c index fc4641a..99bcf50 100644 --- a/procinterrupts.c +++ b/procinterrupts.c @@ -107,7 +107,9 @@ static void guess_arm_irq_hints(char *name, struct irq_info *info) static int compiled = 0; /* Note: Last entry is a catchall */ static struct irq_match matches[] = { - { "eth.*" ,{NULL} ,NULL, IRQ_TYPE_LEGACY, IRQ_GBETH }, + { "eth.*" ,{NULL} ,NULL, IRQ_TYPE_LEGACY, IRQ_GBETH}, + { "hisi\\w*? *sas" ,{NULL} ,NULL, IRQ_TYPE_LEGACY, IRQ_SCSI}, + { "hisi\\w*? *sata" ,{NULL} ,NULL, IRQ_TYPE_LEGACY, IRQ_SCSI}, { "[A-Z0-9]{4}[0-9a-f]{4}", {NULL} ,check_platform_device, IRQ_TYPE_LEGACY, IRQ_OTHER}, { "PNP[0-9a-f]{4}", {NULL} ,check_platform_device, IRQ_TYPE_LEGACY, IRQ_OTHER}, { ".*", {NULL}, NULL, IRQ_TYPE_LEGACY, IRQ_OTHER}, @@ -152,6 +154,7 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int int is_xen_dyn = 0; #ifdef AARCH64 char *tmp = NULL; + char irq_fullname[PATH_MAX] = {0}; #endif irq_name = strtok_r(savedline, " ", &savedptr); @@ -163,6 +166,16 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int if (strstr(irq_name, "xen-dyn") != NULL) is_xen_dyn = 1; last_token = p; + +#ifdef AARCH64 + /* + * /proc/interrupts format defined, after of interrupt type + * the reset string is mark the irq desc name. + */ + if (strncmp(irq_name, "Level", strlen("Level")) == 0 || + strncmp(irq_name, "Edge", strlen("Edge")) == 0) + break; +#endif } #ifdef AARCH64 @@ -171,6 +184,13 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int tmp = strchr(irq_name, '\n'); if (tmp) *tmp = 0; + + strcat(irq_fullname, irq_name); + strcat(irq_fullname, " "); + strcat(irq_fullname, savedptr); + tmp = strchr(irq_fullname, '\n'); + if (tmp) + *tmp = 0; #endif irq_mod = last_token; info->irq = irq; @@ -180,6 +200,7 @@ static void init_irq_class_and_type(char *savedline, struct irq_info *info, int info->class = IRQ_VIRT_EVENT; } else { #ifdef AARCH64 + irq_name = irq_fullname; guess_arm_irq_hints(irq_name, info); #else info->type = IRQ_TYPE_LEGACY; -- 1.8.3.1