lkml.org 
[lkml]   [2015]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/apic] x86/lguest: Do not setup unused irq vectors
    Commit-ID:  ad3f8d5afe503faa78d61a50a1f6eec3afa7c787
    Gitweb: http://git.kernel.org/tip/ad3f8d5afe503faa78d61a50a1f6eec3afa7c787
    Author: Thomas Gleixner <tglx@linutronix.de>
    AuthorDate: Tue, 4 Aug 2015 14:02:56 +0930
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Thu, 6 Aug 2015 00:14:58 +0200

    x86/lguest: Do not setup unused irq vectors

    No point in assigning the interrupt vectors if there is no interrupt
    chip installed. Move it to lguest_setup_irq() and call it from
    lguest_enable_irq.

    [ rusty: Typo fix and error handling ]

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
    Link: http://lkml.kernel.org/r/1438662776-4823-2-git-send-email-rusty@rustcorp.com.au
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    arch/x86/lguest/boot.c | 22 +++++++++++++---------
    1 file changed, 13 insertions(+), 9 deletions(-)

    diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
    index d933a11..2165f45 100644
    --- a/arch/x86/lguest/boot.c
    +++ b/arch/x86/lguest/boot.c
    @@ -850,21 +850,29 @@ static int lguest_setup_irq(unsigned int irq)
    if (err < 0 && err != -EEXIST)
    return err;

    + /*
    + * Tell the Linux infrastructure that the interrupt is
    + * controlled by our level-based lguest interrupt controller.
    + */
    irq_set_chip_and_handler_name(irq, &lguest_irq_controller,
    handle_level_irq, "level");
    +
    + /* Some systems map "vectors" to interrupts weirdly. Not us! */
    + __this_cpu_write(vector_irq[FIRST_EXTERNAL_VECTOR + irq], irq);
    return 0;
    }

    static int lguest_enable_irq(struct pci_dev *dev)
    {
    + int err;
    u8 line = 0;

    /* We literally use the PCI interrupt line as the irq number. */
    pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &line);
    - irq_set_chip_and_handler_name(line, &lguest_irq_controller,
    - handle_level_irq, "level");
    - dev->irq = line;
    - return 0;
    + err = lguest_setup_irq(line);
    + if (!err)
    + dev->irq = line;
    + return err;
    }

    /* We don't do hotplug PCI, so this shouldn't be called. */
    @@ -875,17 +883,13 @@ static void lguest_disable_irq(struct pci_dev *dev)

    /*
    * This sets up the Interrupt Descriptor Table (IDT) entry for each hardware
    - * interrupt (except 128, which is used for system calls), and then tells the
    - * Linux infrastructure that each interrupt is controlled by our level-based
    - * lguest interrupt controller.
    + * interrupt (except 128, which is used for system calls).
    */
    static void __init lguest_init_IRQ(void)
    {
    unsigned int i;

    for (i = FIRST_EXTERNAL_VECTOR; i < FIRST_SYSTEM_VECTOR; i++) {
    - /* Some systems map "vectors" to interrupts weirdly. Not us! */
    - __this_cpu_write(vector_irq[i], i - FIRST_EXTERNAL_VECTOR);
    if (i != IA32_SYSCALL_VECTOR)
    set_intr_gate(i, irq_entries_start +
    8 * (i - FIRST_EXTERNAL_VECTOR));

    \
     
     \ /
      Last update: 2015-08-06 00:41    [W:2.550 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site