diff mbox series

[v2] iio: core: register chardev only if needed

Message ID 20200414083656.7696-1-alexandru.ardelean@analog.com (mailing list archive)
State New, archived
Headers show
Series [v2] iio: core: register chardev only if needed | expand

Commit Message

Alexandru Ardelean April 14, 2020, 8:36 a.m. UTC
The final intent is to localize all buffer ops into the
industrialio-buffer.c file, to be able to add support for multiple buffers
per IIO device.

We only need a chardev if we need to support buffers and/or events.

With this change, a chardev will be created:
1. if there is an IIO buffer attached OR
2. if there is an event_interface configured

Otherwise, no chardev will be created.
Quite a lot of IIO devices don't really need a chardev, so this is a minor
improvement to the IIO core, as the IIO device will take up fewer
resources.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
---

Changelog v1 -> v2:
* split away from series 'iio: core,buffer: re-organize chardev creation';
  i'm getting the feeling that this has some value on it's own;
  no idea if it needs 'Fixes' tag; it is a bit fuzzy to point to a patch
  which this would be fixed by this; i'm guessing it would be fine
  without one

 drivers/iio/industrialio-core.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

Comments

Jonathan Cameron April 14, 2020, 6:06 p.m. UTC | #1
On Tue, 14 Apr 2020 11:36:56 +0300
Alexandru Ardelean <alexandru.ardelean@analog.com> wrote:

> The final intent is to localize all buffer ops into the
> industrialio-buffer.c file, to be able to add support for multiple buffers
> per IIO device.
> 
> We only need a chardev if we need to support buffers and/or events.
> 
> With this change, a chardev will be created:
> 1. if there is an IIO buffer attached OR
> 2. if there is an event_interface configured
> 
> Otherwise, no chardev will be created.
> Quite a lot of IIO devices don't really need a chardev, so this is a minor
> improvement to the IIO core, as the IIO device will take up fewer
> resources.
> 
> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
> ---
> 
> Changelog v1 -> v2:
> * split away from series 'iio: core,buffer: re-organize chardev creation';
>   i'm getting the feeling that this has some value on it's own;
>   no idea if it needs 'Fixes' tag; it is a bit fuzzy to point to a patch
>   which this would be fixed by this; i'm guessing it would be fine
>   without one

I'd argue it's an 'optimization' rather than a fix :)

Still looks good to me but I'd like it to sit for a little while to
see if anyone points out something we are both missing!

Thanks for tidying this up.

Jonathan

> 
>  drivers/iio/industrialio-core.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
> index f4daf19f2a3b..32e72d9fd1e9 100644
> --- a/drivers/iio/industrialio-core.c
> +++ b/drivers/iio/industrialio-core.c
> @@ -1676,6 +1676,15 @@ static int iio_check_unique_scan_index(struct iio_dev *indio_dev)
>  
>  static const struct iio_buffer_setup_ops noop_ring_setup_ops;
>  
> +static const struct file_operations iio_event_fileops = {
> +	.release = iio_chrdev_release,
> +	.open = iio_chrdev_open,
> +	.owner = THIS_MODULE,
> +	.llseek = noop_llseek,
> +	.unlocked_ioctl = iio_ioctl,
> +	.compat_ioctl = compat_ptr_ioctl,
> +};
> +
>  int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod)
>  {
>  	int ret;
> @@ -1726,7 +1735,10 @@ int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod)
>  		indio_dev->setup_ops == NULL)
>  		indio_dev->setup_ops = &noop_ring_setup_ops;
>  
> -	cdev_init(&indio_dev->chrdev, &iio_buffer_fileops);
> +	if (indio_dev->buffer)
> +		cdev_init(&indio_dev->chrdev, &iio_buffer_fileops);
> +	else if (indio_dev->event_interface)
> +		cdev_init(&indio_dev->chrdev, &iio_event_fileops);
>  
>  	indio_dev->chrdev.owner = this_mod;
>  
> @@ -1754,7 +1766,8 @@ EXPORT_SYMBOL(__iio_device_register);
>   **/
>  void iio_device_unregister(struct iio_dev *indio_dev)
>  {
> -	cdev_device_del(&indio_dev->chrdev, &indio_dev->dev);
> +	if (indio_dev->buffer || indio_dev->event_interface)
> +		cdev_device_del(&indio_dev->chrdev, &indio_dev->dev);
>  
>  	mutex_lock(&indio_dev->info_exist_lock);
>
Alexandru Ardelean April 15, 2020, 1:56 p.m. UTC | #2
On Tue, 2020-04-14 at 19:06 +0100, Jonathan Cameron wrote:
> [External]
> 
> On Tue, 14 Apr 2020 11:36:56 +0300
> Alexandru Ardelean <alexandru.ardelean@analog.com> wrote:
> 
> > The final intent is to localize all buffer ops into the
> > industrialio-buffer.c file, to be able to add support for multiple buffers
> > per IIO device.
> > 
> > We only need a chardev if we need to support buffers and/or events.
> > 
> > With this change, a chardev will be created:
> > 1. if there is an IIO buffer attached OR
> > 2. if there is an event_interface configured
> > 
> > Otherwise, no chardev will be created.
> > Quite a lot of IIO devices don't really need a chardev, so this is a minor
> > improvement to the IIO core, as the IIO device will take up fewer
> > resources.
> > 
> > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
> > ---
> > 
> > Changelog v1 -> v2:
> > * split away from series 'iio: core,buffer: re-organize chardev creation';
> >   i'm getting the feeling that this has some value on it's own;
> >   no idea if it needs 'Fixes' tag; it is a bit fuzzy to point to a patch
> >   which this would be fixed by this; i'm guessing it would be fine
> >   without one
> 
> I'd argue it's an 'optimization' rather than a fix :)
> 
> Still looks good to me but I'd like it to sit for a little while to
> see if anyone points out something we are both missing!
> 

