All of lore.kernel.org
 help / color / mirror / Atom feed
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

      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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.