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

KVM: Move irq routing setup to irqchip.c

Setting up IRQ routes is nothing IOAPIC specific. Extract everything
that really is generic code into irqchip.c and only leave the ioapic
specific bits to irq_comm.c.

Signed-off-by: Alexander Graf <agraf@suse.de>
Acked-by: Michael S. Tsirkin <mst@redhat.com>

+91 -73
+3
include/linux/kvm_host.h
··· 961 961 const struct kvm_irq_routing_entry *entries, 962 962 unsigned nr, 963 963 unsigned flags); 964 + int kvm_set_routing_entry(struct kvm_irq_routing_table *rt, 965 + struct kvm_kernel_irq_routing_entry *e, 966 + const struct kvm_irq_routing_entry *ue); 964 967 void kvm_free_irq_routing(struct kvm *kvm); 965 968 966 969 int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi);
+3 -73
virt/kvm/irq_comm.c
··· 271 271 rcu_read_unlock(); 272 272 } 273 273 274 - static int setup_routing_entry(struct kvm_irq_routing_table *rt, 275 - struct kvm_kernel_irq_routing_entry *e, 276 - const struct kvm_irq_routing_entry *ue) 274 + int kvm_set_routing_entry(struct kvm_irq_routing_table *rt, 275 + struct kvm_kernel_irq_routing_entry *e, 276 + const struct kvm_irq_routing_entry *ue) 277 277 { 278 278 int r = -EINVAL; 279 279 int delta; 280 280 unsigned max_pin; 281 - struct kvm_kernel_irq_routing_entry *ei; 282 281 283 - /* 284 - * Do not allow GSI to be mapped to the same irqchip more than once. 285 - * Allow only one to one mapping between GSI and MSI. 286 - */ 287 - hlist_for_each_entry(ei, &rt->map[ue->gsi], link) 288 - if (ei->type == KVM_IRQ_ROUTING_MSI || 289 - ue->type == KVM_IRQ_ROUTING_MSI || 290 - ue->u.irqchip.irqchip == ei->irqchip.irqchip) 291 - return r; 292 - 293 - e->gsi = ue->gsi; 294 - e->type = ue->type; 295 282 switch (ue->type) { 296 283 case KVM_IRQ_ROUTING_IRQCHIP: 297 284 delta = 0; ··· 315 328 goto out; 316 329 } 317 330 318 - hlist_add_head(&e->link, &rt->map[e->gsi]); 319 331 r = 0; 320 332 out: 321 - return r; 322 - } 323 - 324 - int kvm_set_irq_routing(struct kvm *kvm, 325 - const struct kvm_irq_routing_entry *ue, 326 - unsigned nr, 327 - unsigned flags) 328 - { 329 - struct kvm_irq_routing_table *new, *old; 330 - u32 i, j, nr_rt_entries = 0; 331 - int r; 332 - 333 - for (i = 0; i < nr; ++i) { 334 - if (ue[i].gsi >= KVM_MAX_IRQ_ROUTES) 335 - return -EINVAL; 336 - nr_rt_entries = max(nr_rt_entries, ue[i].gsi); 337 - } 338 - 339 - nr_rt_entries += 1; 340 - 341 - new = kzalloc(sizeof(*new) + (nr_rt_entries * sizeof(struct hlist_head)) 342 - + (nr * sizeof(struct kvm_kernel_irq_routing_entry)), 343 - GFP_KERNEL); 344 - 345 - if (!new) 346 - return -ENOMEM; 347 - 348 - new->rt_entries = (void *)&new->map[nr_rt_entries]; 349 - 350 - new->nr_rt_entries = nr_rt_entries; 351 - for (i = 0; i < 3; i++) 352 - for (j = 0; j < KVM_IRQCHIP_NUM_PINS; j++) 353 - new->chip[i][j] = -1; 354 - 355 - for (i = 0; i < nr; ++i) { 356 - r = -EINVAL; 357 - if (ue->flags) 358 - goto out; 359 - r = setup_routing_entry(new, &new->rt_entries[i], ue); 360 - if (r) 361 - goto out; 362 - ++ue; 363 - } 364 - 365 - mutex_lock(&kvm->irq_lock); 366 - old = kvm->irq_routing; 367 - kvm_irq_routing_update(kvm, new); 368 - mutex_unlock(&kvm->irq_lock); 369 - 370 - synchronize_rcu(); 371 - 372 - new = old; 373 - r = 0; 374 - 375 - out: 376 - kfree(new); 377 333 return r; 378 334 } 379 335
+85
virt/kvm/irqchip.c
··· 150 150 at this stage */ 151 151 kfree(kvm->irq_routing); 152 152 } 153 + 154 + static int setup_routing_entry(struct kvm_irq_routing_table *rt, 155 + struct kvm_kernel_irq_routing_entry *e, 156 + const struct kvm_irq_routing_entry *ue) 157 + { 158 + int r = -EINVAL; 159 + struct kvm_kernel_irq_routing_entry *ei; 160 + 161 + /* 162 + * Do not allow GSI to be mapped to the same irqchip more than once. 163 + * Allow only one to one mapping between GSI and MSI. 164 + */ 165 + hlist_for_each_entry(ei, &rt->map[ue->gsi], link) 166 + if (ei->type == KVM_IRQ_ROUTING_MSI || 167 + ue->type == KVM_IRQ_ROUTING_MSI || 168 + ue->u.irqchip.irqchip == ei->irqchip.irqchip) 169 + return r; 170 + 171 + e->gsi = ue->gsi; 172 + e->type = ue->type; 173 + r = kvm_set_routing_entry(rt, e, ue); 174 + if (r) 175 + goto out; 176 + 177 + hlist_add_head(&e->link, &rt->map[e->gsi]); 178 + r = 0; 179 + out: 180 + return r; 181 + } 182 + 183 + int kvm_set_irq_routing(struct kvm *kvm, 184 + const struct kvm_irq_routing_entry *ue, 185 + unsigned nr, 186 + unsigned flags) 187 + { 188 + struct kvm_irq_routing_table *new, *old; 189 + u32 i, j, nr_rt_entries = 0; 190 + int r; 191 + 192 + for (i = 0; i < nr; ++i) { 193 + if (ue[i].gsi >= KVM_MAX_IRQ_ROUTES) 194 + return -EINVAL; 195 + nr_rt_entries = max(nr_rt_entries, ue[i].gsi); 196 + } 197 + 198 + nr_rt_entries += 1; 199 + 200 + new = kzalloc(sizeof(*new) + (nr_rt_entries * sizeof(struct hlist_head)) 201 + + (nr * sizeof(struct kvm_kernel_irq_routing_entry)), 202 + GFP_KERNEL); 203 + 204 + if (!new) 205 + return -ENOMEM; 206 + 207 + new->rt_entries = (void *)&new->map[nr_rt_entries]; 208 + 209 + new->nr_rt_entries = nr_rt_entries; 210 + for (i = 0; i < KVM_NR_IRQCHIPS; i++) 211 + for (j = 0; j < KVM_IRQCHIP_NUM_PINS; j++) 212 + new->chip[i][j] = -1; 213 + 214 + for (i = 0; i < nr; ++i) { 215 + r = -EINVAL; 216 + if (ue->flags) 217 + goto out; 218 + r = setup_routing_entry(new, &new->rt_entries[i], ue); 219 + if (r) 220 + goto out; 221 + ++ue; 222 + } 223 + 224 + mutex_lock(&kvm->irq_lock); 225 + old = kvm->irq_routing; 226 + kvm_irq_routing_update(kvm, new); 227 + mutex_unlock(&kvm->irq_lock); 228 + 229 + synchronize_rcu(); 230 + 231 + new = old; 232 + r = 0; 233 + 234 + out: 235 + kfree(new); 236 + return r; 237 + }