From 102a0743326a03cd1a1202ceda21e175b7d3575c Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Tue, 20 Feb 2024 01:20:52 +0000 Subject: [PATCH] add new system file --- kernel/virt/lib/irqbypass.c | 43 +++++++++++++++++++++---------------------- 1 files changed, 21 insertions(+), 22 deletions(-) diff --git a/kernel/virt/lib/irqbypass.c b/kernel/virt/lib/irqbypass.c index 6d2fcd6..28fda42 100644 --- a/kernel/virt/lib/irqbypass.c +++ b/kernel/virt/lib/irqbypass.c @@ -1,12 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0-only /* * IRQ offload/bypass manager * * Copyright (C) 2015 Red Hat, Inc. * Copyright (c) 2015 Linaro Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. * * Various virtualization hardware acceleration techniques allow bypassing or * offloading interrupts received from devices around the host kernel. Posted @@ -88,6 +85,7 @@ { struct irq_bypass_producer *tmp; struct irq_bypass_consumer *consumer; + int ret; if (!producer->token) return -EINVAL; @@ -101,20 +99,16 @@ list_for_each_entry(tmp, &producers, node) { if (tmp->token == producer->token) { - mutex_unlock(&lock); - module_put(THIS_MODULE); - return -EBUSY; + ret = -EBUSY; + goto out_err; } } list_for_each_entry(consumer, &consumers, node) { if (consumer->token == producer->token) { - int ret = __connect(producer, consumer); - if (ret) { - mutex_unlock(&lock); - module_put(THIS_MODULE); - return ret; - } + ret = __connect(producer, consumer); + if (ret) + goto out_err; break; } } @@ -124,6 +118,10 @@ mutex_unlock(&lock); return 0; +out_err: + mutex_unlock(&lock); + module_put(THIS_MODULE); + return ret; } EXPORT_SYMBOL_GPL(irq_bypass_register_producer); @@ -182,6 +180,7 @@ { struct irq_bypass_consumer *tmp; struct irq_bypass_producer *producer; + int ret; if (!consumer->token || !consumer->add_producer || !consumer->del_producer) @@ -196,20 +195,16 @@ list_for_each_entry(tmp, &consumers, node) { if (tmp->token == consumer->token || tmp == consumer) { - mutex_unlock(&lock); - module_put(THIS_MODULE); - return -EBUSY; + ret = -EBUSY; + goto out_err; } } list_for_each_entry(producer, &producers, node) { if (producer->token == consumer->token) { - int ret = __connect(producer, consumer); - if (ret) { - mutex_unlock(&lock); - module_put(THIS_MODULE); - return ret; - } + ret = __connect(producer, consumer); + if (ret) + goto out_err; break; } } @@ -219,6 +214,10 @@ mutex_unlock(&lock); return 0; +out_err: + mutex_unlock(&lock); + module_put(THIS_MODULE); + return ret; } EXPORT_SYMBOL_GPL(irq_bypass_register_consumer); -- Gitblit v1.6.2