diff mbox series

[2/2] ASoC: pcm: update module refcount if module_get_upon_open is set

Message ID 20190405030655.13144-2-ranjani.sridharan@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series [1/2] ASoC: core: conditionally increase module refcount on component open | expand

Commit Message

Ranjani Sridharan April 5, 2019, 3:06 a.m. UTC
Setting the module_get_upon_open field for component driver
prevents the module refcount from being incremented during
component probe(). This could lead to the module being
allowed to be unloaded when a pcm stream is open. So,
if this field is set, the module's refcount should be
incremented during pcm open to prevent module removal
when the component is in use. And, the refcount should
be decremented upon pcm close.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
---
 sound/soc/soc-pcm.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Comments

Ranjani Sridharan April 5, 2019, 4:59 p.m. UTC | #1
On Thu, 2019-04-04 at 20:06 -0700, Ranjani Sridharan wrote:
> Setting the module_get_upon_open field for component driver
> prevents the module refcount from being incremented during
> component probe(). This could lead to the module being
> allowed to be unloaded when a pcm stream is open. So,
> if this field is set, the module's refcount should be
> incremented during pcm open to prevent module removal
> when the component is in use. And, the refcount should
> be decremented upon pcm close.
> 
> Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
> ---
>  sound/soc/soc-pcm.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
> index 7fe5321000e8..d84a9a5b14c0 100644
> --- a/sound/soc/soc-pcm.c
> +++ b/sound/soc/soc-pcm.c
> @@ -15,6 +15,7 @@
>  #include <linux/delay.h>
>  #include <linux/pinctrl/consumer.h>
>  #include <linux/pm_runtime.h>
> +#include <linux/module.h>
>  #include <linux/slab.h>
>  #include <linux/workqueue.h>
>  #include <linux/export.h>
> @@ -463,6 +464,9 @@ static int soc_pcm_components_close(struct
> snd_pcm_substream *substream,
>  			continue;
>  
>  		component->driver->ops->close(substream);
> +
> +		if (component->driver->module_get_upon_open)
> +			module_put(component->dev->driver->owner);
I made a minor fix to align the code similar to the one in soc-core.
I've sent a V2 version of the patch set with the fix. Sorry about the
noise.

Thanks,
Ranjani
>  	}
>  
>  	return 0;
> @@ -513,6 +517,10 @@ static int soc_pcm_open(struct snd_pcm_substream
> *substream)
>  		    !component->driver->ops->open)
>  			continue;
>  
> +		if (component->driver->module_get_upon_open)
> +			if (!try_module_get(component->dev->driver-
> >owner))
> +				return -ENODEV;
> +
>  		ret = component->driver->ops->open(substream);
>  		if (ret < 0) {
>  			dev_err(component->dev,
diff mbox series

Patch

diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index 7fe5321000e8..d84a9a5b14c0 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -15,6 +15,7 @@ 
 #include <linux/delay.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/pm_runtime.h>
+#include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/workqueue.h>
 #include <linux/export.h>
@@ -463,6 +464,9 @@  static int soc_pcm_components_close(struct snd_pcm_substream *substream,
 			continue;
 
 		component->driver->ops->close(substream);
+
+		if (component->driver->module_get_upon_open)
+			module_put(component->dev->driver->owner);
 	}
 
 	return 0;
@@ -513,6 +517,10 @@  static int soc_pcm_open(struct snd_pcm_substream *substream)
 		    !component->driver->ops->open)
 			continue;
 
+		if (component->driver->module_get_upon_open)
+			if (!try_module_get(component->dev->driver->owner))
+				return -ENODEV;
+
 		ret = component->driver->ops->open(substream);
 		if (ret < 0) {
 			dev_err(component->dev,