This is not good.
It seems that I did not properly test all cases.
I had to break a device to not have an event_interface to notice that the sysfs
doesn't get instantiated either because device_add is missing.

Will do another try.


> Thanks for tidying this up.
> 
> Jonathan
> 
> >  drivers/iio/industrialio-core.c | 17 +++++++++++++++--
> >  1 file changed, 15 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-
> > core.c
> > index f4daf19f2a3b..32e72d9fd1e9 100644
> > --- a/drivers/iio/industrialio-core.c
> > +++ b/drivers/iio/industrialio-core.c
> > @@ -1676,6 +1676,15 @@ static int iio_check_unique_scan_index(struct iio_dev
> > *indio_dev)
> >  
> >  static const struct iio_buffer_setup_ops noop_ring_setup_ops;
> >  
> > +static const struct file_operations iio_event_fileops = {
> > +	.release = iio_chrdev_release,
> > +	.open = iio_chrdev_open,
> > +	.owner = THIS_MODULE,
> > +	.llseek = noop_llseek,
> > +	.unlocked_ioctl = iio_ioctl,
> > +	.compat_ioctl = compat_ptr_ioctl,
> > +};
> > +
> >  int __iio_device_register(struct iio_dev *indio_dev, struct module
> > *this_mod)
> >  {
> >  	int ret;
> > @@ -1726,7 +1735,10 @@ int __iio_device_register(struct iio_dev *indio_dev,
> > struct module *this_mod)
> >  		indio_dev->setup_ops == NULL)
> >  		indio_dev->setup_ops = &noop_ring_setup_ops;
> >  
> > -	cdev_init(&indio_dev->chrdev, &iio_buffer_fileops);
> > +	if (indio_dev->buffer)
> > +		cdev_init(&indio_dev->chrdev, &iio_buffer_fileops);
> > +	else if (indio_dev->event_interface)
> > +		cdev_init(&indio_dev->chrdev, &iio_event_fileops);
> >  
> >  	indio_dev->chrdev.owner = this_mod;
> >  
> > @@ -1754,7 +1766,8 @@ EXPORT_SYMBOL(__iio_device_register);
> >   **/
> >  void iio_device_unregister(struct iio_dev *indio_dev)
> >  {
> > -	cdev_device_del(&indio_dev->chrdev, &indio_dev->dev);
> > +	if (indio_dev->buffer || indio_dev->event_interface)
> > +		cdev_device_del(&indio_dev->chrdev, &indio_dev->dev);
> >  
> >  	mutex_lock(&indio_dev->info_exist_lock);
> >
Lars-Peter Clausen April 15, 2020, 2:55 p.m. UTC | #3
On 4/15/20 3:56 PM, Ardelean, Alexandru wrote:
> On Tue, 2020-04-14 at 19:06 +0100, Jonathan Cameron wrote:
>> [External]
>>
>> On Tue, 14 Apr 2020 11:36:56 +0300
>> Alexandru Ardelean <alexandru.ardelean@analog.com> wrote:
>>
>>> The final intent is to localize all buffer ops into the
>>> industrialio-buffer.c file, to be able to add support for multiple buffers
>>> per IIO device.
>>>
>>> We only need a chardev if we need to support buffers and/or events.
>>>
>>> With this change, a chardev will be created:
>>> 1. if there is an IIO buffer attached OR
>>> 2. if there is an event_interface configured
>>>
>>> Otherwise, no chardev will be created.
>>> Quite a lot of IIO devices don't really need a chardev, so this is a minor
>>> improvement to the IIO core, as the IIO device will take up fewer
>>> resources.
>>>
>>> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
>>> ---
>>>
>>> Changelog v1 -> v2:
>>> * split away from series 'iio: core,buffer: re-organize chardev creation';
>>>    i'm getting the feeling that this has some value on it's own;
>>>    no idea if it needs 'Fixes' tag; it is a bit fuzzy to point to a patch
>>>    which this would be fixed by this; i'm guessing it would be fine
>>>    without one
>> I'd argue it's an 'optimization' rather than a fix :)
>>
>> Still looks good to me but I'd like it to sit for a little while to
>> see if anyone points out something we are both missing!
>>
> This is not good.
> It seems that I did not properly test all cases.
> I had to break a device to not have an event_interface to notice that the sysfs
> doesn't get instantiated either because device_add is missing.
>
> Will do another try.

