diff options
author | Hans Verkuil <hverkuil-cisco@xs4all.nl> | 2019-02-21 08:47:28 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+samsung@kernel.org> | 2019-03-19 13:31:37 -0400 |
commit | 3650a23eda89f99b964fbd63a20320fafaa73e33 (patch) | |
tree | dc4b31a232ce48d5e144ca9f6a5c13e37b8e33f2 | |
parent | f74267b51cb36321f777807b2e04ca02167ecc08 (diff) |
media: vimc: free vimc_cap_device when the last user disappears
Don't free vimc_cap_device immediately, instead do this
in the video_device release function which is called when the
last user closes the video device. Only then is it safe to
free the memory.
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
-rw-r--r-- | drivers/media/platform/vimc/vimc-capture.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c index ea869631a3f6..54fda5b29dd0 100644 --- a/drivers/media/platform/vimc/vimc-capture.c +++ b/drivers/media/platform/vimc/vimc-capture.c | |||
@@ -338,6 +338,15 @@ static const struct media_entity_operations vimc_cap_mops = { | |||
338 | .link_validate = vimc_link_validate, | 338 | .link_validate = vimc_link_validate, |
339 | }; | 339 | }; |
340 | 340 | ||
341 | static void vimc_cap_release(struct video_device *vdev) | ||
342 | { | ||
343 | struct vimc_cap_device *vcap = | ||
344 | container_of(vdev, struct vimc_cap_device, vdev); | ||
345 | |||
346 | vimc_pads_cleanup(vcap->ved.pads); | ||
347 | kfree(vcap); | ||
348 | } | ||
349 | |||
341 | static void vimc_cap_comp_unbind(struct device *comp, struct device *master, | 350 | static void vimc_cap_comp_unbind(struct device *comp, struct device *master, |
342 | void *master_data) | 351 | void *master_data) |
343 | { | 352 | { |
@@ -348,8 +357,6 @@ static void vimc_cap_comp_unbind(struct device *comp, struct device *master, | |||
348 | vb2_queue_release(&vcap->queue); | 357 | vb2_queue_release(&vcap->queue); |
349 | media_entity_cleanup(ved->ent); | 358 | media_entity_cleanup(ved->ent); |
350 | video_unregister_device(&vcap->vdev); | 359 | video_unregister_device(&vcap->vdev); |
351 | vimc_pads_cleanup(vcap->ved.pads); | ||
352 | kfree(vcap); | ||
353 | } | 360 | } |
354 | 361 | ||
355 | static void *vimc_cap_process_frame(struct vimc_ent_device *ved, | 362 | static void *vimc_cap_process_frame(struct vimc_ent_device *ved, |
@@ -467,7 +474,7 @@ static int vimc_cap_comp_bind(struct device *comp, struct device *master, | |||
467 | vdev = &vcap->vdev; | 474 | vdev = &vcap->vdev; |
468 | vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; | 475 | vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; |
469 | vdev->entity.ops = &vimc_cap_mops; | 476 | vdev->entity.ops = &vimc_cap_mops; |
470 | vdev->release = video_device_release_empty; | 477 | vdev->release = vimc_cap_release; |
471 | vdev->fops = &vimc_cap_fops; | 478 | vdev->fops = &vimc_cap_fops; |
472 | vdev->ioctl_ops = &vimc_cap_ioctl_ops; | 479 | vdev->ioctl_ops = &vimc_cap_ioctl_ops; |
473 | vdev->lock = &vcap->lock; | 480 | vdev->lock = &vcap->lock; |