lkml.org 
[lkml]   [2008]   [Sep]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC 4/4] switch non-standard SYSCALL_VECTOR allocation to use vector_irq[]
    Replace the current use of used_vectors[] for the allocation of a non-standard
    SYSCALL_VECTOR by also using the per_cpu variable vector_irq[].

    Signed-off-by: Dean Nelson <dcn@sgi.com>

    ---

    arch/x86/kernel/traps_32.c | 17 +++++++++++------
    drivers/lguest/interrupts_and_traps.c | 28 ++++++++++++++++++++++------
    include/asm-x86/irq.h | 3 ---
    3 files changed, 33 insertions(+), 15 deletions(-)

    Index: linux/arch/x86/kernel/traps_32.c
    ===================================================================
    --- linux.orig/arch/x86/kernel/traps_32.c 2008-09-10 14:25:23.000000000 -0500
    +++ linux/arch/x86/kernel/traps_32.c 2008-09-10 14:25:28.000000000 -0500
    @@ -63,9 +63,6 @@

    #include "mach_traps.h"

    -DECLARE_BITMAP(used_vectors, NR_VECTORS);
    -EXPORT_SYMBOL_GPL(used_vectors);
    -
    asmlinkage int system_call(void);

    /* Do we ignore FPU interrupts ? */
    @@ -1189,6 +1186,8 @@ asmlinkage void math_emulate(long arg)
    void __init trap_init(void)
    {
    int i;
    + bool ret;
    + unsigned long flags;

    #ifdef CONFIG_EISA
    void __iomem *p = early_ioremap(0x0FFFD9, 4);
    @@ -1236,10 +1235,16 @@ void __init trap_init(void)
    set_system_gate(SYSCALL_VECTOR, &system_call);

    /* Reserve all the builtin and the syscall vector: */
    - for (i = 0; i < FIRST_EXTERNAL_VECTOR; i++)
    - set_bit(i, used_vectors);
    + spin_lock_irqsave(&vector_lock, flags);
    + for (i = 0; i < FIRST_EXTERNAL_VECTOR; i++) {
    + ret =__grab_irq_vector(NON_IRQ_DESC, i, &cpu_possible_map);
    + BUG_ON(ret == false);
    + }

    - set_bit(SYSCALL_VECTOR, used_vectors);
    + ret = __grab_irq_vector(NON_IRQ_DESC, SYSCALL_VECTOR,
    + &cpu_possible_map);
    + BUG_ON(ret == false);
    + spin_unlock_irqrestore(&vector_lock, flags);

    /*
    * Should be a barrier for any external CPU state:
    Index: linux/include/asm-x86/irq.h
    ===================================================================
    --- linux.orig/include/asm-x86/irq.h 2008-09-10 14:25:23.000000000 -0500
    +++ linux/include/asm-x86/irq.h 2008-09-10 14:25:28.000000000 -0500
    @@ -44,9 +44,6 @@ extern unsigned int do_IRQ(struct pt_reg
    extern void init_IRQ(void);
    extern void native_init_IRQ(void);

    -/* Interrupt vector management */
    -extern DECLARE_BITMAP(used_vectors, NR_VECTORS);
    -
    extern spinlock_t vector_lock;

    #endif /* ASM_X86__IRQ_H */
    Index: linux/drivers/lguest/interrupts_and_traps.c
    ===================================================================
    --- linux.orig/drivers/lguest/interrupts_and_traps.c 2008-09-10 14:25:23.000000000 -0500
    +++ linux/drivers/lguest/interrupts_and_traps.c 2008-09-10 14:25:28.000000000 -0500
    @@ -221,19 +221,35 @@ bool check_syscall_vector(struct lguest

    int init_interrupts(void)
    {
    + unsigned long flags;
    + bool ret;
    +
    /* If they want some strange system call vector, reserve it now */
    - if (syscall_vector != SYSCALL_VECTOR
    - && test_and_set_bit(syscall_vector, used_vectors)) {
    - printk("lg: couldn't reserve syscall %u\n", syscall_vector);
    - return -EBUSY;
    + if (syscall_vector != SYSCALL_VECTOR) {
    + spin_lock_irqsave(&vector_lock, flags);
    + ret = __grab_irq_vector(NON_IRQ_DESC, syscall_vector,
    + &cpu_possible_map);
    + spin_unlock_irqrestore(&vector_lock, flags);
    + if (ret == false) {
    + printk("lg: couldn't reserve syscall %u\n",
    + syscall_vector);
    + return -EBUSY;
    + }
    }
    return 0;
    }

    void free_interrupts(void)
    {
    - if (syscall_vector != SYSCALL_VECTOR)
    - clear_bit(syscall_vector, used_vectors);
    + int cpu;
    +
    + if (syscall_vector != SYSCALL_VECTOR) {
    + for_each_cpu_mask_nr(cpu, cpu_possible_map) {
    + BUG_ON(per_cpu(vector_irq, cpu)[syscall_vector] !=
    + NON_IRQ_DESC);
    + per_cpu(vector_irq, cpu)[syscall_vector] = NULL;
    + }
    + }
    }

    /*H:220 Now we've got the routines to deliver interrupts, delivering traps like

    \
     
     \ /
      Last update: 2008-09-11 17:33    [W:4.138 / U:0.880 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site