Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
forked fromtorvalds/linux

Commitc942cee

Browse files
committed
genirq: Separate activation and startup
Activation of an interrupt and startup are currently a combofunctionlity. That works so far, but upcoming changes require a strictseparation because the activation can fail in future.Signed-off-by: Thomas Gleixner <tglx@linutronix.de>Tested-by: Juergen Gross <jgross@suse.com>Tested-by: Yu Chen <yu.c.chen@intel.com>Acked-by: Juergen Gross <jgross@suse.com>Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>Cc: Tony Luck <tony.luck@intel.com>Cc: Marc Zyngier <marc.zyngier@arm.com>Cc: Alok Kataria <akataria@vmware.com>Cc: Joerg Roedel <joro@8bytes.org>Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>Cc: Steven Rostedt <rostedt@goodmis.org>Cc: Christoph Hellwig <hch@lst.de>Cc: Peter Zijlstra <peterz@infradead.org>Cc: Borislav Petkov <bp@alien8.de>Cc: Paolo Bonzini <pbonzini@redhat.com>Cc: Rui Zhang <rui.zhang@intel.com>Cc: "K. Y. Srinivasan" <kys@microsoft.com>Cc: Arjan van de Ven <arjan@linux.intel.com>Cc: Dan Williams <dan.j.williams@intel.com>Cc: Len Brown <lenb@kernel.org>Link:https://lkml.kernel.org/r/20170913213152.754334077@linutronix.de
1 parent239306f commitc942cee

File tree

4 files changed

+43
-8
lines changed

4 files changed

+43
-8
lines changed

‎kernel/irq/autoprobe.c‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ unsigned long probe_irq_on(void)
5353
if (desc->irq_data.chip->irq_set_type)
5454
desc->irq_data.chip->irq_set_type(&desc->irq_data,
5555
IRQ_TYPE_PROBE);
56-
irq_startup(desc,IRQ_NORESEND,IRQ_START_FORCE);
56+
irq_activate_and_startup(desc,IRQ_NORESEND);
5757
}
5858
raw_spin_unlock_irq(&desc->lock);
5959
}

‎kernel/irq/chip.c‎

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -207,20 +207,19 @@ __irq_startup_managed(struct irq_desc *desc, struct cpumask *aff, bool force)
207207
* Catch code which fiddles with enable_irq() on a managed
208208
* and potentially shutdown IRQ. Chained interrupt
209209
* installment or irq auto probing should not happen on
210-
* managed irqs either. Emit a warning, break the affinity
211-
* and start it up as a normal interrupt.
210+
* managed irqs either.
212211
*/
213212
if (WARN_ON_ONCE(force))
214-
returnIRQ_STARTUP_NORMAL;
213+
returnIRQ_STARTUP_ABORT;
215214
/*
216215
* The interrupt was requested, but there is no online CPU
217216
* in it's affinity mask. Put it into managed shutdown
218217
* state and let the cpu hotplug mechanism start it up once
219218
* a CPU in the mask becomes available.
220219
*/
221-
irqd_set_managed_shutdown(d);
222220
returnIRQ_STARTUP_ABORT;
223221
}
222+
irq_domain_activate_irq(d);
224223
returnIRQ_STARTUP_MANAGED;
225224
}
226225
#else
@@ -236,7 +235,9 @@ static int __irq_startup(struct irq_desc *desc)
236235
structirq_data*d=irq_desc_get_irq_data(desc);
237236
intret=0;
238237

239-
irq_domain_activate_irq(d);
238+
/* Warn if this interrupt is not activated but try nevertheless */
239+
WARN_ON_ONCE(!irqd_is_activated(d));
240+
240241
if (d->chip->irq_startup) {
241242
ret=d->chip->irq_startup(d);
242243
irq_state_clr_disabled(desc);
@@ -269,6 +270,7 @@ int irq_startup(struct irq_desc *desc, bool resend, bool force)
269270
irq_set_affinity_locked(d,aff, false);
270271
break;
271272
caseIRQ_STARTUP_ABORT:
273+
irqd_set_managed_shutdown(d);
272274
return0;
273275
}
274276
}
@@ -278,6 +280,22 @@ int irq_startup(struct irq_desc *desc, bool resend, bool force)
278280
returnret;
279281
}
280282

283+
intirq_activate(structirq_desc*desc)
284+
{
285+
structirq_data*d=irq_desc_get_irq_data(desc);
286+
287+
if (!irqd_affinity_is_managed(d))
288+
irq_domain_activate_irq(d);
289+
return0;
290+
}
291+
292+
voidirq_activate_and_startup(structirq_desc*desc,boolresend)
293+
{
294+
if (WARN_ON(irq_activate(desc)))
295+
return;
296+
irq_startup(desc,resend,IRQ_START_FORCE);
297+
}
298+
281299
staticvoid__irq_disable(structirq_desc*desc,boolmask);
282300

283301
voidirq_shutdown(structirq_desc*desc)
@@ -953,7 +971,7 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle,
953971
irq_settings_set_norequest(desc);
954972
irq_settings_set_nothread(desc);
955973
desc->action=&chained_action;
956-
irq_startup(desc,IRQ_RESEND,IRQ_START_FORCE);
974+
irq_activate_and_startup(desc,IRQ_RESEND);
957975
}
958976
}
959977

‎kernel/irq/internals.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ extern void __enable_irq(struct irq_desc *desc);
7474
#defineIRQ_START_FORCEtrue
7575
#defineIRQ_START_CONDfalse
7676

77+
externintirq_activate(structirq_desc*desc);
78+
externvoidirq_activate_and_startup(structirq_desc*desc,boolresend);
7779
externintirq_startup(structirq_desc*desc,boolresend,boolforce);
7880

7981
externvoidirq_shutdown(structirq_desc*desc);

‎kernel/irq/manage.c‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ void __enable_irq(struct irq_desc *desc)
519519
* time. If it was already started up, then irq_startup()
520520
* will invoke irq_enable() under the hood.
521521
*/
522-
irq_startup(desc,IRQ_RESEND,IRQ_START_COND);
522+
irq_startup(desc,IRQ_RESEND,IRQ_START_FORCE);
523523
break;
524524
}
525525
default:
@@ -1325,6 +1325,21 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
13251325
gotoout_unlock;
13261326
}
13271327

1328+
/*
1329+
* Activate the interrupt. That activation must happen
1330+
* independently of IRQ_NOAUTOEN. request_irq() can fail
1331+
* and the callers are supposed to handle
1332+
* that. enable_irq() of an interrupt requested with
1333+
* IRQ_NOAUTOEN is not supposed to fail. The activation
1334+
* keeps it in shutdown mode, it merily associates
1335+
* resources if necessary and if that's not possible it
1336+
* fails. Interrupts which are in managed shutdown mode
1337+
* will simply ignore that activation request.
1338+
*/
1339+
ret=irq_activate(desc);
1340+
if (ret)
1341+
gotoout_unlock;
1342+
13281343
desc->istate &= ~(IRQS_AUTODETECT |IRQS_SPURIOUS_DISABLED | \
13291344
IRQS_ONESHOT |IRQS_WAITING);
13301345
irqd_clear(&desc->irq_data,IRQD_IRQ_INPROGRESS);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp