Skip to content
Browse files

arm64: Add irq aff change check

For aarch64, the PPIs format in /proc/interrputs can be parsed and add to interrupt db, and next, the number of interrupts is counted and used to calculate the load. Finally these interrupts maybe scheduled between the NUMA domains.

Acctually, the PPIs cannot change aff, and it should not be added to interrupt db. This patch fix it.

Add a check before add a interrupt to db, just only reads the irq's aff, and write it back to avoid any impact on the system, According to the result of writing to fitler the irq.
  • Loading branch information
liuchao173 committed Mar 11, 2020
1 parent 654f9c5 commit 55c5c321c73e4c9b54e041ba8c7d542598685bae
Showing with 34 additions and 4 deletions.
  1. +7 −1 activate.c
  2. +25 −3 classify.c
  3. +2 −0 irqbalance.h
@@ -48,6 +48,7 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
char buf[PATH_MAX];
FILE *file;
int ret = 0;

* only activate mappings for irqs that have moved
@@ -70,7 +71,12 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un

cpumask_scnprintf(buf, PATH_MAX, info->assigned_obj->mask);
fprintf(file, "%s", buf);
ret = fprintf(file, "%s", buf);
if (ret < 0) {
log(TO_ALL, LOG_WARNING, "cannot change irq %i's affinity, add it to banned list", info->irq);
info->moved = 0; /*migration is done*/
@@ -256,7 +256,7 @@ static gint compare_ints(gconstpointer a, gconstpointer b)
return ai->irq - bi->irq;

static void add_banned_irq(int irq, GList **list)
static void __add_banned_irq(int irq, GList **list)
struct irq_info find, *new;
GList *entry;
@@ -280,9 +280,14 @@ static void add_banned_irq(int irq, GList **list)

void add_banned_irq(int irq)
__add_banned_irq(irq, &banned_irqs);

void add_cl_banned_irq(int irq)
add_banned_irq(irq, &cl_banned_irqs);
__add_banned_irq(irq, &cl_banned_irqs);

gint substr_find(gconstpointer a, gconstpointer b)
@@ -376,6 +381,23 @@ static struct irq_info *add_one_irq_to_db(const char *devpath, struct irq_info *
return new;

void remove_one_irq_from_db(int irq)
struct irq_info find, *tmp;
GList *entry = NULL;

find.irq = irq;
entry = g_list_find_custom(interrupts_db, &find, compare_ints);
if (!entry)

tmp = entry->data;
interrupts_db = g_list_remove(interrupts_db, tmp);
log(TO_CONSOLE, LOG_INFO, "IRQ %d was removed from db.\n", irq);

static void parse_user_policy_key(char *buf, int irq, struct user_irq_policy *pol)
char *key, *value, *end;
@@ -585,7 +607,7 @@ static void add_new_irq(char *path, struct irq_info *hint, GList *proc_interrupt
/* Set NULL devpath for the irq has no sysfs entries */
get_irq_user_policy(path, irq, &pol);
if ((pol.ban == 1) || check_for_irq_ban(irq, proc_interrupts)) { /*FIXME*/
add_banned_irq(irq, &banned_irqs);
__add_banned_irq(irq, &banned_irqs);
new = get_irq_info(irq);
} else
new = add_one_irq_to_db(path, hint, &pol);
@@ -106,6 +106,8 @@ extern struct irq_info *get_irq_info(int irq);
extern void migrate_irq(GList **from, GList **to, struct irq_info *info);
extern void free_cl_opts(void);
extern void add_cl_banned_module(char *modname);
extern void add_banned_irq(int irq);
extern void remove_one_irq_from_db(int irq);
#define irq_numa_node(irq) ((irq)->numa_node)

0 comments on commit 55c5c32

Please sign in to comment.
You can’t perform that action at this time.