@samitouri / QOSamiQemu / commits / 553d4a0174

accel/mshv: update s->irq_routes in update_msi_route

The state's irq_routes field will be updated when an irqchip's gsi is requested to be updated with a new dest/vector. The old set_msi_routing() fn is redundant and can be removed. Signed-off-by: Magnus Kulke <magnuskulke@linux.microsoft.com> Link: https://lore.kernel.org/r/20260417105618.3621-10-magnuskulke@linux.microsoft.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Magnus Kulke committed Apr 17, 2026 at 12:55 UTC 553d4a0174b0b2230df4f378ec7b9616dc037e58
1 file changed +38 -49
accel/mshv/irq.c
+38 -49
@@ -36,52 +36,6 @@ void mshv_init_msicontrol(void)
36 msi_control->updated = false;
37 }
38
39 -static int set_msi_routing(uint32_t gsi, uint64_t addr, uint32_t data)
40 -{
41 - struct mshv_user_irq_entry *entry;
42 - uint32_t high_addr = addr >> 32;
43 - uint32_t low_addr = addr & 0xFFFFFFFF;
44 - GHashTable *gsi_routes;
45 -
46 - trace_mshv_set_msi_routing(gsi, addr, data);
47 -
48 - if (gsi >= MSHV_MAX_MSI_ROUTES) {
49 - error_report("gsi >= MSHV_MAX_MSI_ROUTES");
50 - return -1;
51 - }
52 -
53 - assert(msi_control);
54 -
55 - WITH_QEMU_LOCK_GUARD(&msi_control_mutex) {
56 - gsi_routes = msi_control->gsi_routes;
57 - entry = g_hash_table_lookup(gsi_routes, GINT_TO_POINTER(gsi));
58 -
59 - if (entry
60 - && entry->address_hi == high_addr
61 - && entry->address_lo == low_addr
62 - && entry->data == data)
63 - {
64 - /* nothing to update */
65 - return 0;
66 - }
67 -
68 - /* free old entry */
69 - g_free(entry);
70 -
71 - /* create new entry */
72 - entry = g_new0(struct mshv_user_irq_entry, 1);
73 - entry->gsi = gsi;
74 - entry->address_hi = high_addr;
75 - entry->address_lo = low_addr;
76 - entry->data = data;
77 -
78 - g_hash_table_insert(gsi_routes, GINT_TO_POINTER(gsi), entry);
79 - msi_control->updated = true;
80 - }
81 -
82 - return 0;
83 -}
84 -
39 static int add_msi_routing(uint64_t addr, uint32_t data)
40 {
41 struct mshv_user_irq_entry *route_entry;
@@ -370,16 +324,51 @@ void mshv_irqchip_release_virq(int virq)
324 remove_msi_routing(virq);
325 }
326
327 +static int update_routing_entry(MshvState *s,
328 + struct mshv_user_irq_entry *new_entry)
329 +{
330 + struct mshv_user_irq_entry *entry;
331 + int n;
332 +
333 + for (n = 0; n < s->irq_routes->nr; n++) {
334 + entry = &s->irq_routes->entries[n];
335 + if (entry->gsi != new_entry->gsi) {
336 + continue;
337 + }
338 +
339 + if (!memcmp(entry, new_entry, sizeof *entry)) {
340 + return 0;
341 + }
342 +
343 + *entry = *new_entry;
344 +
345 + return 0;
346 + }
347 +
348 + return -ESRCH;
349 +}
350 +
351 int mshv_irqchip_update_msi_route(int virq, MSIMessage msg, PCIDevice *dev)
352 {
353 + uint32_t addr_hi = msg.address >> 32;
354 + uint32_t addr_lo = msg.address & 0xFFFFFFFF;
355 + uint32_t data = le32_to_cpu(msg.data);
356 + struct mshv_user_irq_entry entry = {
357 + .gsi = virq,
358 + .address_hi = addr_hi,
359 + .address_lo = addr_lo,
360 + .data = data,
361 + };
362 int ret;
363
377 - ret = set_msi_routing(virq, msg.address, le32_to_cpu(msg.data));
364 + ret = update_routing_entry(mshv_state, &entry);
365 if (ret < 0) {
379 - error_report("Failed to set msi routing");
380 - return -1;
366 + error_report("Failed to set msi routing for gsi %d", virq);
367 + abort();
368 }
369
370 + trace_mshv_set_msi_routing(virq, msg.address, data);
371 +
372 return 0;
373 }
374