linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] [media] s5p-mfc: Fixes for issues when module is removed
@ 2016-05-03 20:27 Javier Martinez Canillas
  2016-05-03 20:27 ` [PATCH 1/3] [media] s5p-mfc: Set device name for reserved memory region devs Javier Martinez Canillas
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Javier Martinez Canillas @ 2016-05-03 20:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: Marek Szyprowski, Krzysztof Kozlowski, Javier Martinez Canillas,
	Mauro Carvalho Chehab, Kamil Debski, Jeongtae Park,
	Kyungmin Park, stable, linux-arm-kernel, linux-media

Hello,

This patch series fixes some issues that I noticed when trying to remove
the s5p-mfc driver when built as a module.

Some of these issues will be fixed once Marek's patches to convert the
custom memory region reservation code is replaced by a generic one that
supports named memory region reservation [0]. But the fixes are trivial
so we can fix the current code until his rework patch lands.

[0]: https://patchwork.linuxtv.org/patch/32287/

Best regards,
Javier


Javier Martinez Canillas (3):
  [media] s5p-mfc: Set device name for reserved memory region devs
  [media] s5p-mfc: Add release callback for memory region devs
  [media] s5p-mfc: Fix race between s5p_mfc_probe() and s5p_mfc_open()

 drivers/media/platform/s5p-mfc/s5p_mfc.c | 50 ++++++++++++++++++++------------
 1 file changed, 32 insertions(+), 18 deletions(-)

-- 
2.5.5

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/3] [media] s5p-mfc: Set device name for reserved memory region devs
  2016-05-03 20:27 [PATCH 0/3] [media] s5p-mfc: Fixes for issues when module is removed Javier Martinez Canillas
@ 2016-05-03 20:27 ` Javier Martinez Canillas
  2016-05-03 20:27 ` [PATCH 2/3] [media] s5p-mfc: Add release callback for " Javier Martinez Canillas
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Javier Martinez Canillas @ 2016-05-03 20:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: Marek Szyprowski, Krzysztof Kozlowski, Javier Martinez Canillas,
	stable, Mauro Carvalho Chehab, Kamil Debski, Jeongtae Park,
	Kyungmin Park, linux-arm-kernel, linux-media

The devices don't have a name set, so makes dev_name() returns NULL which
makes harder to identify the devices that are causing issues, for example:

WARNING: CPU: 2 PID: 616 at drivers/base/core.c:251 device_release+0x8c/0x90
Device '(null)' does not have a release() function, it is broken and must be fixed.

And after setting the device name:

WARNING: CPU: 0 PID: 591 at drivers/base/core.c:251 device_release+0x8c/0x90
Device 's5p-mfc-l' does not have a release() function, it is broken and must be fixed.

Cc: <stable@vger.kernel.org>
Fixes: 6e83e6e25eb4 ("[media] s5p-mfc: Fix kernel warning on memory init")
Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>

---

 drivers/media/platform/s5p-mfc/s5p_mfc.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c
index b16466fe35ee..8fc1fd4ee2ed 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c
@@ -1062,6 +1062,8 @@ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev)
 		mfc_err("Not enough memory\n");
 		return -ENOMEM;
 	}
+
+	dev_set_name(dev->mem_dev_l, "%s", "s5p-mfc-l");
 	device_initialize(dev->mem_dev_l);
 	of_property_read_u32_array(dev->plat_dev->dev.of_node,
 			"samsung,mfc-l", mem_info, 2);
@@ -1079,6 +1081,8 @@ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev)
 		mfc_err("Not enough memory\n");
 		return -ENOMEM;
 	}
+
+	dev_set_name(dev->mem_dev_r, "%s", "s5p-mfc-r");
 	device_initialize(dev->mem_dev_r);
 	of_property_read_u32_array(dev->plat_dev->dev.of_node,
 			"samsung,mfc-r", mem_info, 2);
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/3] [media] s5p-mfc: Add release callback for memory region devs
  2016-05-03 20:27 [PATCH 0/3] [media] s5p-mfc: Fixes for issues when module is removed Javier Martinez Canillas
  2016-05-03 20:27 ` [PATCH 1/3] [media] s5p-mfc: Set device name for reserved memory region devs Javier Martinez Canillas
