* [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input @ 2013-06-04 11:52 Michael S. Tsirkin 2013-06-04 11:52 ` [Qemu-devel] [PATCH 2/2] kvm: skip system call when msi route is unchanged Michael S. Tsirkin ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Michael S. Tsirkin @ 2013-06-04 11:52 UTC (permalink / raw) To: qemu-devel; +Cc: Marcelo Tosatti, kvm, Gleb Natapov kvm_add_routing_entry makes an attempt to zero-initialize any new routing entry. However, it fails to initialize padding within the u field of the structure kvm_irq_routing_entry. Other functions like kvm_irqchip_update_msi_route also fail to initialize the padding field in kvm_irq_routing_entry. While mostly harmless, this would prevent us from reusing these fields for something useful in the future. It's better to just make sure all input is initialized. Once it is, we can also drop complex field by field assignment and just do the simple *a = *b to update a route entry. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- kvm-all.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 405480e..f119ce1 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1006,11 +1006,8 @@ static void kvm_add_routing_entry(KVMState *s, } n = s->irq_routes->nr++; new = &s->irq_routes->entries[n]; - memset(new, 0, sizeof(*new)); - new->gsi = entry->gsi; - new->type = entry->type; - new->flags = entry->flags; - new->u = entry->u; + + *new = *entry; set_gsi(s, entry->gsi); @@ -1029,9 +1026,7 @@ static int kvm_update_routing_entry(KVMState *s, continue; } - entry->type = new_entry->type; - entry->flags = new_entry->flags; - entry->u = new_entry->u; + *entry = *new_entry; kvm_irqchip_commit_routes(s); @@ -1043,7 +1038,7 @@ static int kvm_update_routing_entry(KVMState *s, void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin) { - struct kvm_irq_routing_entry e; + struct kvm_irq_routing_entry e = {}; assert(pin < s->gsi_count); @@ -1156,7 +1151,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) return virq; } - route = g_malloc(sizeof(KVMMSIRoute)); + route = g_malloc0(sizeof(KVMMSIRoute)); route->kroute.gsi = virq; route->kroute.type = KVM_IRQ_ROUTING_MSI; route->kroute.flags = 0; @@ -1177,7 +1172,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) { - struct kvm_irq_routing_entry kroute; + struct kvm_irq_routing_entry kroute = {}; int virq; if (!kvm_gsi_routing_enabled()) { @@ -1203,7 +1198,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg) { - struct kvm_irq_routing_entry kroute; + struct kvm_irq_routing_entry kroute = {}; if (!kvm_irqchip_in_kernel()) { return -ENOSYS; -- MST ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 2/2] kvm: skip system call when msi route is unchanged 2013-06-04 11:52 [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input Michael S. Tsirkin @ 2013-06-04 11:52 ` Michael S. Tsirkin 2013-06-05 13:00 ` [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input Gleb Natapov 2013-06-05 14:47 ` Gleb Natapov 2 siblings, 0 replies; 9+ messages in thread From: Michael S. Tsirkin @ 2013-06-04 11:52 UTC (permalink / raw) To: qemu-devel; +Cc: Marcelo Tosatti, kvm, Gleb Natapov Some guests do a large number of mask/unmask calls which currently trigger expensive route update system calls. Detect that route in unchanged and skip the system call. Reported-by: "Zhanghaoyu (A)" <haoyu.zhang@huawei.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- kvm-all.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kvm-all.c b/kvm-all.c index f119ce1..891722b 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1026,6 +1026,10 @@ static int kvm_update_routing_entry(KVMState *s, continue; } + if(!memcmp(entry, new_entry, sizeof *entry)) { + return 0; + } + *entry = *new_entry; kvm_irqchip_commit_routes(s); -- MST ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input 2013-06-04 11:52 [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input Michael S. Tsirkin 2013-06-04 11:52 ` [Qemu-devel] [PATCH 2/2] kvm: skip system call when msi route is unchanged Michael S. Tsirkin @ 2013-06-05 13:00 ` Gleb Natapov 2013-06-05 14:02 ` Michael S. Tsirkin 2013-06-05 14:47 ` Gleb Natapov 2 siblings, 1 reply; 9+ messages in thread From: Gleb Natapov @ 2013-06-05 13:00 UTC (permalink / raw) To: Michael S. Tsirkin; +Cc: Marcelo Tosatti, qemu-devel, kvm On Tue, Jun 04, 2013 at 02:52:32PM +0300, Michael S. Tsirkin wrote: > kvm_add_routing_entry makes an attempt to > zero-initialize any new routing entry. > However, it fails to initialize padding > within the u field of the structure > kvm_irq_routing_entry. > > Other functions like kvm_irqchip_update_msi_route > also fail to initialize the padding field in > kvm_irq_routing_entry. > > While mostly harmless, this would prevent us from > reusing these fields for something useful in > the future. > The fact that kernel does not check them for zero value is what will prevents us from doing so. > It's better to just make sure all input is initialized. > > Once it is, we can also drop complex field by field assignment and just > do the simple *a = *b to update a route entry. > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > --- > kvm-all.c | 19 +++++++------------ > 1 file changed, 7 insertions(+), 12 deletions(-) > > diff --git a/kvm-all.c b/kvm-all.c > index 405480e..f119ce1 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -1006,11 +1006,8 @@ static void kvm_add_routing_entry(KVMState *s, > } > n = s->irq_routes->nr++; > new = &s->irq_routes->entries[n]; > - memset(new, 0, sizeof(*new)); > - new->gsi = entry->gsi; > - new->type = entry->type; > - new->flags = entry->flags; > - new->u = entry->u; > + > + *new = *entry; > > set_gsi(s, entry->gsi); > > @@ -1029,9 +1026,7 @@ static int kvm_update_routing_entry(KVMState *s, > continue; > } > > - entry->type = new_entry->type; > - entry->flags = new_entry->flags; > - entry->u = new_entry->u; > + *entry = *new_entry; > > kvm_irqchip_commit_routes(s); > > @@ -1043,7 +1038,7 @@ static int kvm_update_routing_entry(KVMState *s, > > void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin) > { > - struct kvm_irq_routing_entry e; > + struct kvm_irq_routing_entry e = {}; > > assert(pin < s->gsi_count); > > @@ -1156,7 +1151,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > return virq; > } > > - route = g_malloc(sizeof(KVMMSIRoute)); > + route = g_malloc0(sizeof(KVMMSIRoute)); > route->kroute.gsi = virq; > route->kroute.type = KVM_IRQ_ROUTING_MSI; > route->kroute.flags = 0; > @@ -1177,7 +1172,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > { > - struct kvm_irq_routing_entry kroute; > + struct kvm_irq_routing_entry kroute = {}; > int virq; > > if (!kvm_gsi_routing_enabled()) { > @@ -1203,7 +1198,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg) > { > - struct kvm_irq_routing_entry kroute; > + struct kvm_irq_routing_entry kroute = {}; > > if (!kvm_irqchip_in_kernel()) { > return -ENOSYS; > -- > MST -- Gleb. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input 2013-06-05 13:00 ` [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input Gleb Natapov @ 2013-06-05 14:02 ` Michael S. Tsirkin 2013-06-05 14:04 ` Gleb Natapov 0 siblings, 1 reply; 9+ messages in thread From: Michael S. Tsirkin @ 2013-06-05 14:02 UTC (permalink / raw) To: Gleb Natapov; +Cc: Marcelo Tosatti, qemu-devel, kvm On Wed, Jun 05, 2013 at 04:00:20PM +0300, Gleb Natapov wrote: > On Tue, Jun 04, 2013 at 02:52:32PM +0300, Michael S. Tsirkin wrote: > > kvm_add_routing_entry makes an attempt to > > zero-initialize any new routing entry. > > However, it fails to initialize padding > > within the u field of the structure > > kvm_irq_routing_entry. > > > > Other functions like kvm_irqchip_update_msi_route > > also fail to initialize the padding field in > > kvm_irq_routing_entry. > > > > While mostly harmless, this would prevent us from > > reusing these fields for something useful in > > the future. > > > The fact that kernel does not check them for zero value is what will > prevents us from doing so. Well we can not change kernel now (it would break userspace) but we can start zeroing everything in userspace. Also, checkers like coverity might get confused by this. Finally, simpler assignment and comparison make it worth it, don't they? > > It's better to just make sure all input is initialized. > > > > Once it is, we can also drop complex field by field assignment and just > > do the simple *a = *b to update a route entry. > > > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > > --- > > kvm-all.c | 19 +++++++------------ > > 1 file changed, 7 insertions(+), 12 deletions(-) > > > > diff --git a/kvm-all.c b/kvm-all.c > > index 405480e..f119ce1 100644 > > --- a/kvm-all.c > > +++ b/kvm-all.c > > @@ -1006,11 +1006,8 @@ static void kvm_add_routing_entry(KVMState *s, > > } > > n = s->irq_routes->nr++; > > new = &s->irq_routes->entries[n]; > > - memset(new, 0, sizeof(*new)); > > - new->gsi = entry->gsi; > > - new->type = entry->type; > > - new->flags = entry->flags; > > - new->u = entry->u; > > + > > + *new = *entry; > > > > set_gsi(s, entry->gsi); > > > > @@ -1029,9 +1026,7 @@ static int kvm_update_routing_entry(KVMState *s, > > continue; > > } > > > > - entry->type = new_entry->type; > > - entry->flags = new_entry->flags; > > - entry->u = new_entry->u; > > + *entry = *new_entry; > > > > kvm_irqchip_commit_routes(s); > > > > @@ -1043,7 +1038,7 @@ static int kvm_update_routing_entry(KVMState *s, > > > > void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin) > > { > > - struct kvm_irq_routing_entry e; > > + struct kvm_irq_routing_entry e = {}; > > > > assert(pin < s->gsi_count); > > > > @@ -1156,7 +1151,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > return virq; > > } > > > > - route = g_malloc(sizeof(KVMMSIRoute)); > > + route = g_malloc0(sizeof(KVMMSIRoute)); > > route->kroute.gsi = virq; > > route->kroute.type = KVM_IRQ_ROUTING_MSI; > > route->kroute.flags = 0; > > @@ -1177,7 +1172,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > > > int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > { > > - struct kvm_irq_routing_entry kroute; > > + struct kvm_irq_routing_entry kroute = {}; > > int virq; > > > > if (!kvm_gsi_routing_enabled()) { > > @@ -1203,7 +1198,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > > > int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg) > > { > > - struct kvm_irq_routing_entry kroute; > > + struct kvm_irq_routing_entry kroute = {}; > > > > if (!kvm_irqchip_in_kernel()) { > > return -ENOSYS; > > -- > > MST > > -- > Gleb. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input 2013-06-05 14:02 ` Michael S. Tsirkin @ 2013-06-05 14:04 ` Gleb Natapov 2013-06-05 14:11 ` Michael S. Tsirkin 0 siblings, 1 reply; 9+ messages in thread From: Gleb Natapov @ 2013-06-05 14:04 UTC (permalink / raw) To: Michael S. Tsirkin; +Cc: Marcelo Tosatti, qemu-devel, kvm On Wed, Jun 05, 2013 at 05:02:07PM +0300, Michael S. Tsirkin wrote: > On Wed, Jun 05, 2013 at 04:00:20PM +0300, Gleb Natapov wrote: > > On Tue, Jun 04, 2013 at 02:52:32PM +0300, Michael S. Tsirkin wrote: > > > kvm_add_routing_entry makes an attempt to > > > zero-initialize any new routing entry. > > > However, it fails to initialize padding > > > within the u field of the structure > > > kvm_irq_routing_entry. > > > > > > Other functions like kvm_irqchip_update_msi_route > > > also fail to initialize the padding field in > > > kvm_irq_routing_entry. > > > > > > While mostly harmless, this would prevent us from > > > reusing these fields for something useful in > > > the future. > > > > > The fact that kernel does not check them for zero value is what will > > prevents us from doing so. > > Well we can not change kernel now (it would break userspace) > but we can start zeroing everything in userspace. > > Also, checkers like coverity might get confused by this. > > Finally, simpler assignment and comparison make it worth it, > don't they? > I am not at all against the patch! Just pointing out a mistake in the commit message. > > > It's better to just make sure all input is initialized. > > > > > > Once it is, we can also drop complex field by field assignment and just > > > do the simple *a = *b to update a route entry. > > > > > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > > > --- > > > kvm-all.c | 19 +++++++------------ > > > 1 file changed, 7 insertions(+), 12 deletions(-) > > > > > > diff --git a/kvm-all.c b/kvm-all.c > > > index 405480e..f119ce1 100644 > > > --- a/kvm-all.c > > > +++ b/kvm-all.c > > > @@ -1006,11 +1006,8 @@ static void kvm_add_routing_entry(KVMState *s, > > > } > > > n = s->irq_routes->nr++; > > > new = &s->irq_routes->entries[n]; > > > - memset(new, 0, sizeof(*new)); > > > - new->gsi = entry->gsi; > > > - new->type = entry->type; > > > - new->flags = entry->flags; > > > - new->u = entry->u; > > > + > > > + *new = *entry; > > > > > > set_gsi(s, entry->gsi); > > > > > > @@ -1029,9 +1026,7 @@ static int kvm_update_routing_entry(KVMState *s, > > > continue; > > > } > > > > > > - entry->type = new_entry->type; > > > - entry->flags = new_entry->flags; > > > - entry->u = new_entry->u; > > > + *entry = *new_entry; > > > > > > kvm_irqchip_commit_routes(s); > > > > > > @@ -1043,7 +1038,7 @@ static int kvm_update_routing_entry(KVMState *s, > > > > > > void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin) > > > { > > > - struct kvm_irq_routing_entry e; > > > + struct kvm_irq_routing_entry e = {}; > > > > > > assert(pin < s->gsi_count); > > > > > > @@ -1156,7 +1151,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > > return virq; > > > } > > > > > > - route = g_malloc(sizeof(KVMMSIRoute)); > > > + route = g_malloc0(sizeof(KVMMSIRoute)); > > > route->kroute.gsi = virq; > > > route->kroute.type = KVM_IRQ_ROUTING_MSI; > > > route->kroute.flags = 0; > > > @@ -1177,7 +1172,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > > > > > int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > > { > > > - struct kvm_irq_routing_entry kroute; > > > + struct kvm_irq_routing_entry kroute = {}; > > > int virq; > > > > > > if (!kvm_gsi_routing_enabled()) { > > > @@ -1203,7 +1198,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > > > > > int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg) > > > { > > > - struct kvm_irq_routing_entry kroute; > > > + struct kvm_irq_routing_entry kroute = {}; > > > > > > if (!kvm_irqchip_in_kernel()) { > > > return -ENOSYS; > > > -- > > > MST > > > > -- > > Gleb. -- Gleb. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input 2013-06-05 14:04 ` Gleb Natapov @ 2013-06-05 14:11 ` Michael S. Tsirkin 2013-06-05 14:12 ` Gleb Natapov 0 siblings, 1 reply; 9+ messages in thread From: Michael S. Tsirkin @ 2013-06-05 14:11 UTC (permalink / raw) To: Gleb Natapov; +Cc: Marcelo Tosatti, qemu-devel, kvm On Wed, Jun 05, 2013 at 05:04:55PM +0300, Gleb Natapov wrote: > On Wed, Jun 05, 2013 at 05:02:07PM +0300, Michael S. Tsirkin wrote: > > On Wed, Jun 05, 2013 at 04:00:20PM +0300, Gleb Natapov wrote: > > > On Tue, Jun 04, 2013 at 02:52:32PM +0300, Michael S. Tsirkin wrote: > > > > kvm_add_routing_entry makes an attempt to > > > > zero-initialize any new routing entry. > > > > However, it fails to initialize padding > > > > within the u field of the structure > > > > kvm_irq_routing_entry. > > > > > > > > Other functions like kvm_irqchip_update_msi_route > > > > also fail to initialize the padding field in > > > > kvm_irq_routing_entry. > > > > > > > > While mostly harmless, this would prevent us from > > > > reusing these fields for something useful in > > > > the future. > > > > > > > The fact that kernel does not check them for zero value is what will > > > prevents us from doing so. > > > > Well we can not change kernel now (it would break userspace) > > but we can start zeroing everything in userspace. > > > > Also, checkers like coverity might get confused by this. > > > > Finally, simpler assignment and comparison make it worth it, > > don't they? > > > I am not at all against the patch! Just pointing out a mistake in the > commit message. I think we can agree both userspace not initializing them and kernel not checking it are mistakes? Anyway ... could you commit this tweaking the commit message in a way that you consider appropriate? Or want me to repost? > > > > It's better to just make sure all input is initialized. > > > > > > > > Once it is, we can also drop complex field by field assignment and just > > > > do the simple *a = *b to update a route entry. > > > > > > > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > > > > --- > > > > kvm-all.c | 19 +++++++------------ > > > > 1 file changed, 7 insertions(+), 12 deletions(-) > > > > > > > > diff --git a/kvm-all.c b/kvm-all.c > > > > index 405480e..f119ce1 100644 > > > > --- a/kvm-all.c > > > > +++ b/kvm-all.c > > > > @@ -1006,11 +1006,8 @@ static void kvm_add_routing_entry(KVMState *s, > > > > } > > > > n = s->irq_routes->nr++; > > > > new = &s->irq_routes->entries[n]; > > > > - memset(new, 0, sizeof(*new)); > > > > - new->gsi = entry->gsi; > > > > - new->type = entry->type; > > > > - new->flags = entry->flags; > > > > - new->u = entry->u; > > > > + > > > > + *new = *entry; > > > > > > > > set_gsi(s, entry->gsi); > > > > > > > > @@ -1029,9 +1026,7 @@ static int kvm_update_routing_entry(KVMState *s, > > > > continue; > > > > } > > > > > > > > - entry->type = new_entry->type; > > > > - entry->flags = new_entry->flags; > > > > - entry->u = new_entry->u; > > > > + *entry = *new_entry; > > > > > > > > kvm_irqchip_commit_routes(s); > > > > > > > > @@ -1043,7 +1038,7 @@ static int kvm_update_routing_entry(KVMState *s, > > > > > > > > void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin) > > > > { > > > > - struct kvm_irq_routing_entry e; > > > > + struct kvm_irq_routing_entry e = {}; > > > > > > > > assert(pin < s->gsi_count); > > > > > > > > @@ -1156,7 +1151,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > > > return virq; > > > > } > > > > > > > > - route = g_malloc(sizeof(KVMMSIRoute)); > > > > + route = g_malloc0(sizeof(KVMMSIRoute)); > > > > route->kroute.gsi = virq; > > > > route->kroute.type = KVM_IRQ_ROUTING_MSI; > > > > route->kroute.flags = 0; > > > > @@ -1177,7 +1172,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > > > > > > > int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > > > { > > > > - struct kvm_irq_routing_entry kroute; > > > > + struct kvm_irq_routing_entry kroute = {}; > > > > int virq; > > > > > > > > if (!kvm_gsi_routing_enabled()) { > > > > @@ -1203,7 +1198,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > > > > > > > int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg) > > > > { > > > > - struct kvm_irq_routing_entry kroute; > > > > + struct kvm_irq_routing_entry kroute = {}; > > > > > > > > if (!kvm_irqchip_in_kernel()) { > > > > return -ENOSYS; > > > > -- > > > > MST > > > > > > -- > > > Gleb. > > -- > Gleb. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input 2013-06-05 14:11 ` Michael S. Tsirkin @ 2013-06-05 14:12 ` Gleb Natapov 2013-06-05 14:19 ` Michael S. Tsirkin 0 siblings, 1 reply; 9+ messages in thread From: Gleb Natapov @ 2013-06-05 14:12 UTC (permalink / raw) To: Michael S. Tsirkin; +Cc: Marcelo Tosatti, qemu-devel, kvm On Wed, Jun 05, 2013 at 05:11:44PM +0300, Michael S. Tsirkin wrote: > On Wed, Jun 05, 2013 at 05:04:55PM +0300, Gleb Natapov wrote: > > On Wed, Jun 05, 2013 at 05:02:07PM +0300, Michael S. Tsirkin wrote: > > > On Wed, Jun 05, 2013 at 04:00:20PM +0300, Gleb Natapov wrote: > > > > On Tue, Jun 04, 2013 at 02:52:32PM +0300, Michael S. Tsirkin wrote: > > > > > kvm_add_routing_entry makes an attempt to > > > > > zero-initialize any new routing entry. > > > > > However, it fails to initialize padding > > > > > within the u field of the structure > > > > > kvm_irq_routing_entry. > > > > > > > > > > Other functions like kvm_irqchip_update_msi_route > > > > > also fail to initialize the padding field in > > > > > kvm_irq_routing_entry. > > > > > > > > > > While mostly harmless, this would prevent us from > > > > > reusing these fields for something useful in > > > > > the future. > > > > > > > > > The fact that kernel does not check them for zero value is what will > > > > prevents us from doing so. > > > > > > Well we can not change kernel now (it would break userspace) > > > but we can start zeroing everything in userspace. > > > > > > Also, checkers like coverity might get confused by this. > > > > > > Finally, simpler assignment and comparison make it worth it, > > > don't they? > > > > > I am not at all against the patch! Just pointing out a mistake in the > > commit message. > > I think we can agree both userspace not initializing them and kernel not > checking it are mistakes? > Mistake that cannot be fixed at this point. > Anyway ... could you commit this tweaking the commit > message in a way that you consider appropriate? > Or want me to repost? > No need to report. > > > > > > It's better to just make sure all input is initialized. > > > > > > > > > > Once it is, we can also drop complex field by field assignment and just > > > > > do the simple *a = *b to update a route entry. > > > > > > > > > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > > > > > --- > > > > > kvm-all.c | 19 +++++++------------ > > > > > 1 file changed, 7 insertions(+), 12 deletions(-) > > > > > > > > > > diff --git a/kvm-all.c b/kvm-all.c > > > > > index 405480e..f119ce1 100644 > > > > > --- a/kvm-all.c > > > > > +++ b/kvm-all.c > > > > > @@ -1006,11 +1006,8 @@ static void kvm_add_routing_entry(KVMState *s, > > > > > } > > > > > n = s->irq_routes->nr++; > > > > > new = &s->irq_routes->entries[n]; > > > > > - memset(new, 0, sizeof(*new)); > > > > > - new->gsi = entry->gsi; > > > > > - new->type = entry->type; > > > > > - new->flags = entry->flags; > > > > > - new->u = entry->u; > > > > > + > > > > > + *new = *entry; > > > > > > > > > > set_gsi(s, entry->gsi); > > > > > > > > > > @@ -1029,9 +1026,7 @@ static int kvm_update_routing_entry(KVMState *s, > > > > > continue; > > > > > } > > > > > > > > > > - entry->type = new_entry->type; > > > > > - entry->flags = new_entry->flags; > > > > > - entry->u = new_entry->u; > > > > > + *entry = *new_entry; > > > > > > > > > > kvm_irqchip_commit_routes(s); > > > > > > > > > > @@ -1043,7 +1038,7 @@ static int kvm_update_routing_entry(KVMState *s, > > > > > > > > > > void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin) > > > > > { > > > > > - struct kvm_irq_routing_entry e; > > > > > + struct kvm_irq_routing_entry e = {}; > > > > > > > > > > assert(pin < s->gsi_count); > > > > > > > > > > @@ -1156,7 +1151,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > > > > return virq; > > > > > } > > > > > > > > > > - route = g_malloc(sizeof(KVMMSIRoute)); > > > > > + route = g_malloc0(sizeof(KVMMSIRoute)); > > > > > route->kroute.gsi = virq; > > > > > route->kroute.type = KVM_IRQ_ROUTING_MSI; > > > > > route->kroute.flags = 0; > > > > > @@ -1177,7 +1172,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > > > > > > > > > int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > > > > { > > > > > - struct kvm_irq_routing_entry kroute; > > > > > + struct kvm_irq_routing_entry kroute = {}; > > > > > int virq; > > > > > > > > > > if (!kvm_gsi_routing_enabled()) { > > > > > @@ -1203,7 +1198,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > > > > > > > > > int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg) > > > > > { > > > > > - struct kvm_irq_routing_entry kroute; > > > > > + struct kvm_irq_routing_entry kroute = {}; > > > > > > > > > > if (!kvm_irqchip_in_kernel()) { > > > > > return -ENOSYS; > > > > > -- > > > > > MST > > > > > > > > -- > > > > Gleb. > > > > -- > > Gleb. -- Gleb. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input 2013-06-05 14:12 ` Gleb Natapov @ 2013-06-05 14:19 ` Michael S. Tsirkin 0 siblings, 0 replies; 9+ messages in thread From: Michael S. Tsirkin @ 2013-06-05 14:19 UTC (permalink / raw) To: Gleb Natapov; +Cc: Marcelo Tosatti, qemu-devel, kvm On Wed, Jun 05, 2013 at 05:12:32PM +0300, Gleb Natapov wrote: > On Wed, Jun 05, 2013 at 05:11:44PM +0300, Michael S. Tsirkin wrote: > > On Wed, Jun 05, 2013 at 05:04:55PM +0300, Gleb Natapov wrote: > > > On Wed, Jun 05, 2013 at 05:02:07PM +0300, Michael S. Tsirkin wrote: > > > > On Wed, Jun 05, 2013 at 04:00:20PM +0300, Gleb Natapov wrote: > > > > > On Tue, Jun 04, 2013 at 02:52:32PM +0300, Michael S. Tsirkin wrote: > > > > > > kvm_add_routing_entry makes an attempt to > > > > > > zero-initialize any new routing entry. > > > > > > However, it fails to initialize padding > > > > > > within the u field of the structure > > > > > > kvm_irq_routing_entry. > > > > > > > > > > > > Other functions like kvm_irqchip_update_msi_route > > > > > > also fail to initialize the padding field in > > > > > > kvm_irq_routing_entry. > > > > > > > > > > > > While mostly harmless, this would prevent us from > > > > > > reusing these fields for something useful in > > > > > > the future. > > > > > > > > > > > The fact that kernel does not check them for zero value is what will > > > > > prevents us from doing so. > > > > > > > > Well we can not change kernel now (it would break userspace) > > > > but we can start zeroing everything in userspace. > > > > > > > > Also, checkers like coverity might get confused by this. > > > > > > > > Finally, simpler assignment and comparison make it worth it, > > > > don't they? > > > > > > > I am not at all against the patch! Just pointing out a mistake in the > > > commit message. > > > > I think we can agree both userspace not initializing them and kernel not > > checking it are mistakes? > > > Mistake that cannot be fixed at this point. > > > Anyway ... could you commit this tweaking the commit > > message in a way that you consider appropriate? > > Or want me to repost? > > > No need to report. Thanks. > > > > > > > > It's better to just make sure all input is initialized. > > > > > > > > > > > > Once it is, we can also drop complex field by field assignment and just > > > > > > do the simple *a = *b to update a route entry. > > > > > > > > > > > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> > > > > > > --- > > > > > > kvm-all.c | 19 +++++++------------ > > > > > > 1 file changed, 7 insertions(+), 12 deletions(-) > > > > > > > > > > > > diff --git a/kvm-all.c b/kvm-all.c > > > > > > index 405480e..f119ce1 100644 > > > > > > --- a/kvm-all.c > > > > > > +++ b/kvm-all.c > > > > > > @@ -1006,11 +1006,8 @@ static void kvm_add_routing_entry(KVMState *s, > > > > > > } > > > > > > n = s->irq_routes->nr++; > > > > > > new = &s->irq_routes->entries[n]; > > > > > > - memset(new, 0, sizeof(*new)); > > > > > > - new->gsi = entry->gsi; > > > > > > - new->type = entry->type; > > > > > > - new->flags = entry->flags; > > > > > > - new->u = entry->u; > > > > > > + > > > > > > + *new = *entry; > > > > > > > > > > > > set_gsi(s, entry->gsi); > > > > > > > > > > > > @@ -1029,9 +1026,7 @@ static int kvm_update_routing_entry(KVMState *s, > > > > > > continue; > > > > > > } > > > > > > > > > > > > - entry->type = new_entry->type; > > > > > > - entry->flags = new_entry->flags; > > > > > > - entry->u = new_entry->u; > > > > > > + *entry = *new_entry; > > > > > > > > > > > > kvm_irqchip_commit_routes(s); > > > > > > > > > > > > @@ -1043,7 +1038,7 @@ static int kvm_update_routing_entry(KVMState *s, > > > > > > > > > > > > void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin) > > > > > > { > > > > > > - struct kvm_irq_routing_entry e; > > > > > > + struct kvm_irq_routing_entry e = {}; > > > > > > > > > > > > assert(pin < s->gsi_count); > > > > > > > > > > > > @@ -1156,7 +1151,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > > > > > return virq; > > > > > > } > > > > > > > > > > > > - route = g_malloc(sizeof(KVMMSIRoute)); > > > > > > + route = g_malloc0(sizeof(KVMMSIRoute)); > > > > > > route->kroute.gsi = virq; > > > > > > route->kroute.type = KVM_IRQ_ROUTING_MSI; > > > > > > route->kroute.flags = 0; > > > > > > @@ -1177,7 +1172,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > > > > > > > > > > > int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > > > > > { > > > > > > - struct kvm_irq_routing_entry kroute; > > > > > > + struct kvm_irq_routing_entry kroute = {}; > > > > > > int virq; > > > > > > > > > > > > if (!kvm_gsi_routing_enabled()) { > > > > > > @@ -1203,7 +1198,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > > > > > > > > > > > int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg) > > > > > > { > > > > > > - struct kvm_irq_routing_entry kroute; > > > > > > + struct kvm_irq_routing_entry kroute = {}; > > > > > > > > > > > > if (!kvm_irqchip_in_kernel()) { > > > > > > return -ENOSYS; > > > > > > -- > > > > > > MST > > > > > > > > > > -- > > > > > Gleb. > > > > > > -- > > > Gleb. > > -- > Gleb. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input 2013-06-04 11:52 [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input Michael S. Tsirkin 2013-06-04 11:52 ` [Qemu-devel] [PATCH 2/2] kvm: skip system call when msi route is unchanged Michael S. Tsirkin 2013-06-05 13:00 ` [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input Gleb Natapov @ 2013-06-05 14:47 ` Gleb Natapov 2 siblings, 0 replies; 9+ messages in thread From: Gleb Natapov @ 2013-06-05 14:47 UTC (permalink / raw) To: Michael S. Tsirkin; +Cc: Marcelo Tosatti, qemu-devel, kvm On Tue, Jun 04, 2013 at 02:52:32PM +0300, Michael S. Tsirkin wrote: > kvm_add_routing_entry makes an attempt to > zero-initialize any new routing entry. > However, it fails to initialize padding > within the u field of the structure > kvm_irq_routing_entry. > > Other functions like kvm_irqchip_update_msi_route > also fail to initialize the padding field in > kvm_irq_routing_entry. > > While mostly harmless, this would prevent us from > reusing these fields for something useful in > the future. > > It's better to just make sure all input is initialized. > > Once it is, we can also drop complex field by field assignment and just > do the simple *a = *b to update a route entry. > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Applied, thanks. > --- > kvm-all.c | 19 +++++++------------ > 1 file changed, 7 insertions(+), 12 deletions(-) > > diff --git a/kvm-all.c b/kvm-all.c > index 405480e..f119ce1 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -1006,11 +1006,8 @@ static void kvm_add_routing_entry(KVMState *s, > } > n = s->irq_routes->nr++; > new = &s->irq_routes->entries[n]; > - memset(new, 0, sizeof(*new)); > - new->gsi = entry->gsi; > - new->type = entry->type; > - new->flags = entry->flags; > - new->u = entry->u; > + > + *new = *entry; > > set_gsi(s, entry->gsi); > > @@ -1029,9 +1026,7 @@ static int kvm_update_routing_entry(KVMState *s, > continue; > } > > - entry->type = new_entry->type; > - entry->flags = new_entry->flags; > - entry->u = new_entry->u; > + *entry = *new_entry; > > kvm_irqchip_commit_routes(s); > > @@ -1043,7 +1038,7 @@ static int kvm_update_routing_entry(KVMState *s, > > void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin) > { > - struct kvm_irq_routing_entry e; > + struct kvm_irq_routing_entry e = {}; > > assert(pin < s->gsi_count); > > @@ -1156,7 +1151,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > return virq; > } > > - route = g_malloc(sizeof(KVMMSIRoute)); > + route = g_malloc0(sizeof(KVMMSIRoute)); > route->kroute.gsi = virq; > route->kroute.type = KVM_IRQ_ROUTING_MSI; > route->kroute.flags = 0; > @@ -1177,7 +1172,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) > > int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > { > - struct kvm_irq_routing_entry kroute; > + struct kvm_irq_routing_entry kroute = {}; > int virq; > > if (!kvm_gsi_routing_enabled()) { > @@ -1203,7 +1198,7 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg) > > int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg) > { > - struct kvm_irq_routing_entry kroute; > + struct kvm_irq_routing_entry kroute = {}; > > if (!kvm_irqchip_in_kernel()) { > return -ENOSYS; > -- > MST -- Gleb. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2013-06-05 14:47 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-06-04 11:52 [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input Michael S. Tsirkin 2013-06-04 11:52 ` [Qemu-devel] [PATCH 2/2] kvm: skip system call when msi route is unchanged Michael S. Tsirkin 2013-06-05 13:00 ` [Qemu-devel] [PATCH 1/2] kvm: zero-initialize KVM_SET_GSI_ROUTING input Gleb Natapov 2013-06-05 14:02 ` Michael S. Tsirkin 2013-06-05 14:04 ` Gleb Natapov 2013-06-05 14:11 ` Michael S. Tsirkin 2013-06-05 14:12 ` Gleb Natapov 2013-06-05 14:19 ` Michael S. Tsirkin 2013-06-05 14:47 ` Gleb Natapov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).