Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

irqbypass: Use paired consumer/producer to disconnect during unregister

Use the paired consumer/producer information to disconnect IRQ bypass
producers/consumers in O(1) time (ignoring the cost of __disconnect()).

Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Alex Williamson <alex.williamson@redhat.com>
Link: https://lore.kernel.org/r/20250516230734.2564775-6-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>

+8 -40
+8 -40
virt/lib/irqbypass.c
··· 138 138 */ 139 139 void irq_bypass_unregister_producer(struct irq_bypass_producer *producer) 140 140 { 141 - struct irq_bypass_producer *tmp; 142 - struct irq_bypass_consumer *consumer; 143 - 144 141 if (!producer->eventfd) 145 142 return; 146 143 147 144 mutex_lock(&lock); 148 145 149 - list_for_each_entry(tmp, &producers, node) { 150 - if (tmp->eventfd != producer->eventfd) 151 - continue; 146 + if (producer->consumer) 147 + __disconnect(producer, producer->consumer); 152 148 153 - list_for_each_entry(consumer, &consumers, node) { 154 - if (consumer->eventfd == producer->eventfd) { 155 - WARN_ON_ONCE(producer->consumer != consumer); 156 - __disconnect(producer, consumer); 157 - break; 158 - } 159 - } 160 - 161 - producer->eventfd = NULL; 162 - list_del(&producer->node); 163 - break; 164 - } 165 - 166 - WARN_ON_ONCE(producer->eventfd); 149 + producer->eventfd = NULL; 150 + list_del(&producer->node); 167 151 mutex_unlock(&lock); 168 152 } 169 153 EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); ··· 212 228 */ 213 229 void irq_bypass_unregister_consumer(struct irq_bypass_consumer *consumer) 214 230 { 215 - struct irq_bypass_consumer *tmp; 216 - struct irq_bypass_producer *producer; 217 - 218 231 if (!consumer->eventfd) 219 232 return; 220 233 221 234 mutex_lock(&lock); 222 235 223 - list_for_each_entry(tmp, &consumers, node) { 224 - if (tmp != consumer) 225 - continue; 236 + if (consumer->producer) 237 + __disconnect(consumer->producer, consumer); 226 238 227 - list_for_each_entry(producer, &producers, node) { 228 - if (producer->eventfd == consumer->eventfd) { 229 - WARN_ON_ONCE(consumer->producer != producer); 230 - __disconnect(producer, consumer); 231 - break; 232 - } 233 - } 234 - 235 - consumer->eventfd = NULL; 236 - list_del(&consumer->node); 237 - break; 238 - } 239 - 240 - WARN_ON_ONCE(consumer->eventfd); 239 + consumer->eventfd = NULL; 240 + list_del(&consumer->node); 241 241 mutex_unlock(&lock); 242 242 } 243 243 EXPORT_SYMBOL_GPL(irq_bypass_unregister_consumer);