@ 2016-05-03 20:27 ` Javier Martinez Canillas
  2016-05-03 20:27 ` [PATCH 3/3] [media] s5p-mfc: Fix race between s5p_mfc_probe() and s5p_mfc_open() Javier Martinez Canillas
  2016-05-24 10:22 ` [PATCH 0/3] [media] s5p-mfc: Fixes for issues when module is removed Marek Szyprowski
  3 siblings, 0 replies; 5+ messages in thread
From: Javier Martinez Canillas @ 2016-05-03 20:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: Marek Szyprowski, Krzysztof Kozlowski, Javier Martinez Canillas,
	stable, Mauro Carvalho Chehab, Kamil Debski, Jeongtae Park,
	Kyungmin Park, linux-arm-kernel, linux-media

When s5p_mfc_remove() calls put_device() for the reserved memory region
devs, the driver core warns that the dev doesn't have a release callback:

WARNING: CPU: 0 PID: 591 at drivers/base/core.c:251 device_release+0x8c/0x90
Device 's5p-mfc-l' does not have a release() function, it is broken and must be fixed.

Also, the declared DMA memory using dma_declare_coherent_memory() isn't
relased so add a dev .release that calls dma_release_declared_memory().

Cc: <stable@vger.kernel.org>
Fixes: 6e83e6e25eb4 ("[media] s5p-mfc: Fix kernel warning on memory init")
Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>

---

 drivers/media/platform/s5p-mfc/s5p_mfc.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c
index 8fc1fd4ee2ed..beb4fd5bd326 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c
@@ -1050,6 +1050,11 @@ static int match_child(struct device *dev, void *data)
 	return !strcmp(dev_name(dev), (char *)data);
 }
 
+static void s5p_mfc_memdev_release(struct device *dev)
+{
+	dma_release_declared_memory(dev);
+}
+
 static void *mfc_get_drv_data(struct platform_device *pdev);
 
 static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev)
@@ -1064,6 +1069,7 @@ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev)
 	}
 
 	dev_set_name(dev->mem_dev_l, "%s", "s5p-mfc-l");
+	dev->mem_dev_l->release = s5p_mfc_memdev_release;
 	device_initialize(dev->mem_dev_l);
 	of_property_read_u32_array(dev->plat_dev->dev.of_node,
 			"samsung,mfc-l", mem_info, 2);
@@ -1083,6 +1089,7 @@ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev)
 	}
 
 	dev_set_name(dev->mem_dev_r, "%s", "s5p-mfc-r");
+	dev->mem_dev_r->release = s5p_mfc_memdev_release;
 	device_initialize(dev->mem_dev_r);
 	of_property_read_u32_array(dev->plat_dev->dev.of_node,
 			"samsung,mfc-r", mem_info, 2);
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/3] [media] s5p-mfc: Fix race between s5p_mfc_probe() and s5p_mfc_open()
  2016-05-03 20:27 [PATCH 0/3] [media] s5p-mfc: Fixes for issues when module is removed Javier Martinez Canillas
  2016-05-03 20:27 ` [PATCH 1/3] [media] s5p-mfc: Set device name for reserved memory region devs Javier Martinez Canillas
  2016-05-03 20:27 ` [PATCH 2/3] [media] s5p-mfc: Add release callback for " Javier Martinez Canillas
@ 2016-05-03 20:27 ` Javier Martinez Canillas
  2016-05-24 10:22 ` [PATCH 0/3] [media] s5p-mfc: Fixes for issues when module is removed Marek Szyprowski
  3 siblings, 0 replies; 5+ messages in thread
From: Javier Martinez Canillas @ 2016-05-03 20:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: Marek Szyprowski, Krzysztof Kozlowski, Javier Martinez Canillas,
	Mauro Carvalho Chehab, Kamil Debski, Jeongtae Park,
	Kyungmin Park, linux-arm-kernel, linux-media

The s5p_mfc_probe() function registers the video devices before all the
resources needed by s5p_mfc_open() are correctly initalized.

So if s5p_mfc_open() function is called before s5p_mfc_probe() finishes
(since the video dev is already registered), a NULL pointer dereference
will happen due s5p_mfc_open() accessing uninitialized vars such as the
struct s5p_mfc_dev .watchdog_timer and .mfc_ops fields.

An example is following BUG caused by add_timer() getting a NULL pointer:

[   45.765374] kernel BUG at kernel/time/timer.c:790!
[   45.765381] Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM
...
[   45.766149] [<c016fdf4>] (mod_timer) from [<bf181d18>] (s5p_mfc_open+0x274/0x4d4 [s5p_mfc])
[   45.766416] [<bf181d18>] (s5p_mfc_open [s5p_mfc]) from [<bf0214a0>] (v4l2_open+0x9c/0x100 [videodev])
[   45.766547] [<bf0214a0>] (v4l2_open [videodev]) from [<c01e355c>] (chrdev_open+0x9c/0x178)
[   45.766575] [<c01e355c>] (chrdev_open) from [<c01dceb4>] (do_dentry_open+0x1e0/0x300)
[   45.766595] [<c01dceb4>] (do_dentry_open) from [<c01ec2f0>] (path_openat+0x800/0x10d4)
[   45.766610] [<c01ec2f0>] (path_openat) from [<c01ed8b8>] (do_filp_open+0x5c/0xc0)
[   45.766624] [<c01ed8b8>] (do_filp_open) from [<c01de218>] (do_sys_open+0x10c/0x1bc)
[   45.766642] [<c01de218>] (do_sys_open) from [<c01078c0>] (ret_fast_syscall+0x0/0x3c)
[   45.766655] Code: eaffffe3 e3a00001 e28dd008 e8bd81f0 (e7f001f2)

Fix it by registering the video devs as the last step in s5p_mfc_probe().

Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>

---

 drivers/media/platform/s5p-mfc/s5p_mfc.c | 39 +++++++++++++++++---------------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c
index beb4fd5bd326..501d822cad6b 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c
@@ -1212,14 +1212,6 @@ static int s5p_mfc_probe(struct platform_device *pdev)
 	vfd->vfl_dir	= VFL_DIR_M2M;
 	snprintf(vfd->name, sizeof(vfd->name), "%s", S5P_MFC_DEC_NAME);
 	dev->vfd_dec	= vfd;
-	ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
-	if (ret) {
-		v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
-		video_device_release(vfd);
-		goto err_dec_reg;
-	}
-	v4l2_info(&dev->v4l2_dev,
-		  "decoder registered as /dev/video%d\n", vfd->num);
 	video_set_drvdata(vfd, dev);
 
 	/* encoder */
@@ -1237,14 +1229,6 @@ static int s5p_mfc_probe(struct platform_device *pdev)
 	vfd->vfl_dir	= VFL_DIR_M2M;
 	snprintf(vfd->name, sizeof(vfd->name), "%s", S5P_MFC_ENC_NAME);
 	dev->vfd_enc	= vfd;
-	ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
-	if (ret) {
-		v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
-		video_device_release(vfd);
-		goto err_enc_reg;
-	}
-	v4l2_info(&dev->v4l2_dev,
-		  "encoder registered as /dev/video%d\n", vfd->num);
 	video_set_drvdata(vfd, dev);
 	platform_set_drvdata(pdev, dev);
 
@@ -1261,15 +1245,34 @@ static int s5p_mfc_probe(struct platform_device *pdev)
 	s5p_mfc_init_hw_cmds(dev);
 	s5p_mfc_init_regs(dev);
 
+	/* Register decoder and encoder */
+	ret = video_register_device(dev->vfd_dec, VFL_TYPE_GRABBER, 0);
+	if (ret) {
+		v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
+		video_device_release(dev->vfd_dec);
+		goto err_dec_reg;
+	}
+	v4l2_info(&dev->v4l2_dev,
+		  "decoder registered as /dev/video%d\n", dev->vfd_dec->num);
+
+	ret = video_register_device(dev->vfd_enc, VFL_TYPE_GRABBER, 0);
+	if (ret) {
+		v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
+		video_device_release(dev->vfd_enc);
+		goto err_enc_reg;
+	}
+	v4l2_info(&dev->v4l2_dev,
+		  "encoder registered as /dev/video%d\n", dev->vfd_enc->num);
+
 	pr_debug("%s--\n", __func__);
 	return 0;
 
 /* Deinit MFC if probe had failed */
 err_enc_reg:
-	video_device_release(dev->vfd_enc);
-err_enc_alloc:
 	video_unregister_device(dev->vfd_dec);
 err_dec_reg:
+	video_device_release(dev->vfd_enc);
+err_enc_alloc:
 	video_device_release(dev->vfd_dec);
 err_dec_alloc:
 	v4l2_device_unregister(&dev->v4l2_dev);
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 0/3] [media] s5p-mfc: Fixes for issues when module is removed
  2016-05-03 20:27 [PATCH 0/3] [media] s5p-mfc: Fixes for issues when module is removed Javier Martinez Canillas
                   ` (2 preceding siblings ...)
  2016-05-03 20:27 ` [PATCH 3/3] [media] s5p-mfc: Fix race between s5p_mfc_probe() and s5p_mfc_open() Javier Martinez Canillas
@ 2016-05-24 10:22 ` Marek Szyprowski
  3 siblings, 0 replies; 5+ messages in thread
