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