Skip to content

Commit

Permalink
drm/vmwgfx: Fix frame-size warning in vmw_mksstat_add_ioctl
Browse files Browse the repository at this point in the history
Function vmw_mksstat_add_ioctl allocates three big arrays on stack.
That triggers frame-size [-Wframe-larger-than=] warning. Refactor
that function to use kmalloc_array instead.

Signed-off-by: Martin Krastev <krastevm@vmware.com>
Reviewed-by: Zack Rusin <zackr@vmware.com>
Reviewed-by: Maaz Mombasawala <mombasawalam@vmware.com>
Signed-off-by: Zack Rusin <zackr@vmware.com>
  • Loading branch information
Martin Krastev authored and intel-lab-lkp committed Oct 21, 2022
1 parent 868589c commit 4efe496
Showing 1 changed file with 27 additions and 12 deletions.
39 changes: 27 additions & 12 deletions drivers/gpu/drm/vmwgfx/vmwgfx_msg.c
Expand Up @@ -1023,10 +1023,11 @@ int vmw_mksstat_add_ioctl(struct drm_device *dev, void *data,
long nr_pinned_stat;
long nr_pinned_info;
long nr_pinned_strs;
struct page *pages_stat[ARRAY_SIZE(pdesc->statPPNs)];
struct page *pages_info[ARRAY_SIZE(pdesc->infoPPNs)];
struct page *pages_strs[ARRAY_SIZE(pdesc->strsPPNs)];
struct page **pages_stat = NULL;
struct page **pages_info = NULL;
struct page **pages_strs = NULL;
size_t i, slot;
int ret_err = -ENOMEM;

arg->id = -1;

Expand Down Expand Up @@ -1054,13 +1055,23 @@ int vmw_mksstat_add_ioctl(struct drm_device *dev, void *data,

BUG_ON(dev_priv->mksstat_user_pages[slot]);

/* Allocate statically-sized temp arrays for pages -- too big to keep in frame */
pages_stat = (struct page **)kmalloc_array(
ARRAY_SIZE(pdesc->statPPNs) +
ARRAY_SIZE(pdesc->infoPPNs) +
ARRAY_SIZE(pdesc->strsPPNs), sizeof(*pages_stat), GFP_KERNEL);

if (!pages_stat)
goto err_nomem;

pages_info = pages_stat + ARRAY_SIZE(pdesc->statPPNs);
pages_strs = pages_info + ARRAY_SIZE(pdesc->infoPPNs);

/* Allocate a page for the instance descriptor */
page = alloc_page(GFP_KERNEL | __GFP_ZERO);

if (!page) {
atomic_set(&dev_priv->mksstat_user_pids[slot], 0);
return -ENOMEM;
}
if (!page)
goto err_nomem;

/* Set up the instance descriptor */
pdesc = page_address(page);
Expand All @@ -1075,9 +1086,8 @@ int vmw_mksstat_add_ioctl(struct drm_device *dev, void *data,
ARRAY_SIZE(pdesc->description) - 1);

if (desc_len < 0) {
atomic_set(&dev_priv->mksstat_user_pids[slot], 0);
__free_page(page);
return -EFAULT;
ret_err = -EFAULT;
goto err_nomem;
}

reset_ppn_array(pdesc->statPPNs, ARRAY_SIZE(pdesc->statPPNs));
Expand Down Expand Up @@ -1118,6 +1128,7 @@ int vmw_mksstat_add_ioctl(struct drm_device *dev, void *data,

DRM_DEV_INFO(dev->dev, "pid=%d arg.description='%.*s' id=%zu\n", current->pid, (int)desc_len, pdesc->description, slot);

kfree(pages_stat);
return 0;

err_pin_strs:
Expand All @@ -1132,9 +1143,13 @@ int vmw_mksstat_add_ioctl(struct drm_device *dev, void *data,
if (nr_pinned_stat > 0)
unpin_user_pages(pages_stat, nr_pinned_stat);

err_nomem:
atomic_set(&dev_priv->mksstat_user_pids[slot], 0);
__free_page(page);
return -ENOMEM;
if (page)
__free_page(page);
kfree(pages_stat);

return ret_err;
}

/**
Expand Down

0 comments on commit 4efe496

Please sign in to comment.