From: Marek Szyprowski @ 2016-05-24 10:22 UTC (permalink / raw)
  To: Javier Martinez Canillas, linux-kernel
  Cc: Krzysztof Kozlowski, Mauro Carvalho Chehab, Kamil Debski,
	Jeongtae Park, Kyungmin Park, stable, linux-arm-kernel,
	linux-media

Hello,


On 2016-05-03 22:27, Javier Martinez Canillas wrote:
> Hello,
>
> This patch series fixes some issues that I noticed when trying to remove
> the s5p-mfc driver when built as a module.
>
> Some of these issues will be fixed once Marek's patches to convert the
> custom memory region reservation code is replaced by a generic one that
> supports named memory region reservation [0]. But the fixes are trivial
> so we can fix the current code until his rework patch lands.

For the whole series:

Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>

Please queue it as fixes to v4.7-rcX.

>
> [0]: https://patchwork.linuxtv.org/patch/32287/
>
> Best regards,
> Javier
>
>
> Javier Martinez Canillas (3):
>    [media] s5p-mfc: Set device name for reserved memory region devs
>    [media] s5p-mfc: Add release callback for memory region devs
>    [media] s5p-mfc: Fix race between s5p_mfc_probe() and s5p_mfc_open()
>
>   drivers/media/platform/s5p-mfc/s5p_mfc.c | 50 ++++++++++++++++++++------------
>   1 file changed, 32 insertions(+), 18 deletions(-)
>

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-05-24 10:22 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-03 20:27 [PATCH 0/3] [media] s5p-mfc: Fixes for issues when module is removed Javier Martinez Canillas
2016-05-03 20:27 ` [PATCH 1/3] [media] s5p-mfc: Set device name for reserved memory region devs Javier Martinez Canillas
2016-05-03 20:27 ` [PATCH 2/3] [media] s5p-mfc: Add release callback for " Javier Martinez Canillas
2016-05-03 20:27 ` [PATCH 3/3] [media] s5p-mfc: Fix race between s5p_mfc_probe() and s5p_mfc_open() Javier Martinez Canillas
2016-05-24 10:22 ` [PATCH 0/3] [media] s5p-mfc: Fixes for issues when module is removed Marek Szyprowski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).