ehca: interrupt handling routines
PATCH 6/16 ehca: interrupt handling routines
Signed-off-by Heiko J Schick <[email protected]>
drivers/infiniband/hw/ehca/ehca_irq.c | 710 ++++++++++++++++++++++++++++++++++ drivers/infiniband/hw/ehca/ehca_irq.h | 77 +++ 2 files changed, 787 insertions(+)
drivers/infiniband/hw/ehca/ehca_irq.h +77 -0
@@ -0,0 +1,77 @@ +/* +* IBM eServer eHCA Infiniband device driver for Linux on POWER +* +* Function definitions and structs for EQs, NEQs and interrupts +* +* Authors: Heiko J Schick <[email protected]> +* Khadija Souissi <[email protected]> +* +* Copyright (c) 2005 IBM Corporation +* +* All rights reserved. +* +* This source code is distributed under a dual license of GPL v2.0 and OpenIB +* BSD. +* +* OpenIB BSD License +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials +* provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __EHCA_IRQ_H +#define __EHCA_IRQ_H + + +struct ehca_shca ; + +#include <linux/interrupt.h> +#include <linux/types.h> +#include <asm/atomic.h> + +int ehca_error_data (struct ehca_shca *shca,void *data,u64 resource); + +irqreturn_t ehca_interrupt_neq (int irq,void *dev_id,struct pt_regs *regs); +void ehca_tasklet_neq (unsigned long data); + +irqreturn_t ehca_interrupt_eq (int irq,void *dev_id,struct pt_regs *regs); +void ehca_tasklet_eq (unsigned long data); + +struct ehca_cpu_comp_task { +wait_queue_head_t wait_queue; +struct list_head cq_list; +struct task_struct *task; +spinlock_t task_lock; +}; + +struct ehca_comp_pool { +struct ehca_cpu_comp_task *cpu_comp_tasks; +int last_cpu; +spinlock_t last_cpu_lock; +}; + +struct ehca_comp_pool *ehca_create_comp_pool (void ); +void ehca_destroy_comp_pool (struct ehca_comp_pool *pool); +void ehca_queue_comp_task (struct ehca_comp_pool *pool,struct ehca_cq *__cq); + +#endif
drivers/infiniband/hw/ehca/ehca_irq.c +710 -0
710 lines not on this page · raw message
drivers/infiniband/hw/ehca/ehca_irq.c line 689
Quoted 7 lines
drivers/infiniband/hw/ehca/ehca_irq.c +7
-0+for_each_online_cpu (cpu) { + task =create_comp_task (pool, cpu); +if (task) { +kthread_bind (task, cpu); +wake_up_process (task); + } + }
How does this creation of a thread pool work with respect to CPU hotplug? What happens if a CPU goes away? How about if only one CPU is running when the driver is loaded, and then 15 more are hot-added?
drivers/infiniband/hw/ehca/ehca_irq.c line 705
Quoted 4 lines
drivers/infiniband/hw/ehca/ehca_irq.c +4
-0+for (i =0 ; i <NR_CPUS ; i++) { +if (cpu_online (i)) +destroy_comp_task (pool, i); + }
And it seems in the destroy function, you will possibly leak threads or try to kill a non-existent thread if the set of online CPUs has changed since the driver started...
- R.