Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | Date | Mon, 25 Dec 2006 17:13:47 +0900 | From | Akinobu Mita <> | Subject | [PATCH -mm] return error on create_comp_task() failure |
| |
On Thu, Dec 21, 2006 at 10:22:02PM +0100, Heiko Carstens wrote: > > @@ -730,7 +732,7 @@ int ehca_create_comp_pool(void) > > > > for_each_online_cpu(cpu) { > > task = create_comp_task(pool, cpu); > > - if (task) { > > + if (!IS_ERR(task)) { > > kthread_bind(task, cpu); > > wake_up_process(task); > > } > > So you silently ignore errors and the module loads anyway?
Subject: [PATCH -mm] return error on create_comp_task() failure
This patch frees allocated data and returns error to avoid module loading if create_comp_task() failed.
Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Hoang-Nam Nguyen <hnguyen@de.ibm.com> Cc: Christoph Raisch <raisch@de.ibm.com> Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
--- drivers/infiniband/hw/ehca/ehca_irq.c | 37 ++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-)
Index: 2.6-mm/drivers/infiniband/hw/ehca/ehca_irq.c =================================================================== --- 2.6-mm.orig/drivers/infiniband/hw/ehca/ehca_irq.c +++ 2.6-mm/drivers/infiniband/hw/ehca/ehca_irq.c @@ -716,11 +716,12 @@ static int comp_pool_callback(struct not #endif +#ifdef CONFIG_INFINIBAND_EHCA_SCALING + int ehca_create_comp_pool(void) { -#ifdef CONFIG_INFINIBAND_EHCA_SCALING int cpu; - struct task_struct *task; + int err; pool = kzalloc(sizeof(struct ehca_comp_pool), GFP_KERNEL); if (pool == NULL) @@ -736,21 +737,41 @@ int ehca_create_comp_pool(void) } for_each_online_cpu(cpu) { - task = create_comp_task(pool, cpu); - if (!IS_ERR(task)) { - kthread_bind(task, cpu); - wake_up_process(task); + struct task_struct *task = create_comp_task(pool, cpu); + + if (IS_ERR(task)) { + err = PTR_ERR(task); + goto err_comp_task; } + kthread_bind(task, cpu); + wake_up_process(task); } comp_pool_callback_nb.notifier_call = comp_pool_callback; - comp_pool_callback_nb.priority =0; + comp_pool_callback_nb.priority = 0; register_cpu_notifier(&comp_pool_callback_nb); -#endif return 0; + +err_comp_task: + for_each_online_cpu(cpu) + destroy_comp_task(pool, cpu); + + free_percpu(pool->cpu_comp_tasks); + kfree(pool); + + return err; +} + +#else + +int ehca_create_comp_pool(void) +{ + return 0; } +#endif + void ehca_destroy_comp_pool(void) { #ifdef CONFIG_INFINIBAND_EHCA_SCALING - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| ![\](/images/icornerr.gif) |