hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/virt/lib/irqbypass.c
....@@ -1,12 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * IRQ offload/bypass manager
34 *
45 * Copyright (C) 2015 Red Hat, Inc.
56 * Copyright (c) 2015 Linaro Ltd.
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License version 2 as
9
- * published by the Free Software Foundation.
107 *
118 * Various virtualization hardware acceleration techniques allow bypassing or
129 * offloading interrupts received from devices around the host kernel. Posted
....@@ -88,6 +85,7 @@
8885 {
8986 struct irq_bypass_producer *tmp;
9087 struct irq_bypass_consumer *consumer;
88
+ int ret;
9189
9290 if (!producer->token)
9391 return -EINVAL;
....@@ -101,20 +99,16 @@
10199
102100 list_for_each_entry(tmp, &producers, node) {
103101 if (tmp->token == producer->token) {
104
- mutex_unlock(&lock);
105
- module_put(THIS_MODULE);
106
- return -EBUSY;
102
+ ret = -EBUSY;
103
+ goto out_err;
107104 }
108105 }
109106
110107 list_for_each_entry(consumer, &consumers, node) {
111108 if (consumer->token == producer->token) {
112
- int ret = __connect(producer, consumer);
113
- if (ret) {
114
- mutex_unlock(&lock);
115
- module_put(THIS_MODULE);
116
- return ret;
117
- }
109
+ ret = __connect(producer, consumer);
110
+ if (ret)
111
+ goto out_err;
118112 break;
119113 }
120114 }
....@@ -124,6 +118,10 @@
124118 mutex_unlock(&lock);
125119
126120 return 0;
121
+out_err:
122
+ mutex_unlock(&lock);
123
+ module_put(THIS_MODULE);
124
+ return ret;
127125 }
128126 EXPORT_SYMBOL_GPL(irq_bypass_register_producer);
129127
....@@ -182,6 +180,7 @@
182180 {
183181 struct irq_bypass_consumer *tmp;
184182 struct irq_bypass_producer *producer;
183
+ int ret;
185184
186185 if (!consumer->token ||
187186 !consumer->add_producer || !consumer->del_producer)
....@@ -196,20 +195,16 @@
196195
197196 list_for_each_entry(tmp, &consumers, node) {
198197 if (tmp->token == consumer->token || tmp == consumer) {
199
- mutex_unlock(&lock);
200
- module_put(THIS_MODULE);
201
- return -EBUSY;
198
+ ret = -EBUSY;
199
+ goto out_err;
202200 }
203201 }
204202
205203 list_for_each_entry(producer, &producers, node) {
206204 if (producer->token == consumer->token) {
207
- int ret = __connect(producer, consumer);
208
- if (ret) {
209
- mutex_unlock(&lock);
210
- module_put(THIS_MODULE);
211
- return ret;
212
- }
205
+ ret = __connect(producer, consumer);
206
+ if (ret)
207
+ goto out_err;
213208 break;
214209 }
215210 }
....@@ -219,6 +214,10 @@
219214 mutex_unlock(&lock);
220215
221216 return 0;
217
+out_err:
218
+ mutex_unlock(&lock);
219
+ module_put(THIS_MODULE);
220
+ return ret;
222221 }
223222 EXPORT_SYMBOL_GPL(irq_bypass_register_consumer);
224223