treewide: kmalloc() -> kmalloc_array()
The kmalloc() function has a 2-factor argument form, kmalloc_array(). This patch replaces cases of: kmalloc(a * b, gfp) with: kmalloc_array(a * b, gfp) as well as handling cases of: kmalloc(a * b * c, gfp) with: kmalloc(array3_size(a, b, c), gfp) as it's slightly less ugly than: kmalloc_array(array_size(a, b), c, gfp) This does, however, attempt to ignore constant size factors like: kmalloc(4 * 1024, gfp) though any constants defined via macros get caught up in the conversion. Any factors with a sizeof() of "unsigned char", "char", and "u8" were dropped, since they're redundant. The tools/ directory was manually excluded, since it has its own implementation of kmalloc(). The Coccinelle script used for this was: // Fix redundant parens around sizeof(). @@ type TYPE; expression THING, E; @@ ( kmalloc( - (sizeof(TYPE)) * E + sizeof(TYPE) * E , ...) | kmalloc( - (sizeof(THING)) * E + sizeof(THING) * E , ...) ) // Drop single-byte sizes and redundant parens. @@ expression COUNT; typedef u8; typedef __u8; @@ ( kmalloc( - sizeof(u8) * (COUNT) + COUNT , ...) | kmalloc( - sizeof(__u8) * (COUNT) + COUNT , ...) | kmalloc( - sizeof(char) * (COUNT) + COUNT , ...) | kmalloc( - sizeof(unsigned char) * (COUNT) + COUNT , ...) | kmalloc( - sizeof(u8) * COUNT + COUNT , ...) | kmalloc( - sizeof(__u8) * COUNT + COUNT , ...) | kmalloc( - sizeof(char) * COUNT + COUNT , ...) | kmalloc( - sizeof(unsigned char) * COUNT + COUNT , ...) ) // 2-factor product with sizeof(type/expression) and identifier or constant. @@ type TYPE; expression THING; identifier COUNT_ID; constant COUNT_CONST; @@ ( - kmalloc + kmalloc_array ( - sizeof(TYPE) * (COUNT_ID) + COUNT_ID, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(TYPE) * COUNT_ID + COUNT_ID, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(TYPE) * (COUNT_CONST) + COUNT_CONST, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(TYPE) * COUNT_CONST + COUNT_CONST, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * (COUNT_ID) + COUNT_ID, sizeof(THING) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * COUNT_ID + COUNT_ID, sizeof(THING) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * (COUNT_CONST) + COUNT_CONST, sizeof(THING) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * COUNT_CONST + COUNT_CONST, sizeof(THING) , ...) ) // 2-factor product, only identifiers. @@ identifier SIZE, COUNT; @@ - kmalloc + kmalloc_array ( - SIZE * COUNT + COUNT, SIZE , ...) // 3-factor product with 1 sizeof(type) or sizeof(expression), with // redundant parens removed. @@ expression THING; identifier STRIDE, COUNT; type TYPE; @@ ( kmalloc( - sizeof(TYPE) * (COUNT) * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | kmalloc( - sizeof(TYPE) * (COUNT) * STRIDE + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | kmalloc( - sizeof(TYPE) * COUNT * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | kmalloc( - sizeof(TYPE) * COUNT * STRIDE + array3_size(COUNT, STRIDE, sizeof(TYPE)) , ...) | kmalloc( - sizeof(THING) * (COUNT) * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) | kmalloc( - sizeof(THING) * (COUNT) * STRIDE + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) | kmalloc( - sizeof(THING) * COUNT * (STRIDE) + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) | kmalloc( - sizeof(THING) * COUNT * STRIDE + array3_size(COUNT, STRIDE, sizeof(THING)) , ...) ) // 3-factor product with 2 sizeof(variable), with redundant parens removed. @@ expression THING1, THING2; identifier COUNT; type TYPE1, TYPE2; @@ ( kmalloc( - sizeof(TYPE1) * sizeof(TYPE2) * COUNT + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2)) , ...) | kmalloc( - sizeof(TYPE1) * sizeof(THING2) * (COUNT) + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2)) , ...) | kmalloc( - sizeof(THING1) * sizeof(THING2) * COUNT + array3_size(COUNT, sizeof(THING1), sizeof(THING2)) , ...) | kmalloc( - sizeof(THING1) * sizeof(THING2) * (COUNT) + array3_size(COUNT, sizeof(THING1), sizeof(THING2)) , ...) | kmalloc( - sizeof(TYPE1) * sizeof(THING2) * COUNT + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2)) , ...) | kmalloc( - sizeof(TYPE1) * sizeof(THING2) * (COUNT) + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2)) , ...) ) // 3-factor product, only identifiers, with redundant parens removed. @@ identifier STRIDE, SIZE, COUNT; @@ ( kmalloc( - (COUNT) * STRIDE * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - COUNT * (STRIDE) * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - COUNT * STRIDE * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - (COUNT) * (STRIDE) * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - COUNT * (STRIDE) * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - (COUNT) * STRIDE * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - (COUNT) * (STRIDE) * (SIZE) + array3_size(COUNT, STRIDE, SIZE) , ...) | kmalloc( - COUNT * STRIDE * SIZE + array3_size(COUNT, STRIDE, SIZE) , ...) ) // Any remaining multi-factor products, first at least 3-factor products, // when they're not all constants... @@ expression E1, E2, E3; constant C1, C2, C3; @@ ( kmalloc(C1 * C2 * C3, ...) | kmalloc( - (E1) * E2 * E3 + array3_size(E1, E2, E3) , ...) | kmalloc( - (E1) * (E2) * E3 + array3_size(E1, E2, E3) , ...) | kmalloc( - (E1) * (E2) * (E3) + array3_size(E1, E2, E3) , ...) | kmalloc( - E1 * E2 * E3 + array3_size(E1, E2, E3) , ...) ) // And then all remaining 2 factors products when they're not all constants, // keeping sizeof() as the second factor argument. @@ expression THING, E1, E2; type TYPE; constant C1, C2, C3; @@ ( kmalloc(sizeof(THING) * C2, ...) | kmalloc(sizeof(TYPE) * C2, ...) | kmalloc(C1 * C2 * C3, ...) | kmalloc(C1 * C2, ...) | - kmalloc + kmalloc_array ( - sizeof(TYPE) * (E2) + E2, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(TYPE) * E2 + E2, sizeof(TYPE) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * (E2) + E2, sizeof(THING) , ...) | - kmalloc + kmalloc_array ( - sizeof(THING) * E2 + E2, sizeof(THING) , ...) | - kmalloc + kmalloc_array ( - (E1) * E2 + E1, E2 , ...) | - kmalloc + kmalloc_array ( - (E1) * (E2) + E1, E2 , ...) | - kmalloc + kmalloc_array ( - E1 * E2 + E1, E2 , ...) ) Signed-off-by: Kees Cook <keescook@chromium.org>
This commit is contained in:
@@ -407,7 +407,7 @@ static int kgd_hqd_dump(struct kgd_dev *kgd,
|
||||
(*dump)[i++][1] = RREG32(addr); \
|
||||
} while (0)
|
||||
|
||||
*dump = kmalloc(HQD_N_REGS*2*sizeof(uint32_t), GFP_KERNEL);
|
||||
*dump = kmalloc_array(HQD_N_REGS * 2, sizeof(uint32_t), GFP_KERNEL);
|
||||
if (*dump == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -504,7 +504,7 @@ static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
|
||||
#undef HQD_N_REGS
|
||||
#define HQD_N_REGS (19+4)
|
||||
|
||||
*dump = kmalloc(HQD_N_REGS*2*sizeof(uint32_t), GFP_KERNEL);
|
||||
*dump = kmalloc_array(HQD_N_REGS * 2, sizeof(uint32_t), GFP_KERNEL);
|
||||
if (*dump == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -395,7 +395,7 @@ static int kgd_hqd_dump(struct kgd_dev *kgd,
|
||||
(*dump)[i++][1] = RREG32(addr); \
|
||||
} while (0)
|
||||
|
||||
*dump = kmalloc(HQD_N_REGS*2*sizeof(uint32_t), GFP_KERNEL);
|
||||
*dump = kmalloc_array(HQD_N_REGS * 2, sizeof(uint32_t), GFP_KERNEL);
|
||||
if (*dump == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -491,7 +491,7 @@ static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
|
||||
#undef HQD_N_REGS
|
||||
#define HQD_N_REGS (19+4+2+3+7)
|
||||
|
||||
*dump = kmalloc(HQD_N_REGS*2*sizeof(uint32_t), GFP_KERNEL);
|
||||
*dump = kmalloc_array(HQD_N_REGS * 2, sizeof(uint32_t), GFP_KERNEL);
|
||||
if (*dump == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -504,7 +504,7 @@ static int kgd_hqd_dump(struct kgd_dev *kgd,
|
||||
(*dump)[i++][1] = RREG32(addr); \
|
||||
} while (0)
|
||||
|
||||
*dump = kmalloc(HQD_N_REGS*2*sizeof(uint32_t), GFP_KERNEL);
|
||||
*dump = kmalloc_array(HQD_N_REGS * 2, sizeof(uint32_t), GFP_KERNEL);
|
||||
if (*dump == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -606,7 +606,7 @@ static int kgd_hqd_sdma_dump(struct kgd_dev *kgd,
|
||||
#undef HQD_N_REGS
|
||||
#define HQD_N_REGS (19+6+7+10)
|
||||
|
||||
*dump = kmalloc(HQD_N_REGS*2*sizeof(uint32_t), GFP_KERNEL);
|
||||
*dump = kmalloc_array(HQD_N_REGS * 2, sizeof(uint32_t), GFP_KERNEL);
|
||||
if (*dump == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -1633,7 +1633,8 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
|
||||
edid[EDID_LENGTH-1] += edid[0x7e] - valid_extensions;
|
||||
edid[0x7e] = valid_extensions;
|
||||
|
||||
new = kmalloc((valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL);
|
||||
new = kmalloc_array(valid_extensions + 1, EDID_LENGTH,
|
||||
GFP_KERNEL);
|
||||
if (!new)
|
||||
goto out;
|
||||
|
||||
|
@@ -239,7 +239,7 @@ static int mid_get_vbt_data_r10(struct drm_psb_private *dev_priv, u32 addr)
|
||||
if (read_vbt_r10(addr, &vbt))
|
||||
return -1;
|
||||
|
||||
gct = kmalloc(sizeof(*gct) * vbt.panel_count, GFP_KERNEL);
|
||||
gct = kmalloc_array(vbt.panel_count, sizeof(*gct), GFP_KERNEL);
|
||||
if (!gct)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -65,12 +65,15 @@ nvif_mmu_init(struct nvif_object *parent, s32 oclass, struct nvif_mmu *mmu)
|
||||
goto done;
|
||||
mmu->mem = mems[ret].oclass;
|
||||
|
||||
mmu->heap = kmalloc(sizeof(*mmu->heap) * mmu->heap_nr, GFP_KERNEL);
|
||||
mmu->type = kmalloc(sizeof(*mmu->type) * mmu->type_nr, GFP_KERNEL);
|
||||
mmu->heap = kmalloc_array(mmu->heap_nr, sizeof(*mmu->heap),
|
||||
GFP_KERNEL);
|
||||
mmu->type = kmalloc_array(mmu->type_nr, sizeof(*mmu->type),
|
||||
GFP_KERNEL);
|
||||
if (ret = -ENOMEM, !mmu->heap || !mmu->type)
|
||||
goto done;
|
||||
|
||||
mmu->kind = kmalloc(sizeof(*mmu->kind) * mmu->kind_nr, GFP_KERNEL);
|
||||
mmu->kind = kmalloc_array(mmu->kind_nr, sizeof(*mmu->kind),
|
||||
GFP_KERNEL);
|
||||
if (!mmu->kind && mmu->kind_nr)
|
||||
goto done;
|
||||
|
||||
|
@@ -138,7 +138,8 @@ nvif_vmm_init(struct nvif_mmu *mmu, s32 oclass, u64 addr, u64 size,
|
||||
vmm->limit = args->size;
|
||||
|
||||
vmm->page_nr = args->page_nr;
|
||||
vmm->page = kmalloc(sizeof(*vmm->page) * vmm->page_nr, GFP_KERNEL);
|
||||
vmm->page = kmalloc_array(vmm->page_nr, sizeof(*vmm->page),
|
||||
GFP_KERNEL);
|
||||
if (!vmm->page) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
|
@@ -73,7 +73,8 @@ nvbios_iccsense_parse(struct nvkm_bios *bios, struct nvbios_iccsense *iccsense)
|
||||
}
|
||||
|
||||
iccsense->nr_entry = cnt;
|
||||
iccsense->rail = kmalloc(sizeof(struct pwr_rail_t) * cnt, GFP_KERNEL);
|
||||
iccsense->rail = kmalloc_array(cnt, sizeof(struct pwr_rail_t),
|
||||
GFP_KERNEL);
|
||||
if (!iccsense->rail)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -171,7 +171,7 @@ gt215_link_train(struct gt215_ram *ram)
|
||||
return -ENOSYS;
|
||||
|
||||
/* XXX: Multiple partitions? */
|
||||
result = kmalloc(64 * sizeof(u32), GFP_KERNEL);
|
||||
result = kmalloc_array(64, sizeof(u32), GFP_KERNEL);
|
||||
if (!result)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -940,8 +940,8 @@ int tiler_map_show(struct seq_file *s, void *arg)
|
||||
h_adj = omap_dmm->container_height / ydiv;
|
||||
w_adj = omap_dmm->container_width / xdiv;
|
||||
|
||||
map = kmalloc(h_adj * sizeof(*map), GFP_KERNEL);
|
||||
global_map = kmalloc((w_adj + 1) * h_adj, GFP_KERNEL);
|
||||
map = kmalloc_array(h_adj, sizeof(*map), GFP_KERNEL);
|
||||
global_map = kmalloc_array(w_adj + 1, h_adj, GFP_KERNEL);
|
||||
|
||||
if (!map || !global_map)
|
||||
goto error;
|
||||
|
@@ -244,7 +244,7 @@ static int omap_gem_attach_pages(struct drm_gem_object *obj)
|
||||
* DSS, GPU, etc. are not cache coherent:
|
||||
*/
|
||||
if (omap_obj->flags & (OMAP_BO_WC|OMAP_BO_UNCACHED)) {
|
||||
addrs = kmalloc(npages * sizeof(*addrs), GFP_KERNEL);
|
||||
addrs = kmalloc_array(npages, sizeof(*addrs), GFP_KERNEL);
|
||||
if (!addrs) {
|
||||
ret = -ENOMEM;
|
||||
goto free_pages;
|
||||
|
@@ -200,8 +200,8 @@ int qxl_device_init(struct qxl_device *qdev,
|
||||
(~(uint64_t)0) >> (qdev->slot_id_bits + qdev->slot_gen_bits);
|
||||
|
||||
qdev->mem_slots =
|
||||
kmalloc(qdev->n_mem_slots * sizeof(struct qxl_memslot),
|
||||
GFP_KERNEL);
|
||||
kmalloc_array(qdev->n_mem_slots, sizeof(struct qxl_memslot),
|
||||
GFP_KERNEL);
|
||||
|
||||
idr_init(&qdev->release_idr);
|
||||
spin_lock_init(&qdev->release_idr_lock);
|
||||
|
@@ -298,8 +298,9 @@ static int savage_dma_init(drm_savage_private_t * dev_priv)
|
||||
|
||||
dev_priv->nr_dma_pages = dev_priv->cmd_dma->size /
|
||||
(SAVAGE_DMA_PAGE_SIZE * 4);
|
||||
dev_priv->dma_pages = kmalloc(sizeof(drm_savage_dma_page_t) *
|
||||
dev_priv->nr_dma_pages, GFP_KERNEL);
|
||||
dev_priv->dma_pages = kmalloc_array(dev_priv->nr_dma_pages,
|
||||
sizeof(drm_savage_dma_page_t),
|
||||
GFP_KERNEL);
|
||||
if (dev_priv->dma_pages == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -548,7 +548,7 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb,
|
||||
DRM_DEBUG("Flushing [FB:%d] st=%ums\n", fb->base.id,
|
||||
epd->factored_stage_time);
|
||||
|
||||
buf = kmalloc(fb->width * fb->height, GFP_KERNEL);
|
||||
buf = kmalloc_array(fb->width, fb->height, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@@ -348,8 +348,9 @@ static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free,
|
||||
if (use_static)
|
||||
pages_to_free = static_buf;
|
||||
else
|
||||
pages_to_free = kmalloc(npages_to_free * sizeof(struct page *),
|
||||
GFP_KERNEL);
|
||||
pages_to_free = kmalloc_array(npages_to_free,
|
||||
sizeof(struct page *),
|
||||
GFP_KERNEL);
|
||||
if (!pages_to_free) {
|
||||
pr_debug("Failed to allocate memory for pool free operation\n");
|
||||
return 0;
|
||||
@@ -547,7 +548,8 @@ static int ttm_alloc_new_pages(struct list_head *pages, gfp_t gfp_flags,
|
||||
unsigned max_cpages = min(count << order, (unsigned)NUM_PAGES_TO_ALLOC);
|
||||
|
||||
/* allocate array for page caching change */
|
||||
caching_array = kmalloc(max_cpages*sizeof(struct page *), GFP_KERNEL);
|
||||
caching_array = kmalloc_array(max_cpages, sizeof(struct page *),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!caching_array) {
|
||||
pr_debug("Unable to allocate table for new pages\n");
|
||||
|
@@ -463,8 +463,9 @@ static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free,
|
||||
if (use_static)
|
||||
pages_to_free = static_buf;
|
||||
else
|
||||
pages_to_free = kmalloc(npages_to_free * sizeof(struct page *),
|
||||
GFP_KERNEL);
|
||||
pages_to_free = kmalloc_array(npages_to_free,
|
||||
sizeof(struct page *),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!pages_to_free) {
|
||||
pr_debug("%s: Failed to allocate memory for pool free operation\n",
|
||||
@@ -753,7 +754,8 @@ static int ttm_dma_pool_alloc_new_pages(struct dma_pool *pool,
|
||||
(unsigned)(PAGE_SIZE/sizeof(struct page *)));
|
||||
|
||||
/* allocate array for page caching change */
|
||||
caching_array = kmalloc(max_cpages*sizeof(struct page *), GFP_KERNEL);
|
||||
caching_array = kmalloc_array(max_cpages, sizeof(struct page *),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!caching_array) {
|
||||
pr_debug("%s: Unable to allocate table for new pages\n",
|
||||
|
@@ -209,7 +209,7 @@ static void vc4_dlist_write(struct vc4_plane_state *vc4_state, u32 val)
|
||||
{
|
||||
if (vc4_state->dlist_count == vc4_state->dlist_size) {
|
||||
u32 new_size = max(4u, vc4_state->dlist_count * 2);
|
||||
u32 *new_dlist = kmalloc(new_size * 4, GFP_KERNEL);
|
||||
u32 *new_dlist = kmalloc_array(new_size, 4, GFP_KERNEL);
|
||||
|
||||
if (!new_dlist)
|
||||
return;
|
||||
|
Reference in New Issue
Block a user