Message ID | 1439215368-41167-1-git-send-email-jfrei@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
On 10/08/2015 16:02, Jens Freimann wrote: > When we add new adapter routes we call kvm_irqchip_add_route() for every > virtqueue and in the same step also do the KVM_SET_GSI_ROUTING ioctl. > > This is unnecessary costly as the interface allows us to set multiple > routes in one go. Let's first add all routes to the table stored in the > global kvm_state and then do the ioctl to commit the routes to the > in-kernel irqchip. > > This saves us several ioctls to the kernel where for each call a list > is reallocated and populated. Acked-by: Paolo Bonzini <pbonzini@redhat.com> but we should do the same for kvm_irqchip_add_msi_route as well. I'll prepare a patch. Paolo > Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com> > Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com> > --- > hw/intc/s390_flic_kvm.c | 2 ++ > kvm-all.c | 1 - > 2 files changed, 2 insertions(+), 1 deletion(-) > > diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c > index b471e7a..48714f9 100644 > --- a/hw/intc/s390_flic_kvm.c > +++ b/hw/intc/s390_flic_kvm.c > @@ -228,6 +228,8 @@ static int kvm_s390_add_adapter_routes(S390FLICState *fs, > routes->gsi[i] = ret; > routes->adapter.ind_offset++; > } > + kvm_irqchip_commit_routes(kvm_state); > + > /* Restore passed-in structure to original state. */ > routes->adapter.ind_offset = ind_offset; > return 0; > diff --git a/kvm-all.c b/kvm-all.c > index 06e06f2..c6f5128 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -1293,7 +1293,6 @@ int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter) > kroute.u.adapter.adapter_id = adapter->adapter_id; > > kvm_add_routing_entry(s, &kroute); > - kvm_irqchip_commit_routes(s); > > return virq; > } > -- 2.3.8
diff --git a/hw/intc/s390_flic_kvm.c b/hw/intc/s390_flic_kvm.c index b471e7a..48714f9 100644 --- a/hw/intc/s390_flic_kvm.c +++ b/hw/intc/s390_flic_kvm.c @@ -228,6 +228,8 @@ static int kvm_s390_add_adapter_routes(S390FLICState *fs, routes->gsi[i] = ret; routes->adapter.ind_offset++; } + kvm_irqchip_commit_routes(kvm_state); + /* Restore passed-in structure to original state. */ routes->adapter.ind_offset = ind_offset; return 0; diff --git a/kvm-all.c b/kvm-all.c index 06e06f2..c6f5128 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1293,7 +1293,6 @@ int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter) kroute.u.adapter.adapter_id = adapter->adapter_id; kvm_add_routing_entry(s, &kroute); - kvm_irqchip_commit_routes(s); return virq; }