From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756561AbeARQMx (ORCPT ); Thu, 18 Jan 2018 11:12:53 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:44581 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755963AbeARQMp (ORCPT ); Thu, 18 Jan 2018 11:12:45 -0500 X-Google-Smtp-Source: ACJfBotDcslzw2Vx2T0/EBlECp6Q7sXAoKHx7Nj6tB1wyENWaxY7cZMogAykTsd4473mkWZNSf1whA== From: Dmitry Safonov To: linux-kernel@vger.kernel.org Cc: Dmitry Safonov , Andrew Morton , David Miller , Eric Dumazet , Frederic Weisbecker , Hannes Frederic Sowa , Ingo Molnar , "Levin, Alexander (Sasha Levin)" , Linus Torvalds , Mauro Carvalho Chehab , Mike Galbraith , Paolo Abeni , "Paul E. McKenney" , Peter Zijlstra , Radu Rendec , Rik van Riel , Stanislaw Gruszka , Thomas Gleixner , Wanpeng Li Subject: [RFC 3/6] softirq: Add reverse group-to-softirq map Date: Thu, 18 Jan 2018 16:12:35 +0000 Message-Id: <20180118161238.13792-4-dima@arista.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180118161238.13792-1-dima@arista.com> References: <20180118161238.13792-1-dima@arista.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For faster operation with pending mask: pending &= group_to_softirq[group_nr]; Signed-off-by: Dmitry Safonov --- kernel/softirq.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/kernel/softirq.c b/kernel/softirq.c index ca8c3db4570d..7de5791c08f9 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -54,6 +54,7 @@ EXPORT_SYMBOL(irq_stat); #endif static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; +static unsigned group_to_softirqs[sizeof(softirq_vec[0].group_mask)] __cacheline_aligned_in_smp; static unsigned __initdata nr_softirq_groups = 0; DEFINE_PER_CPU(struct task_struct *, ksoftirqd); @@ -650,11 +651,28 @@ static void __init setup_default_softirq_group(unsigned nr) } } +static void __init fill_group_to_softirq_maps(void) +{ + unsigned i; + + for (i = 0; i < NR_SOFTIRQS; i++) { + u32 mask = softirq_vec[i].group_mask; + unsigned j, group = 0; + + while ((j = ffs(mask))) { + group += j - 1; + group_to_softirqs[group] |= (1 << i); + mask >>= j; + } + } +} + void __init softirq_init(void) { int cpu; setup_default_softirq_group(nr_softirq_groups++); + fill_group_to_softirq_maps(); for_each_possible_cpu(cpu) { per_cpu(tasklet_vec, cpu).tail = -- 2.13.6