Hi Dafna,

Thanks for your patch, just some comments below.

On 10/1/19 2:07 PM, Dafna Hirschfeld wrote:
> since the pads array is of known small size, there is no reason to
> allocate it separately. Instead, it is embedded in the entity struct.
> This also conforms to the media controller doc:
> 'Most drivers will embed the pads array in a driver-specific structure,
> avoiding dynamic allocation.'

Just as a background information, It was allocated separately because the
initial idea was to be able to create multiple pads according to some
configuration. But this changed and your way is better.

> 
> Signed-off-by: Dafna Hirschfeld <dafna.hirschf...@collabora.com>
> ---
> This patch is rebased on top of the patchset
> 'media: vimc: bug fixes related to memory management' sent
> by me which is in turn rebased on top of v5 of the patchset
> 'media: vimc: Collapse component structure into a single
> monolithic driver' sent by 'Shuah Khan'
> 
>  drivers/media/platform/vimc/vimc-capture.c | 15 +++-------
>  drivers/media/platform/vimc/vimc-common.c  | 13 ++-------
>  drivers/media/platform/vimc/vimc-common.h  | 33 ++++------------------
>  drivers/media/platform/vimc/vimc-debayer.c |  9 ++++--
>  drivers/media/platform/vimc/vimc-scaler.c  |  8 ++++--
>  drivers/media/platform/vimc/vimc-sensor.c  |  6 ++--
>  6 files changed, 26 insertions(+), 60 deletions(-)
> 
> diff --git a/drivers/media/platform/vimc/vimc-capture.c 
> b/drivers/media/platform/vimc/vimc-capture.c
> index 5f353c20e605..c3488b5b738f 100644
> --- a/drivers/media/platform/vimc/vimc-capture.c
> +++ b/drivers/media/platform/vimc/vimc-capture.c
> @@ -30,6 +30,7 @@ struct vimc_cap_device {
>       struct mutex lock;
>       u32 sequence;
>       struct vimc_stream stream;
> +     struct media_pad pad[0];

You are declaring an array of size zero, I believe you meant struct media_pad 
pad[1], no?
In any case, why declare an array? You could just use struct media_pad pad.

>  };
>  
>  static const struct v4l2_pix_format fmt_default = {
> @@ -331,7 +332,6 @@ static void vimc_cap_release(struct video_device *vdev)
>               container_of(vdev, struct vimc_cap_device, vdev);
>  
>       media_entity_cleanup(vcap->ved.ent);
> -     vimc_pads_cleanup(vcap->ved.pads);
>       kfree(vcap);
>  }
>  
> @@ -398,21 +398,14 @@ struct vimc_ent_device *vimc_cap_add(struct vimc_device 
> *vimc,
>       if (!vcap)
>               return NULL;
>  
> -     /* Allocate the pads */
> -     vcap->ved.pads =
> -             vimc_pads_init(1, (const unsigned long[1]) {MEDIA_PAD_FL_SINK});
> -     if (IS_ERR(vcap->ved.pads)) {
> -             ret = PTR_ERR(vcap->ved.pads);
> -             goto err_free_vcap;
> -     }
> -
>       /* Initialize the media entity */
>       vcap->vdev.entity.name = vcfg_name;
>       vcap->vdev.entity.function = MEDIA_ENT_F_IO_V4L;
> +     vcap->pad[0].flags = MEDIA_PAD_FL_SINK;
>       ret = media_entity_pads_init(&vcap->vdev.entity,
> -                                  1, vcap->ved.pads);
> +                                  1, vcap->pad);
>       if (ret)
> -             goto err_clean_pads;
> +             goto err_free_vcap;
>  
>       /* Initialize the lock */
>       mutex_init(&vcap->lock);
> @@ -481,8 +474,6 @@ struct vimc_ent_device *vimc_cap_add(struct vimc_device 
> *vimc,
>       vb2_queue_release(q);
>  err_clean_m_ent:
>       media_entity_cleanup(&vcap->vdev.entity);
> -err_clean_pads:
> -     vimc_pads_cleanup(vcap->ved.pads);
>  err_free_vcap:
>       kfree(vcap);
>  
> diff --git a/drivers/media/platform/vimc/vimc-common.c 
> b/drivers/media/platform/vimc/vimc-common.c
> index 999bc353fb10..8eb8c7df36f5 100644
> --- a/drivers/media/platform/vimc/vimc-common.c
> +++ b/drivers/media/platform/vimc/vimc-common.c
> @@ -369,17 +369,12 @@ int vimc_ent_sd_register(struct vimc_ent_device *ved,
>                        const char *const name,
>                        u32 function,
>                        u16 num_pads,
> -                      const unsigned long *pads_flag,
> +                      struct media_pad *pads,
>                        const struct v4l2_subdev_internal_ops *sd_int_ops,
>                        const struct v4l2_subdev_ops *sd_ops)
>  {
>       int ret;
>  
> -     /* Allocate the pads. Should be released from the sd_int_op release */
> -     ved->pads = vimc_pads_init(num_pads, pads_flag);
> -     if (IS_ERR(ved->pads))
> -             return PTR_ERR(ved->pads);
> -
>       /* Fill the vimc_ent_device struct */
>       ved->ent = &sd->entity;
>  
> @@ -398,9 +393,9 @@ int vimc_ent_sd_register(struct vimc_ent_device *ved,
>               sd->flags |= V4L2_SUBDEV_FL_HAS_EVENTS;
>  
>       /* Initialize the media entity */
> -     ret = media_entity_pads_init(&sd->entity, num_pads, ved->pads);
> +     ret = media_entity_pads_init(&sd->entity, num_pads, pads);
>       if (ret)
> -             goto err_clean_pads;
> +             return ret;
>  
>       /* Register the subdev with the v4l2 and the media framework */
>       ret = v4l2_device_register_subdev(v4l2_dev, sd);
> @@ -415,8 +410,6 @@ int vimc_ent_sd_register(struct vimc_ent_device *ved,
>  
>  err_clean_m_ent:
>       media_entity_cleanup(&sd->entity);
> -err_clean_pads:
> -     vimc_pads_cleanup(ved->pads);
>       return ret;
>  }
>  EXPORT_SYMBOL_GPL(vimc_ent_sd_register);
> diff --git a/drivers/media/platform/vimc/vimc-common.h 
> b/drivers/media/platform/vimc/vimc-common.h
> index 698db7c07645..4c76272acc25 100644
> --- a/drivers/media/platform/vimc/vimc-common.h
> +++ b/drivers/media/platform/vimc/vimc-common.h
> @@ -90,10 +90,10 @@ struct vimc_pix_map {
>  };
>  
>  /**
> - * struct vimc_ent_device - core struct that represents a node in the 
> topology
> + * struct vimc_ent_device - core struct that represents an entity in the
> + * topology
>   *
>   * @ent:             the pointer to struct media_entity for the node
> - * @pads:            the list of pads of the node
>   * @process_frame:   callback send a frame to that node
>   * @vdev_get_format: callback that returns the current format a pad, used
>   *                   only when is_media_entity_v4l2_video_device(ent) returns
> @@ -109,7 +109,6 @@ struct vimc_pix_map {
>   */
>  struct vimc_ent_device {
>       struct media_entity *ent;
> -     struct media_pad *pads;
>       void * (*process_frame)(struct vimc_ent_device *ved,
>                               const void *frame);
>       void (*vdev_get_format)(struct vimc_ent_device *ved,
> @@ -169,29 +168,6 @@ struct vimc_ent_device *vimc_sen_add(struct vimc_device 
> *vimc,
>                                    const char *vcfg_name);
>  void vimc_sen_rm(struct vimc_device *vimc, struct vimc_ent_device *ved);
>  
> -/**
> - * vimc_pads_init - initialize pads
> - *
> - * @num_pads:        number of pads to initialize
> - * @pads_flags:      flags to use in each pad
> - *
> - * Helper functions to allocate/initialize pads
> - */
> -struct media_pad *vimc_pads_init(u16 num_pads,
> -                              const unsigned long *pads_flag);
> -
> -/**
> - * vimc_pads_cleanup - free pads
> - *
> - * @pads: pointer to the pads
> - *
> - * Helper function to free the pads initialized with vimc_pads_init
> - */
> -static inline void vimc_pads_cleanup(struct media_pad *pads)
> -{
> -     kfree(pads);
> -}
> -
>  /**
>   * vimc_pipeline_s_stream - start stream through the pipeline
>   *
> @@ -234,7 +210,8 @@ const struct vimc_pix_map 
> *vimc_pix_map_by_pixelformat(u32 pixelformat);
>   *           unique.
>   * @function:        media entity function defined by MEDIA_ENT_F_* macros
>   * @num_pads:        number of pads to initialize
> - * @pads_flag:       flags to use in each pad
> + * @pads:    the array of pads of the entity, the caller should set the
> +             flags of the pads
>   * @sd_int_ops:      pointer to &struct v4l2_subdev_internal_ops
>   * @sd_ops:  pointer to &struct v4l2_subdev_ops.
>   *
> @@ -247,7 +224,7 @@ int vimc_ent_sd_register(struct vimc_ent_device *ved,
>                        const char *const name,
>                        u32 function,
>                        u16 num_pads,
> -                      const unsigned long *pads_flag,
> +                      struct media_pad *pads,
>                        const struct v4l2_subdev_internal_ops *sd_int_ops,
>                        const struct v4l2_subdev_ops *sd_ops);
>  
> diff --git a/drivers/media/platform/vimc/vimc-debayer.c 
> b/drivers/media/platform/vimc/vimc-debayer.c
> index e1bad6713cde..570d9c4a3679 100644
> --- a/drivers/media/platform/vimc/vimc-debayer.c
> +++ b/drivers/media/platform/vimc/vimc-debayer.c
> @@ -44,6 +44,7 @@ struct vimc_deb_device {
>       u8 *src_frame;
>       const struct vimc_deb_pix_map *sink_pix_map;
>       unsigned int sink_bpp;
> +     struct media_pad pads[2];
>  };
>  
>  static const struct v4l2_mbus_framefmt sink_fmt_default = {
> @@ -478,7 +479,6 @@ static void vimc_deb_release(struct v4l2_subdev *sd)
>                               container_of(sd, struct vimc_deb_device, sd);
>  
>       media_entity_cleanup(vdeb->ved.ent);
> -     vimc_pads_cleanup(vdeb->ved.pads);
>       kfree(vdeb);
>  }
>  
> @@ -506,12 +506,15 @@ struct vimc_ent_device *vimc_deb_add(struct vimc_device 
> *vimc,
>       if (!vdeb)
>               return NULL;
>  
> +
>       /* Initialize ved and sd */
> +     vdeb->pads[0].flags = MEDIA_PAD_FL_SINK;
> +     vdeb->pads[1].flags = MEDIA_PAD_FL_SOURCE;
> +
>       ret = vimc_ent_sd_register(&vdeb->ved, &vdeb->sd, v4l2_dev,
>                                  vcfg_name,
>                                  MEDIA_ENT_F_PROC_VIDEO_PIXEL_ENC_CONV, 2,
> -                                (const unsigned long[2]) {MEDIA_PAD_FL_SINK,
> -                                MEDIA_PAD_FL_SOURCE},
> +                                vdeb->pads,
>                                  &vimc_deb_int_ops, &vimc_deb_ops);
>       if (ret) {
>               kfree(vdeb);
> diff --git a/drivers/media/platform/vimc/vimc-scaler.c 
> b/drivers/media/platform/vimc/vimc-scaler.c
> index 1982bc089af5..363037ed5e22 100644
> --- a/drivers/media/platform/vimc/vimc-scaler.c
> +++ b/drivers/media/platform/vimc/vimc-scaler.c
> @@ -30,6 +30,7 @@ struct vimc_sca_device {
>       u8 *src_frame;
>       unsigned int src_line_size;
>       unsigned int bpp;
> +     struct media_pad pads[2];
>  };
>  
>  static const struct v4l2_mbus_framefmt sink_fmt_default = {
> @@ -337,7 +338,6 @@ static void vimc_sca_release(struct v4l2_subdev *sd)
>                               container_of(sd, struct vimc_sca_device, sd);
>  
>       media_entity_cleanup(vsca->ved.ent);
> -     vimc_pads_cleanup(vsca->ved.pads);
>       kfree(vsca);
>  }
>  
> @@ -366,11 +366,13 @@ struct vimc_ent_device *vimc_sca_add(struct vimc_device 
> *vimc,
>               return NULL;
>  
>       /* Initialize ved and sd */
> +     vsca->pads[0].flags = MEDIA_PAD_FL_SINK;
> +     vsca->pads[1].flags = MEDIA_PAD_FL_SOURCE;
> +
>       ret = vimc_ent_sd_register(&vsca->ved, &vsca->sd, v4l2_dev,
>                                  vcfg_name,
>                                  MEDIA_ENT_F_PROC_VIDEO_SCALER, 2,
> -                                (const unsigned long[2]) {MEDIA_PAD_FL_SINK,
> -                                MEDIA_PAD_FL_SOURCE},
> +                                vsca->pads,
>                                  &vimc_sca_int_ops, &vimc_sca_ops);
>       if (ret) {
>               kfree(vsca);
> diff --git a/drivers/media/platform/vimc/vimc-sensor.c 
> b/drivers/media/platform/vimc/vimc-sensor.c
> index 63fe024ccea5..746b97279e04 100644
> --- a/drivers/media/platform/vimc/vimc-sensor.c
> +++ b/drivers/media/platform/vimc/vimc-sensor.c
> @@ -24,6 +24,7 @@ struct vimc_sen_device {
>       /* The active format */
>       struct v4l2_mbus_framefmt mbus_format;
>       struct v4l2_ctrl_handler hdl;
> +     struct media_pad pad[1];

Same thing here, it could be just struct media_pad pad, and you can use &pad 
when required.

Thanks
Helen

>  };
>  
>  static const struct v4l2_mbus_framefmt fmt_default = {
> @@ -292,7 +293,6 @@ static void vimc_sen_release(struct v4l2_subdev *sd)
>       v4l2_ctrl_handler_free(&vsen->hdl);
>       tpg_free(&vsen->tpg);
>       media_entity_cleanup(vsen->ved.ent);
> -     vimc_pads_cleanup(vsen->ved.pads);
>       kfree(vsen);
>  }
>  
> @@ -367,10 +367,10 @@ struct vimc_ent_device *vimc_sen_add(struct vimc_device 
> *vimc,
>               goto err_free_hdl;
>  
>       /* Initialize ved and sd */
> +     vsen->pad[0].flags = MEDIA_PAD_FL_SOURCE;
>       ret = vimc_ent_sd_register(&vsen->ved, &vsen->sd, v4l2_dev,
>                                  vcfg_name,
> -                                MEDIA_ENT_F_CAM_SENSOR, 1,
> -                                (const unsigned long[1]) 
> {MEDIA_PAD_FL_SOURCE},
> +                                MEDIA_ENT_F_CAM_SENSOR, 1, vsen->pad,
>                                  &vimc_sen_int_ops, &vimc_sen_ops);
>       if (ret)
>               goto err_free_tpg;
> 

Reply via email to