From: Jaime Velasco Juan <jsagarribay@gmail.com>
To: David Ellingsworth <david@identd.dyndns.org>
Cc: video4linux-list@redhat.com
Subject: Re: [RFT v2] stk-webcam: Fix video_device handling
Date: Thu, 3 Jul 2008 19:53:49 +0100 [thread overview]
Message-ID: <20080703185349.GA6467@singular.sob> (raw)
In-Reply-To: <30353c3d0807012101m5158059ftdb679e9501ec0fde@mail.gmail.com>
El mié. 02 de jul. de 2008, a las 00:01:20 -0400, David Ellingsworth escribió:
> On Tue, Jul 1, 2008 at 3:42 PM, David Ellingsworth
> <david@identd.dyndns.org> wrote:
> > On Tue, Jul 1, 2008 at 1:13 PM, Jaime Velasco Juan
> > <jsagarribay@gmail.com> wrote:
> >> Hi David,
> >>
> >> it seems to work ok now with your other patch, but if the video_device
> >> struct is going to be ref. counted, wouldn't it make sense to drop the
> >> kref in the driver and free all resources in the release callback? With
> >> these changes there are two krefs which are created, get and put at the
> >> same time and for the same purpose.
> >>
> > I noticed this as well and was actually working on a patch which would
> > have removed the kref from the stk_camera since it would no longer
> > have been needed.
> >
> >> I also like better the video_device struct embedded in the main
> >> stk_camera struct (as it is now), but if people prefer having it
> >> referenced with a pointer, so be it.
> >>
> > Agreed. The next patch I submit will keep the video_device struct in
> > the stk_camera struct as it really doesn't need to be allocated using
> > video_device_alloc().
> >
> >> Regards,
> >>
> >> Jaime
> >
> > I'm currently working to correct the kobject reference count in
> > videodev which was previously patched by using a kref. The resulting
> > behavior should be the same, but the code will be much simpler to
> > understand. Once I have this working I will submit a proper patch for
> > stk-webcam as well.
> >
> > Regards,
> >
> > David Ellingsworth
> >
>
> As promised, here's the patch which frees the stk_camera object via
> the kobject release callback. This patch should be applied along with
> the latest videodev patch titled "videodev: fix kobj ref count". This
> patch removes the unnecessary kref object from stk_camera and reduces
> the size of the driver by 40 lines of code.
>
> Regards,
>
> David Ellingsworth
>
> [PATCH] stk-webcam: release via kobj
>
>
> Signed-off-by: David Ellingsworth <david@identd.dyndns.org>
Hi David, seems to work fine, I don't have any complaints.
Acked-by: Jaime Velasco Juan <jsagarribay@gmail.com>
Thanks.
> ---
> drivers/media/video/stk-webcam.c | 84 ++++++++++---------------------------
> drivers/media/video/stk-webcam.h | 2 -
> 2 files changed, 23 insertions(+), 63 deletions(-)
>
> diff --git a/drivers/media/video/stk-webcam.c b/drivers/media/video/stk-webcam.c
> index f308c38..acf9a69 100644
> --- a/drivers/media/video/stk-webcam.c
> +++ b/drivers/media/video/stk-webcam.c
> @@ -64,22 +64,6 @@ static struct usb_device_id stkwebcam_table[] = {
> };
> MODULE_DEVICE_TABLE(usb, stkwebcam_table);
>
> -static void stk_camera_cleanup(struct kref *kref)
> -{
> - struct stk_camera *dev = to_stk_camera(kref);
> -
> - STK_INFO("Syntek USB2.0 Camera release resources"
> - " video device /dev/video%d\n", dev->vdev.minor);
> - video_unregister_device(&dev->vdev);
> - dev->vdev.priv = NULL;
> -
> - if (dev->sio_bufs != NULL || dev->isobufs != NULL)
> - STK_ERROR("We are leaking memory\n");
> - usb_put_intf(dev->interface);
> - kfree(dev);
> -}
> -
> -
> /*
> * Basic stuff
> */
> @@ -687,8 +671,7 @@ static int v4l_stk_open(struct inode *inode,
> struct file *fp)
>
> if (dev == NULL || !is_present(dev))
> return -ENXIO;
> - fp->private_data = vdev;
> - kref_get(&dev->kref);
> + fp->private_data = dev;
> usb_autopm_get_interface(dev->interface);
>
> return 0;
> @@ -696,23 +679,10 @@ static int v4l_stk_open(struct inode *inode,
> struct file *fp)
>
> static int v4l_stk_release(struct inode *inode, struct file *fp)
> {
> - struct stk_camera *dev;
> - struct video_device *vdev;
> -
> - vdev = video_devdata(fp);
> - if (vdev == NULL) {
> - STK_ERROR("v4l_release called w/o video devdata\n");
> - return -EFAULT;
> - }
> - dev = vdev_to_camera(vdev);
> - if (dev == NULL) {
> - STK_ERROR("v4l_release called on removed device\n");
> - return -ENODEV;
> - }
> + struct stk_camera *dev = fp->private_data;
>
> if (dev->owner != fp) {
> usb_autopm_put_interface(dev->interface);
> - kref_put(&dev->kref, stk_camera_cleanup);
> return 0;
> }
>
> @@ -723,7 +693,6 @@ static int v4l_stk_release(struct inode *inode,
> struct file *fp)
> dev->owner = NULL;
>
> usb_autopm_put_interface(dev->interface);
> - kref_put(&dev->kref, stk_camera_cleanup);
>
> return 0;
> }
> @@ -734,14 +703,8 @@ static ssize_t v4l_stk_read(struct file *fp, char
> __user *buf,
> int i;
> int ret;
> unsigned long flags;
> - struct stk_camera *dev;
> - struct video_device *vdev;
> struct stk_sio_buffer *sbuf;
> -
> - vdev = video_devdata(fp);
> - if (vdev == NULL)
> - return -EFAULT;
> - dev = vdev_to_camera(vdev);
> + struct stk_camera *dev = fp->private_data;
>
> if (dev == NULL)
> return -EIO;
> @@ -800,15 +763,8 @@ static ssize_t v4l_stk_read(struct file *fp, char
> __user *buf,
>
> static unsigned int v4l_stk_poll(struct file *fp, poll_table *wait)
> {
> - struct stk_camera *dev;
> - struct video_device *vdev;
> -
> - vdev = video_devdata(fp);
> -
> - if (vdev == NULL)
> - return -EFAULT;
> + struct stk_camera *dev = fp->private_data;
>
> - dev = vdev_to_camera(vdev);
> if (dev == NULL)
> return -ENODEV;
>
> @@ -846,16 +802,12 @@ static int v4l_stk_mmap(struct file *fp, struct
> vm_area_struct *vma)
> unsigned int i;
> int ret;
> unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
> - struct stk_camera *dev;
> - struct video_device *vdev;
> + struct stk_camera *dev = fp->private_data;
> struct stk_sio_buffer *sbuf = NULL;
>
> if (!(vma->vm_flags & VM_WRITE) || !(vma->vm_flags & VM_SHARED))
> return -EINVAL;
>
> - vdev = video_devdata(fp);
> - dev = vdev_to_camera(vdev);
> -
> for (i = 0; i < dev->n_sbufs; i++) {
> if (dev->sio_bufs[i].v4lbuf.m.offset == offset) {
> sbuf = dev->sio_bufs + i;
> @@ -1329,6 +1281,12 @@ static struct file_operations v4l_stk_fops = {
>
> static void stk_v4l_dev_release(struct video_device *vd)
> {
> + struct stk_camera *dev = vdev_to_camera(vd);
> +
> + if (dev->sio_bufs != NULL || dev->isobufs != NULL)
> + STK_ERROR("We are leaking memory\n");
> + usb_put_intf(dev->interface);
> + kfree(dev);
> }
>
> static struct video_device stk_v4l_data = {
> @@ -1370,7 +1328,6 @@ static int stk_register_video_device(struct
> stk_camera *dev)
> dev->vdev = stk_v4l_data;
> dev->vdev.debug = debug;
> dev->vdev.dev = &dev->interface->dev;
> - dev->vdev.priv = dev;
> err = video_register_device(&dev->vdev, VFL_TYPE_GRABBER, -1);
> if (err)
> STK_ERROR("v4l registration failed\n");
> @@ -1387,7 +1344,7 @@ static int stk_camera_probe(struct usb_interface
> *interface,
> const struct usb_device_id *id)
> {
> int i;
> - int err;
> + int err = 0;
>
> struct stk_camera *dev = NULL;
> struct usb_device *udev = interface_to_usbdev(interface);
> @@ -1400,7 +1357,6 @@ static int stk_camera_probe(struct usb_interface
> *interface,
> return -ENOMEM;
> }
>
> - kref_init(&dev->kref);
> spin_lock_init(&dev->spinlock);
> init_waitqueue_head(&dev->wait_frame);
>
> @@ -1433,8 +1389,8 @@ static int stk_camera_probe(struct usb_interface
> *interface,
> }
> if (!dev->isoc_ep) {
> STK_ERROR("Could not find isoc-in endpoint");
> - kref_put(&dev->kref, stk_camera_cleanup);
> - return -ENODEV;
> + err = -ENODEV;
> + goto error;
> }
> dev->vsettings.brightness = 0x7fff;
> dev->vsettings.palette = V4L2_PIX_FMT_RGB565;
> @@ -1448,14 +1404,17 @@ static int stk_camera_probe(struct
> usb_interface *interface,
>
> err = stk_register_video_device(dev);
> if (err) {
> - kref_put(&dev->kref, stk_camera_cleanup);
> - return err;
> + goto error;
> }
>
> stk_create_sysfs_files(&dev->vdev);
> usb_autopm_enable(dev->interface);
>
> return 0;
> +
> +error:
> + kfree(dev);
> + return err;
> }
>
> static void stk_camera_disconnect(struct usb_interface *interface)
> @@ -1468,7 +1427,10 @@ static void stk_camera_disconnect(struct
> usb_interface *interface)
> wake_up_interruptible(&dev->wait_frame);
> stk_remove_sysfs_files(&dev->vdev);
>
> - kref_put(&dev->kref, stk_camera_cleanup);
> + STK_INFO("Syntek USB2.0 Camera release resources"
> + " video device /dev/video%d\n", dev->vdev.minor);
> +
> + video_unregister_device(&dev->vdev);
> }
>
> #ifdef CONFIG_PM
> diff --git a/drivers/media/video/stk-webcam.h b/drivers/media/video/stk-webcam.h
> index df4dfef..084a85b 100644
> --- a/drivers/media/video/stk-webcam.h
> +++ b/drivers/media/video/stk-webcam.h
> @@ -99,7 +99,6 @@ struct stk_camera {
>
> u8 isoc_ep;
>
> - struct kref kref;
> /* Not sure if this is right */
> atomic_t urbs_used;
>
> @@ -121,7 +120,6 @@ struct stk_camera {
> unsigned sequence;
> };
>
> -#define to_stk_camera(d) container_of(d, struct stk_camera, kref)
> #define vdev_to_camera(d) container_of(d, struct stk_camera, vdev)
>
> void stk_camera_delete(struct kref *);
> --
> 1.5.5.1
--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
prev parent reply other threads:[~2008-07-03 18:54 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-29 1:40 [RFT v2] stk-webcam: Fix video_device handling David Ellingsworth
2008-06-29 22:34 ` David Ellingsworth
2008-07-01 17:13 ` Jaime Velasco Juan
2008-07-01 19:42 ` David Ellingsworth
2008-07-02 4:01 ` David Ellingsworth
2008-07-03 18:53 ` Jaime Velasco Juan [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080703185349.GA6467@singular.sob \
--to=jsagarribay@gmail.com \
--cc=david@identd.dyndns.org \
--cc=video4linux-list@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox