Message ID | 20190104162910.GA25118@embeddedor (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | kvm: Use struct_size() in kmalloc() | expand |
2019-01-04 10:29-0600, Gustavo A. R. Silva: > One of the more common cases of allocation size calculations is finding > the size of a structure that has a zero-sized array at the end, along > with memory for some number of elements for that array. For example: > > struct foo { > int stuff; > void *entry[]; > }; > > instance = kmalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL); > > Instead of leaving these open-coded and prone to type mistakes, we can > now use the new struct_size() helper: > > instance = kmalloc(struct_size(instance, entry, count), GFP_KERNEL); > > This code was detected with the help of Coccinelle. > > Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com> > --- Queued, thanks.
Hi all, Friendly ping: Who can take this? Thanks -- Gustavo On 1/4/19 10:29 AM, Gustavo A. R. Silva wrote: > One of the more common cases of allocation size calculations is finding > the size of a structure that has a zero-sized array at the end, along > with memory for some number of elements for that array. For example: > > struct foo { > int stuff; > void *entry[]; > }; > > instance = kmalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL); > > Instead of leaving these open-coded and prone to type mistakes, we can > now use the new struct_size() helper: > > instance = kmalloc(struct_size(instance, entry, count), GFP_KERNEL); > > This code was detected with the help of Coccinelle. > > Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com> > --- > virt/kvm/kvm_main.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 666d0155662d..635b12fdbab8 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -3709,8 +3709,8 @@ int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, > if (bus->dev_count - bus->ioeventfd_count > NR_IOBUS_DEVS - 1) > return -ENOSPC; > > - new_bus = kmalloc(sizeof(*bus) + ((bus->dev_count + 1) * > - sizeof(struct kvm_io_range)), GFP_KERNEL); > + new_bus = kmalloc(struct_size(bus, range, bus->dev_count + 1), > + GFP_KERNEL); > if (!new_bus) > return -ENOMEM; > > @@ -3755,8 +3755,8 @@ void kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, > if (i == bus->dev_count) > return; > > - new_bus = kmalloc(sizeof(*bus) + ((bus->dev_count - 1) * > - sizeof(struct kvm_io_range)), GFP_KERNEL); > + new_bus = kmalloc(struct_size(bus, range, bus->dev_count - 1), > + GFP_KERNEL); > if (!new_bus) { > pr_err("kvm: failed to shrink bus, removing it completely\n"); > goto broken; >
On 29/01/19 18:20, Gustavo A. R. Silva wrote: > Hi all, > > Friendly ping: > > Who can take this? I cannot find the original message in my inbox, but I've queued it from the quote below. Thanks, Paolo > Thanks > -- > Gustavo > > On 1/4/19 10:29 AM, Gustavo A. R. Silva wrote: >> One of the more common cases of allocation size calculations is finding >> the size of a structure that has a zero-sized array at the end, along >> with memory for some number of elements for that array. For example: >> >> struct foo { >> int stuff; >> void *entry[]; >> }; >> >> instance = kmalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL); >> >> Instead of leaving these open-coded and prone to type mistakes, we can >> now use the new struct_size() helper: >> >> instance = kmalloc(struct_size(instance, entry, count), GFP_KERNEL); >> >> This code was detected with the help of Coccinelle. >> >> Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com> >> --- >> virt/kvm/kvm_main.c | 8 ++++---- >> 1 file changed, 4 insertions(+), 4 deletions(-) >> >> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c >> index 666d0155662d..635b12fdbab8 100644 >> --- a/virt/kvm/kvm_main.c >> +++ b/virt/kvm/kvm_main.c >> @@ -3709,8 +3709,8 @@ int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, >> if (bus->dev_count - bus->ioeventfd_count > NR_IOBUS_DEVS - 1) >> return -ENOSPC; >> >> - new_bus = kmalloc(sizeof(*bus) + ((bus->dev_count + 1) * >> - sizeof(struct kvm_io_range)), GFP_KERNEL); >> + new_bus = kmalloc(struct_size(bus, range, bus->dev_count + 1), >> + GFP_KERNEL); >> if (!new_bus) >> return -ENOMEM; >> >> @@ -3755,8 +3755,8 @@ void kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, >> if (i == bus->dev_count) >> return; >> >> - new_bus = kmalloc(sizeof(*bus) + ((bus->dev_count - 1) * >> - sizeof(struct kvm_io_range)), GFP_KERNEL); >> + new_bus = kmalloc(struct_size(bus, range, bus->dev_count - 1), >> + GFP_KERNEL); >> if (!new_bus) { >> pr_err("kvm: failed to shrink bus, removing it completely\n"); >> goto broken; >>
On 1/30/19 10:08 AM, Paolo Bonzini wrote: > On 29/01/19 18:20, Gustavo A. R. Silva wrote: >> Hi all, >> >> Friendly ping: >> >> Who can take this? > > I cannot find the original message in my inbox, but I've queued it from > the quote below. > Thank you, Paolo. -- Gustavo
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 666d0155662d..635b12fdbab8 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -3709,8 +3709,8 @@ int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, if (bus->dev_count - bus->ioeventfd_count > NR_IOBUS_DEVS - 1) return -ENOSPC; - new_bus = kmalloc(sizeof(*bus) + ((bus->dev_count + 1) * - sizeof(struct kvm_io_range)), GFP_KERNEL); + new_bus = kmalloc(struct_size(bus, range, bus->dev_count + 1), + GFP_KERNEL); if (!new_bus) return -ENOMEM; @@ -3755,8 +3755,8 @@ void kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, if (i == bus->dev_count) return; - new_bus = kmalloc(sizeof(*bus) + ((bus->dev_count - 1) * - sizeof(struct kvm_io_range)), GFP_KERNEL); + new_bus = kmalloc(struct_size(bus, range, bus->dev_count - 1), + GFP_KERNEL); if (!new_bus) { pr_err("kvm: failed to shrink bus, removing it completely\n"); goto broken;
One of the more common cases of allocation size calculations is finding the size of a structure that has a zero-sized array at the end, along with memory for some number of elements for that array. For example: struct foo { int stuff; void *entry[]; }; instance = kmalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL); Instead of leaving these open-coded and prone to type mistakes, we can now use the new struct_size() helper: instance = kmalloc(struct_size(instance, entry, count), GFP_KERNEL); This code was detected with the help of Coccinelle. Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com> --- virt/kvm/kvm_main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)