diff options
author | David S. Miller <davem@davemloft.net> | 2008-07-23 01:34:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-23 01:34:29 -0400 |
commit | b7c2a75725dee9b5643a0aae3a4cb47f52e00a49 (patch) | |
tree | 9078edae88d93db2228f20d12e334a46a37a07e7 /arch/sparc64/kernel/irq.c | |
parent | 4a0a088970a553e9f89d23eec688932f689d57f9 (diff) |
sparc64: Fix lockdep issues in LDC protocol layer.
We're calling request_irq() with a IRQs disabled.
No straightforward fix exists because we want to
enable these IRQs and setup state atomically before
getting into the IRQ handler the first time.
What happens now is that we mark the VIRQ to not be
automatically enabled by request_irq(). Then we
make explicit enable_irq() calls when we grab the
LDC channel.
This way we don't need to call request_irq() illegally
under the LDC channel lock any more.
Bump LDC version and release date.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/irq.c')
-rw-r--r-- | arch/sparc64/kernel/irq.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c index b441a26b73b0..c481673d249c 100644 --- a/arch/sparc64/kernel/irq.c +++ b/arch/sparc64/kernel/irq.c | |||
@@ -621,8 +621,9 @@ unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino) | |||
621 | unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino) | 621 | unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino) |
622 | { | 622 | { |
623 | struct irq_handler_data *data; | 623 | struct irq_handler_data *data; |
624 | struct ino_bucket *bucket; | ||
625 | unsigned long hv_err, cookie; | 624 | unsigned long hv_err, cookie; |
625 | struct ino_bucket *bucket; | ||
626 | struct irq_desc *desc; | ||
626 | unsigned int virt_irq; | 627 | unsigned int virt_irq; |
627 | 628 | ||
628 | bucket = kzalloc(sizeof(struct ino_bucket), GFP_ATOMIC); | 629 | bucket = kzalloc(sizeof(struct ino_bucket), GFP_ATOMIC); |
@@ -643,6 +644,13 @@ unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino) | |||
643 | if (unlikely(!data)) | 644 | if (unlikely(!data)) |
644 | return 0; | 645 | return 0; |
645 | 646 | ||
647 | /* In order to make the LDC channel startup sequence easier, | ||
648 | * especially wrt. locking, we do not let request_irq() enable | ||
649 | * the interrupt. | ||
650 | */ | ||
651 | desc = irq_desc + virt_irq; | ||
652 | desc->status |= IRQ_NOAUTOEN; | ||
653 | |||
646 | set_irq_chip_data(virt_irq, data); | 654 | set_irq_chip_data(virt_irq, data); |
647 | 655 | ||
648 | /* Catch accidental accesses to these things. IMAP/ICLR handling | 656 | /* Catch accidental accesses to these things. IMAP/ICLR handling |