All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v7 0/6] staging: bcm2835-audio: clean-up coding style issues
@ 2017-03-12 15:38 Aishwarya Pant
  2017-03-12 15:38 ` [PATCH v7 1/6] staging: bcm2835-audio: Replace kmalloc with kzalloc Aishwarya Pant
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Aishwarya Pant @ 2017-03-12 15:38 UTC (permalink / raw)
  To: outreachy-kernel; +Cc: gregkh

[1] Replace kmalloc and memset with kzalloc in vc_vchi_audio_init(..)
[2] Replace null return value with PTR_ERR(..) values
    in vc_vchi_audio_init(..)
[3] Propagate the PTR_ERR values forward instead of a hardcoded
    value for easier debugging in bcm2835_audio_open_connection(..)
[4] Replace if (success) else { } after kmalloc with if(error)
    to fail fast in the work function
[5] De-allocate 'work' when queue_work(..) fails in the work
    functions
[6] De-allocate 'vchi_instance' when VCHI connection fails or VCHI audio
    instance initialisation fails in bcm2835_audio_open_connection()

Changes in v7:
-- Added back the debug log messages in bcm2835_audio_open_connection()
-- Remove label err_free_memory, re-use label err_free_mem to kfree 
   vchi_instance in bcm2835_audio_open_connection()
-- Drop patch 7 which removed BUG_ON(instance). Looks like if(instance) 
   block is WIP, BUG_ON(instance) may be required for debugging in the 
   interim period.

Changes in v6:
-- Add a local variable ret to set error value instead of
  returning -EPERM when initialisation of vchi_audio_service fails
  in bcm2835_audio_open_connection()

Changes in v5:
-- Remove patch which added function names to log messages

Changes in v4:
-- Break-up patch 4 into four smaller patches
-- Add a patch proposing removal of BUG_ON()
-- Make the cover letter verbose

Changes in v3:
-- Fix memory leak when queue_work fails
-- Add __func__ to debug logs

Changes in v2:
-- Return error value -EBUSY instead of -1 when queue_work()
   fails



Aishwarya Pant (6):
  staging: bcm2835-audio: Replace kmalloc with kzalloc
  staging: bcm2835-audio: replace null with error pointer value
  staging: bcm2835-audio: propagate PTR_ERR value instead of -EPERM
  staging: bcm2835-audio: use conditional only for error case
  staging: bcm2835-audio: deallocate work when queue_work(...) fails
  staging: bcm2835-audio: fix memory leak in    
    bcm2835_audio_open_connection()

 .../vc04_services/bcm2835-audio/bcm2835-vchiq.c    | 87 +++++++++++-----------
 1 file changed, 44 insertions(+), 43 deletions(-)

-- 
2.7.4



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

* [PATCH v7 1/6] staging: bcm2835-audio: Replace kmalloc with kzalloc
  2017-03-12 15:38 [PATCH v7 0/6] staging: bcm2835-audio: clean-up coding style issues Aishwarya Pant
@ 2017-03-12 15:38 ` Aishwarya Pant
  2017-03-12 15:39 ` [PATCH v7 2/6] staging: bcm2835-audio: replace null with error pointer value Aishwarya Pant
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Aishwarya Pant @ 2017-03-12 15:38 UTC (permalink / raw)
  To: outreachy-kernel; +Cc: gregkh

Replace kmalloc and memset with kzalloc.

Signed-off-by: Aishwarya Pant <aishpant@gmail.com>
---
 drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
index d8a8e91..66a35ee 100644
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
@@ -290,11 +290,10 @@ vc_vchi_audio_init(VCHI_INSTANCE_T vchi_instance,
 		return NULL;
 	}
 	/* Allocate memory for this instance */
-	instance = kmalloc(sizeof(*instance), GFP_KERNEL);
+	instance = kzalloc(sizeof(*instance), GFP_KERNEL);
 	if (!instance)
 		return NULL;
 
-	memset(instance, 0, sizeof(*instance));
 	instance->num_connections = num_connections;
 
 	/* Create a lock for exclusive, serialized VCHI connection access */
-- 
2.7.4



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

* [PATCH v7 2/6] staging: bcm2835-audio: replace null with error pointer value
  2017-03-12 15:38 [PATCH v7 0/6] staging: bcm2835-audio: clean-up coding style issues Aishwarya Pant
  2017-03-12 15:38 ` [PATCH v7 1/6] staging: bcm2835-audio: Replace kmalloc with kzalloc Aishwarya Pant
