Re: [PATCH V5 3/4] misc/pvpanic: Avoid initializing multiple pvpanic devices

2019-02-16 Thread Andy Shevchenko
On Sat, Feb 16, 2019 at 10:29 AM Peng Hao  wrote:
>
> Avoid initializing multiple pvpanic devices when configure multiple
> pvpanic device driver type. Make sure that only one pvpanic device
> is working.
>
> Signed-off-by: Peng Hao 
> ---
>  drivers/misc/pvpanic/pvpanic.c | 13 -
>  1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/misc/pvpanic/pvpanic.c b/drivers/misc/pvpanic/pvpanic.c
> index ccadec0..fbb5038 100644
> --- a/drivers/misc/pvpanic/pvpanic.c
> +++ b/drivers/misc/pvpanic/pvpanic.c
> @@ -15,10 +15,13 @@
>  #include 
>
>  static struct {
> +   struct mutex lock;
> struct platform_device *pdev;
> void __iomem *base;
> bool is_ioport;
> -} pvpanic_data;
> +} pvpanic_data = {
> +   .lock = __MUTEX_INITIALIZER(pvpanic_data.lock),
> +};
>
>  #define PVPANIC_PANICKED(1 << 0)
>
> @@ -50,6 +53,12 @@ int pvpanic_add_device(struct device *dev, struct resource 
> *res)
> struct platform_device *pdev;
> int ret;
>
> +   mutex_lock(_data.lock);
> +   if (pvpanic_data.pdev) {
> +   mutex_unlock(_data.lock);
> +   return -EEXIST;
> +   }
> +
> pdev = platform_device_alloc("pvpanic", -1);
> if (!pdev)
> return -ENOMEM;
> @@ -64,9 +73,11 @@ int pvpanic_add_device(struct device *dev, struct resource 
> *res)
> if (ret)
> goto err;
> pvpanic_data.pdev = pdev;

OK, mutex basically protects pdev member in pvpanic_data. What about
->remove() stage?

> +   mutex_unlock(_data.lock);
>
> return 0;
>  err:
> +   mutex_unlock(_data.lock);
> platform_device_put(pdev);
> return ret;
>  }
> --
> 1.8.3.1
>


-- 
With Best Regards,
Andy Shevchenko


[PATCH V5 3/4] misc/pvpanic: Avoid initializing multiple pvpanic devices

2019-02-16 Thread Peng Hao
Avoid initializing multiple pvpanic devices when configure multiple
pvpanic device driver type. Make sure that only one pvpanic device
is working.

Signed-off-by: Peng Hao 
---
 drivers/misc/pvpanic/pvpanic.c | 13 -
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/misc/pvpanic/pvpanic.c b/drivers/misc/pvpanic/pvpanic.c
index ccadec0..fbb5038 100644
--- a/drivers/misc/pvpanic/pvpanic.c
+++ b/drivers/misc/pvpanic/pvpanic.c
@@ -15,10 +15,13 @@
 #include 
 
 static struct {
+   struct mutex lock;
struct platform_device *pdev;
void __iomem *base;
bool is_ioport;
-} pvpanic_data;
+} pvpanic_data = {
+   .lock = __MUTEX_INITIALIZER(pvpanic_data.lock),
+};
 
 #define PVPANIC_PANICKED(1 << 0)
 
@@ -50,6 +53,12 @@ int pvpanic_add_device(struct device *dev, struct resource 
*res)
struct platform_device *pdev;
int ret;
 
+   mutex_lock(_data.lock);
+   if (pvpanic_data.pdev) {
+   mutex_unlock(_data.lock);
+   return -EEXIST;
+   }
+
pdev = platform_device_alloc("pvpanic", -1);
if (!pdev)
return -ENOMEM;
@@ -64,9 +73,11 @@ int pvpanic_add_device(struct device *dev, struct resource 
*res)
if (ret)
goto err;
pvpanic_data.pdev = pdev;
+   mutex_unlock(_data.lock);
 
return 0;
 err:
+   mutex_unlock(_data.lock);
platform_device_put(pdev);
return ret;
 }
-- 
1.8.3.1