Skip to content

Commit

Permalink
arm64: Add irq aff change check
Browse files Browse the repository at this point in the history
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 17, 2020
1 parent 654f9c5 commit 55c5c32
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 4 deletions.
8 changes: 7 additions & 1 deletion activate.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -70,7 +71,12 @@ static void activate_mapping(struct irq_info *info, void *data __attribute__((un
return;

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);
add_banned_irq(info->irq);
remove_one_irq_from_db(info->irq);
}
fclose(file);
info->moved = 0; /*migration is done*/
}
Expand Down
28 changes: 25 additions & 3 deletions classify.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -280,9 +280,14 @@ static void add_banned_irq(int irq, GList **list)
return;
}

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)
Expand Down Expand Up @@ -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)
return;

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

static void parse_user_policy_key(char *buf, int irq, struct user_irq_policy *pol)
{
char *key, *value, *end;
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions irqbalance.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)


Expand Down

0 comments on commit 55c5c32

Please sign in to comment.