- if(softirq < nb_softirqs) {
- submode = ((LttvTraceState *)(s->parent.t_context))->soft_irq_names[softirq];
- } else {
- /* Fixup an incomplete irq table */
- GString *string = g_string_new("");
- g_string_printf(string, "softirq %llu", softirq);
- submode = g_quark_from_string(string->str);
- g_string_free(string, TRUE);
+ if (unlikely(nb_softirqs <= softirq)) {
+ /* Fixup an incomplete softirq table */
+ GQuark *old_names = ts->soft_irq_names;
+ guint new_nb_soft_irqs = max(softirq + 1, ts->nb_soft_irqs * 2);
+ guint i;
+ GString *fe_name = g_string_new("");
+ ts->soft_irq_names = g_new(GQuark, new_nb_soft_irqs);
+ memcpy(ts->soft_irq_names, old_names,
+ ts->nb_soft_irqs * sizeof(GQuark));
+ for(i = ts->nb_soft_irqs ; i < new_nb_soft_irqs ; i++) {
+ g_string_printf(fe_name, "softirq %d", i);
+ ts->soft_irq_names[i] = g_quark_from_string(fe_name->str);
+ }
+ g_string_free(fe_name, TRUE);
+ ts->nb_soft_irqs = new_nb_soft_irqs;