I think you also have to make the `indio_dev->dev.devt = ...` 
conditional. Or conditionally use device_add() instead of device_add_cdev().

If you go for the former you need to call cdev_device_del() 
unconditionally, for the latter call device_del() or cdev_device_del() 
depending on whether the cdev was registered.

- Lars
Alexandru Ardelean April 16, 2020, 7:04 a.m. UTC | #4
On Wed, 2020-04-15 at 16:55 +0200, Lars-Peter Clausen wrote:
> [External]
> 
> On 4/15/20 3:56 PM, Ardelean, Alexandru wrote:
> > On Tue, 2020-04-14 at 19:06 +0100, Jonathan Cameron wrote:
> > > [External]
> > > 
> > > On Tue, 14 Apr 2020 11:36:56 +0300
> > > Alexandru Ardelean <alexandru.ardelean@analog.com> wrote:
> > > 
> > > > The final intent is to localize all buffer ops into the
> > > > industrialio-buffer.c file, to be able to add support for multiple
> > > > buffers
> > > > per IIO device.
> > > > 
> > > > We only need a chardev if we need to support buffers and/or events.
> > > > 
> > > > With this change, a chardev will be created:
> > > > 1. if there is an IIO buffer attached OR
> > > > 2. if there is an event_interface configured
> > > > 
> > > > Otherwise, no chardev will be created.
> > > > Quite a lot of IIO devices don't really need a chardev, so this is a
> > > > minor
> > > > improvement to the IIO core, as the IIO device will take up fewer
> > > > resources.
> > > > 
> > > > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
> > > > ---
> > > > 
> > > > Changelog v1 -> v2:
> > > > * split away from series 'iio: core,buffer: re-organize chardev
> > > > creation';
> > > >    i'm getting the feeling that this has some value on it's own;
> > > >    no idea if it needs 'Fixes' tag; it is a bit fuzzy to point to a
> > > > patch
> > > >    which this would be fixed by this; i'm guessing it would be fine
> > > >    without one
> > > I'd argue it's an 'optimization' rather than a fix :)
> > > 
> > > Still looks good to me but I'd like it to sit for a little while to
> > > see if anyone points out something we are both missing!
> > > 
> > This is not good.
> > It seems that I did not properly test all cases.
> > I had to break a device to not have an event_interface to notice that the
> > sysfs
> > doesn't get instantiated either because device_add is missing.
> > 
> > Will do another try.
> 
> I think you also have to make the `indio_dev->dev.devt = ...` 
> conditional. Or conditionally use device_add() instead of device_add_cdev().
> 
> If you go for the former you need to call cdev_device_del() 
> unconditionally, for the latter call device_del() or cdev_device_del() 
> depending on whether the cdev was registered.

I was thinking of conditionally using cdev_device_add/del() somehow.
But, this complicates the rest of the series a bit.
And I am thinking of how to simplify it.

Anyway, this will go back to the series  ¯\_(ツ)_/¯

> 
> - Lars
> 
>
diff mbox series

Patch

diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
index f4daf19f2a3b..32e72d9fd1e9 100644
--- a/drivers/iio/industrialio-core.c
+++ b/drivers/iio/industrialio-core.c
@@ -1676,6 +1676,15 @@  static int iio_check_unique_scan_index(struct iio_dev *indio_dev)
 
 static const struct iio_buffer_setup_ops noop_ring_setup_ops;
 
+static const struct file_operations iio_event_fileops = {
+	.release = iio_chrdev_release,
+	.open = iio_chrdev_open,
+	.owner = THIS_MODULE,
+	.llseek = noop_llseek,
+	.unlocked_ioctl = iio_ioctl,
+	.compat_ioctl = compat_ptr_ioctl,
+};
+
 int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod)
 {
 	int ret;
@@ -1726,7 +1735,10 @@  int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod)
 		indio_dev->setup_ops == NULL)
 		indio_dev->setup_ops = &noop_ring_setup_ops;
 
-	cdev_init(&indio_dev->chrdev, &iio_buffer_fileops);
+	if (indio_dev->buffer)
+		cdev_init(&indio_dev->chrdev, &iio_buffer_fileops);
+	else if (indio_dev->event_interface)
+		cdev_init(&indio_dev->chrdev, &iio_event_fileops);
 
 	indio_dev->chrdev.owner = this_mod;
 
@@ -1754,7 +1766,8 @@  EXPORT_SYMBOL(__iio_device_register);
  **/
 void iio_device_unregister(struct iio_dev *indio_dev)
 {
-	cdev_device_del(&indio_dev->chrdev, &indio_dev->dev);
+	if (indio_dev->buffer || indio_dev->event_interface)
+		cdev_device_del(&indio_dev->chrdev, &indio_dev->dev);
 
 	mutex_lock(&indio_dev->info_exist_lock);