diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2012-01-31 13:01:27 +0100 |
---|---|---|
committer | Clark Williams <williams@redhat.com> | 2012-02-15 10:32:53 -0600 |
commit | 9a9ded51044ea43128a49626748d26d45eee8ed6 (patch) | |
tree | 6072c0d22e9aae39f666954b1bb5d11b0c4ad1e9 /kernel/irq/manage.c | |
parent | 94be87227929747397f7bab39c205ccdde24c5b5 (diff) |
genirq: Allow disabling of softirq processing in irq thread context
The processing of softirqs in irq thread context is a performance gain
for the non-rt workloads of a system, but it's counterproductive for
interrupts which are explicitely related to the realtime
workload. Allow such interrupts to prevent softirq processing in their
thread context.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: stable-rt@vger.kernel.org
Diffstat (limited to 'kernel/irq/manage.c')
-rw-r--r-- | kernel/irq/manage.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 09ba67d9ceb7..fd301aa5665d 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -742,7 +742,15 @@ irq_forced_thread_fn(struct irq_desc *desc, struct irqaction *action) local_bh_disable(); ret = action->thread_fn(action->irq, action->dev_id); irq_finalize_oneshot(desc, action, false); - local_bh_enable(); + /* + * Interrupts which have real time requirements can be set up + * to avoid softirq processing in the thread handler. This is + * safe as these interrupts do not raise soft interrupts. + */ + if (irq_settings_no_softirq_call(desc)) + _local_bh_enable(); + else + local_bh_enable(); return ret; } @@ -1040,6 +1048,9 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) irqd_set(&desc->irq_data, IRQD_NO_BALANCING); } + if (new->flags & IRQF_NO_SOFTIRQ_CALL) + irq_settings_set_no_softirq_call(desc); + /* Set default affinity mask once everything is setup */ setup_affinity(irq, desc, mask); |