media: staging: media: davinci_vpfe: fix large stack usage with clang
authorArnd Bergmann <arnd@arndb.de>
Wed, 13 Mar 2019 21:10:29 +0000 (17:10 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 29 Mar 2019 11:37:10 +0000 (07:37 -0400)
clang is unable to optimize the isif_ioctl() in the same way that
gcc does, as it fails to prove that the local copy of
the 'struct vpfe_isif_raw_config' argument is unnecessary:

drivers/staging/media/davinci_vpfe/dm365_isif.c:622:13: error: stack frame size of 1344 bytes in function 'isif_ioctl' [-Werror,-Wframe-larger-than=]

Marking it as 'const' while passing the data down clearly shows us that
the copy is never modified, and we can skip copying it entirely, which
reduces the stack usage to just eight bytes.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/staging/media/davinci_vpfe/dm365_isif.c

index 0a6d038fcec9c1ed93e34598ecacd1fbc2a64174..46fd8184fc77177465bd8c1f762c91920097d3b0 100644 (file)
@@ -433,9 +433,9 @@ static int isif_get_params(struct v4l2_subdev *sd, void *params)
        return 0;
 }
 
-static int isif_validate_df_csc_params(struct vpfe_isif_df_csc *df_csc)
+static int isif_validate_df_csc_params(const struct vpfe_isif_df_csc *df_csc)
 {
-       struct vpfe_isif_color_space_conv *csc;
+       const struct vpfe_isif_color_space_conv *csc;
        int err = -EINVAL;
        int i;
 
@@ -481,7 +481,7 @@ static int isif_validate_df_csc_params(struct vpfe_isif_df_csc *df_csc)
 #define DM365_ISIF_MAX_DFCMEM0         0x1fff
 #define DM365_ISIF_MAX_DFCMEM1         0x1fff
 
-static int isif_validate_dfc_params(struct vpfe_isif_dfc *dfc)
+static int isif_validate_dfc_params(const struct vpfe_isif_dfc *dfc)
 {
        int err = -EINVAL;
        int i;
@@ -532,7 +532,7 @@ static int isif_validate_dfc_params(struct vpfe_isif_dfc *dfc)
 #define DM365_ISIF_MAX_CLVSV                   0x1fff
 #define DM365_ISIF_MAX_HEIGHT_BLACK_REGION     0x1fff
 
-static int isif_validate_bclamp_params(struct vpfe_isif_black_clamp *bclamp)
+static int isif_validate_bclamp_params(const struct vpfe_isif_black_clamp *bclamp)
 {
        int err = -EINVAL;
 
@@ -580,7 +580,7 @@ static int isif_validate_bclamp_params(struct vpfe_isif_black_clamp *bclamp)
 }
 
 static int
-isif_validate_raw_params(struct vpfe_isif_raw_config *params)
+isif_validate_raw_params(const struct vpfe_isif_raw_config *params)
 {
        int ret;
 
@@ -593,20 +593,18 @@ isif_validate_raw_params(struct vpfe_isif_raw_config *params)
        return isif_validate_bclamp_params(&params->bclamp);
 }
 
-static int isif_set_params(struct v4l2_subdev *sd, void *params)
+static int isif_set_params(struct v4l2_subdev *sd, const struct vpfe_isif_raw_config *params)
 {
        struct vpfe_isif_device *isif = v4l2_get_subdevdata(sd);
-       struct vpfe_isif_raw_config isif_raw_params;
        int ret = -EINVAL;
 
        /* only raw module parameters can be set through the IOCTL */
        if (isif->formats[ISIF_PAD_SINK].code != MEDIA_BUS_FMT_SGRBG12_1X12)
                return ret;
 
-       memcpy(&isif_raw_params, params, sizeof(isif_raw_params));
-       if (!isif_validate_raw_params(&isif_raw_params)) {
-               memcpy(&isif->isif_cfg.bayer.config_params, &isif_raw_params,
-                       sizeof(isif_raw_params));
+       if (!isif_validate_raw_params(params)) {
+               memcpy(&isif->isif_cfg.bayer.config_params, params,
+                       sizeof(*params));
                ret = 0;
        }
        return ret;