@ 2017-03-12 15:39 ` Aishwarya Pant
  2017-03-12 15:39 ` [PATCH v7 3/6] staging: bcm2835-audio: propagate PTR_ERR value instead of -EPERM Aishwarya Pant
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Aishwarya Pant @ 2017-03-12 15:39 UTC (permalink / raw)
  To: outreachy-kernel; +Cc: gregkh

This patch replaces NULL values returned by vc_vchi_audio_init(...) with
error pointer values:
	- Return ERR_PTR(-EINVAL) when too many instances of audio
	  service are initialised
	- Return ERR_PTR(-ENOMEM) when kzalloc fails
	- RETURN ERR_PTR(-EPERM) when vchi connections fail to open

Similarly, a NULL check where vc_vchi_audio_init(...) is called is
replaced by IS_ERR(..)

Signed-off-by: Aishwarya Pant <aishpant@gmail.com>

---
Changes in v6:
	- Add a local variable ret to set error value instead of
	  returning -EPERM when initialisation of vchi_audio_service
          fails
---
 drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
index 66a35ee..d596f43 100644
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
@@ -280,6 +280,7 @@ vc_vchi_audio_init(VCHI_INSTANCE_T vchi_instance,
 	unsigned int i;
 	struct bcm2835_audio_instance *instance;
 	int status;
+	int ret;
 
 	LOG_DBG("%s: start", __func__);
 
@@ -287,12 +288,12 @@ vc_vchi_audio_init(VCHI_INSTANCE_T vchi_instance,
 		LOG_ERR("%s: unsupported number of connections %u (max=%u)\n",
 			__func__, num_connections, VCHI_MAX_NUM_CONNECTIONS);
 
-		return NULL;
+		return ERR_PTR(-EINVAL);
 	}
 	/* Allocate memory for this instance */
 	instance = kzalloc(sizeof(*instance), GFP_KERNEL);
 	if (!instance)
-		return NULL;
+		return ERR_PTR(-ENOMEM);
 
 	instance->num_connections = num_connections;
 
@@ -321,7 +322,7 @@ vc_vchi_audio_init(VCHI_INSTANCE_T vchi_instance,
 		if (status) {
 			LOG_ERR("%s: failed to open VCHI service connection (status=%d)\n",
 				__func__, status);
-
+			ret = -EPERM;
 			goto err_close_services;
 		}
 		/* Finished with the service for now */
@@ -341,7 +342,7 @@ vc_vchi_audio_init(VCHI_INSTANCE_T vchi_instance,
 	kfree(instance);
 	LOG_ERR("%s: error\n", __func__);
 
-	return NULL;
+	return ERR_PTR(ret);
 }
 
 static int vc_vchi_audio_deinit(struct bcm2835_audio_instance *instance)
@@ -432,7 +433,7 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_stream
 	/* Initialize an instance of the audio service */
 	instance = vc_vchi_audio_init(vchi_instance, &vchi_connection, 1);
 
-	if (!instance) {
+	if (IS_ERR(instance)) {
 		LOG_ERR("%s: failed to initialize audio service\n", __func__);
 
 		ret = -EPERM;
-- 
2.7.4



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

* [PATCH v7 3/6] staging: bcm2835-audio: propagate PTR_ERR value instead of -EPERM
  2017-03-12 15:38 [PATCH v7 0/6] staging: bcm2835-audio: clean-up coding style issues Aishwarya Pant
  2017-03-12 15:38 ` [PATCH v7 1/6] staging: bcm2835-audio: Replace kmalloc with kzalloc Aishwarya Pant
  2017-03-12 15:39 ` [PATCH v7 2/6] staging: bcm2835-audio: replace null with error pointer value Aishwarya Pant
@ 2017-03-12 15:39 ` Aishwarya Pant
  2017-03-12 15:39 ` [PATCH v7 4/6] staging: bcm2835-audio: use conditional only for error case Aishwarya Pant
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Aishwarya Pant @ 2017-03-12 15:39 UTC (permalink / raw)
  To: outreachy-kernel; +Cc: gregkh

It is better to propagate PTR_ERR value instead of a hardcoded value
(-EPERM here)

Signed-off-by: Aishwarya Pant <aishpant@gmail.com>
---
 drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
index d596f43..698fdff 100644
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
@@ -436,7 +436,7 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_stream
 	if (IS_ERR(instance)) {
 		LOG_ERR("%s: failed to initialize audio service\n", __func__);
 
-		ret = -EPERM;
+		ret = PTR_ERR(instance);
 		goto err_free_mem;
 	}
 
-- 
2.7.4



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

* [PATCH v7 4/6] staging: bcm2835-audio: use conditional only for error case
  2017-03-12 15:38 [PATCH v7 0/6] staging: bcm2835-audio: clean-up coding style issues Aishwarya Pant
                   ` (2 preceding siblings ...)
  2017-03-12 15:39 ` [PATCH v7 3/6] staging: bcm2835-audio: propagate PTR_ERR value instead of -EPERM Aishwarya Pant
@ 2017-03-12 15:39 ` Aishwarya Pant
  2017-03-12 15:39 ` [PATCH v7 5/6] staging: bcm2835-audio: deallocate work when queue_work(...) fails Aishwarya Pant
  2017-03-12 15:40 ` [PATCH v7 6/6] staging: bcm2835-audio: fix memory leak in bcm2835_audio_open_connection() Aishwarya Pant
  5 siblings, 0 replies; 7+ messages in thread
From: Aishwarya Pant @ 2017-03-12 15:39 UTC (permalink / raw)
  To: outreachy-kernel; +Cc: gregkh

* Refactor conditional to check if memory allocation has failed and
immediately return (-ENOMEM); if block for success case is removed.

* Return the error value -EBUSY when queue_work() fails.

Signed-off-by: Aishwarya Pant <aishpant@gmail.com>

---
Changes in v4:
	- Break up the patch into smaller changes
Changes in v3:
	- Deallocate work when queue_work fails
	- Add __func__ to debug logs
Changes in v2:
	- Return error value -EBUSY when queue_work fails
---
 .../vc04_services/bcm2835-audio/bcm2835-vchiq.c    | 67 +++++++++++-----------
 1 file changed, 32 insertions(+), 35 deletions(-)

diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
index 698fdff..6feb1a6 100644
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
@@ -131,77 +131,74 @@ static void my_wq_function(struct work_struct *work)
 
 int bcm2835_audio_start(struct bcm2835_alsa_stream *alsa_stream)
 {
-	int ret = -1;
-
 	LOG_DBG(" .. IN\n");
 	if (alsa_stream->my_wq) {
 		struct bcm2835_audio_work *work;
 
 		work = kmalloc(sizeof(*work), GFP_ATOMIC);
 		/*--- Queue some work (item 1) ---*/
-		if (work) {
-			INIT_WORK(&work->my_work, my_wq_function);
-			work->alsa_stream = alsa_stream;
-			work->cmd = BCM2835_AUDIO_START;
-			if (queue_work(alsa_stream->my_wq, &work->my_work))
-				ret = 0;
-		} else {
+		if (!work) {
 			LOG_ERR(" .. Error: NULL work kmalloc\n");
+			return -ENOMEM;
+		}
+		INIT_WORK(&work->my_work, my_wq_function);
+		work->alsa_stream = alsa_stream;
+		work->cmd = BCM2835_AUDIO_START;
+		if (!queue_work(alsa_stream->my_wq, &work->my_work)) {
+			return -EBUSY;
 		}
 	}
-	LOG_DBG(" .. OUT %d\n", ret);
-	return ret;
+	LOG_DBG(" .. OUT\n");
+	return 0;
 }
 
 int bcm2835_audio_stop(struct bcm2835_alsa_stream *alsa_stream)
 {
-	int ret = -1;
-
 	LOG_DBG(" .. IN\n");
 	if (alsa_stream->my_wq) {
 		struct bcm2835_audio_work *work;
 
 		work = kmalloc(sizeof(*work), GFP_ATOMIC);
 		/*--- Queue some work (item 1) ---*/
-		if (work) {
-			INIT_WORK(&work->my_work, my_wq_function);
-			work->alsa_stream = alsa_stream;
-			work->cmd = BCM2835_AUDIO_STOP;
-			if (queue_work(alsa_stream->my_wq, &work->my_work))
-				ret = 0;
-		} else {
+		if (!work) {
 			LOG_ERR(" .. Error: NULL work kmalloc\n");
+			return -ENOMEM;
+		}
+		INIT_WORK(&work->my_work, my_wq_function);
+		work->alsa_stream = alsa_stream;
+		work->cmd = BCM2835_AUDIO_STOP;
+		if (!queue_work(alsa_stream->my_wq, &work->my_work)) {
+			return -EBUSY;
 		}
 	}
-	LOG_DBG(" .. OUT %d\n", ret);
-	return ret;
+	LOG_DBG(" .. OUT\n");
+	return 0;
 }
 
 int bcm2835_audio_write(struct bcm2835_alsa_stream *alsa_stream,
 			unsigned int count, void *src)
 {
-	int ret = -1;
-
 	LOG_DBG(" .. IN\n");
 	if (alsa_stream->my_wq) {
 		struct bcm2835_audio_work *work;
 
 		work = kmalloc(sizeof(*work), GFP_ATOMIC);
 		/*--- Queue some work (item 1) ---*/
-		if (work) {
-			INIT_WORK(&work->my_work, my_wq_function);
-			work->alsa_stream = alsa_stream;
-			work->cmd = BCM2835_AUDIO_WRITE;
-			work->src = src;
-			work->count = count;
-			if (queue_work(alsa_stream->my_wq, &work->my_work))
-				ret = 0;
-		} else {
+		if (!work) {
 			LOG_ERR(" .. Error: NULL work kmalloc\n");
+			return -ENOMEM;
+		}
+		INIT_WORK(&work->my_work, my_wq_function);
+		work->alsa_stream = alsa_stream;
+		work->cmd = BCM2835_AUDIO_WRITE;
+		work->src = src;
+		work->count = count;
+		if (!queue_work(alsa_stream->my_wq, &work->my_work)) {
+			return -EBUSY;
 		}
 	}
-	LOG_DBG(" .. OUT %d\n", ret);
-	return ret;
+	LOG_DBG(" .. OUT\n");
+	return 0;
 }
 
 static void my_workqueue_init(struct bcm2835_alsa_stream *alsa_stream)
-- 
2.7.4



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

* [PATCH v7 5/6] staging: bcm2835-audio: deallocate work when queue_work(...) fails
  2017-03-12 15:38 [PATCH v7 0/6] staging: bcm2835-audio: clean-up coding style issues Aishwarya Pant
                   ` (3 preceding siblings ...)
  2017-03-12 15:39 ` [PATCH v7 4/6] staging: bcm2835-audio: use conditional only for error case Aishwarya Pant
@ 2017-03-12 15:39 ` Aishwarya Pant
  2017-03-12 15:40 ` [PATCH v7 6/6] staging: bcm2835-audio: fix memory leak in bcm2835_audio_open_connection() Aishwarya Pant
  5 siblings, 0 replies; 7+ messages in thread
From: Aishwarya Pant @ 2017-03-12 15:39 UTC (permalink / raw)
  To: outreachy-kernel; +Cc: gregkh

This patch de-allocates work when queue_work(..) fails in the
bcm2835-audio work functions

Signed-off-by: Aishwarya Pant <aishpant@gmail.com>
---
 drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
index 6feb1a6..af16d0f 100644
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
@@ -145,6 +145,7 @@ int bcm2835_audio_start(struct bcm2835_alsa_stream *alsa_stream)
 		work->alsa_stream = alsa_stream;
 		work->cmd = BCM2835_AUDIO_START;
 		if (!queue_work(alsa_stream->my_wq, &work->my_work)) {
+			kfree(work);
 			return -EBUSY;
 		}
 	}
@@ -168,6 +169,7 @@ int bcm2835_audio_stop(struct bcm2835_alsa_stream *alsa_stream)
 		work->alsa_stream = alsa_stream;
 		work->cmd = BCM2835_AUDIO_STOP;
 		if (!queue_work(alsa_stream->my_wq, &work->my_work)) {
+			kfree(work);
 			return -EBUSY;
 		}
 	}
@@ -194,6 +196,7 @@ int bcm2835_audio_write(struct bcm2835_alsa_stream *alsa_stream,
 		work->src = src;
 		work->count = count;
 		if (!queue_work(alsa_stream->my_wq, &work->my_work)) {
+			kfree(work);
 			return -EBUSY;
 		}
 	}
-- 
2.7.4



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

* [PATCH v7 6/6] staging: bcm2835-audio: fix memory leak in bcm2835_audio_open_connection()
  2017-03-12 15:38 [PATCH v7 0/6] staging: bcm2835-audio: clean-up coding style issues Aishwarya Pant
                   ` (4 preceding siblings ...)
  2017-03-12 15:39 ` [PATCH v7 5/6] staging: bcm2835-audio: deallocate work when queue_work(...) fails Aishwarya Pant
@ 2017-03-12 15:40 ` Aishwarya Pant
  5 siblings, 0 replies; 7+ messages in thread
From: Aishwarya Pant @ 2017-03-12 15:40 UTC (permalink / raw)
  To: outreachy-kernel

In bcm2835_audio_open_connection(), if VCHI connection fails or
initialisation of VCHI audio instance fails vchi_instance needs to be
deallocated otherwise it will cause a memory leak.

Signed-off-by: Aishwarya Pant <aishpant@gmail.com>

---
Changes in v7:
	-Remove label err_free_memory, re-use err_free_mem
	-Add back the debug logs

I have added kfree(vchi_instance) under label err_free_mem. I understand
that even if vchi_instance is null kfree() would not break.
---
 drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
index af16d0f..6e007db 100644
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
@@ -446,6 +446,7 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_stream
 	LOG_DBG(" success !\n");
 	ret = 0;
 err_free_mem:
+	kfree(vchi_instance);
 	LOG_DBG(" .. OUT\n");
 
 	return ret;
-- 
2.7.4



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

end of thread, other threads:[~2017-03-12 15:40 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-12 15:38 [PATCH v7 0/6] staging: bcm2835-audio: clean-up coding style issues Aishwarya Pant
2017-03-12 15:38 ` [PATCH v7 1/6] staging: bcm2835-audio: Replace kmalloc with kzalloc Aishwarya Pant
2017-03-12 15:39 ` [PATCH v7 2/6] staging: bcm2835-audio: replace null with error pointer value Aishwarya Pant
2017-03-12 15:39 ` [PATCH v7 3/6] staging: bcm2835-audio: propagate PTR_ERR value instead of -EPERM Aishwarya Pant
2017-03-12 15:39 ` [PATCH v7 4/6] staging: bcm2835-audio: use conditional only for error case Aishwarya Pant
2017-03-12 15:39 ` [PATCH v7 5/6] staging: bcm2835-audio: deallocate work when queue_work(...) fails Aishwarya Pant
2017-03-12 15:40 ` [PATCH v7 6/6] staging: bcm2835-audio: fix memory leak in bcm2835_audio_open_connection() Aishwarya Pant

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.