* [PATCH V2] staging: wilc1000: wilc_msgqueue.c : remove the goto ERRORHANDER @ 2015-10-14 5:55 Tony Cho 2015-10-14 8:32 ` Mike Rapoport 0 siblings, 1 reply; 6+ messages in thread From: Tony Cho @ 2015-10-14 5:55 UTC (permalink / raw) To: gregkh Cc: devel, linux-wireless, johnny.kim, chris.park, rachel.kim, tony.cho, glen.lee, leo.kim, austin.shin, adel.noureldin, adham.abozaeid, Nicolas.FERRE From: Leo Kim <leo.kim@atmel.com> This patch removes goto ERRORHANDER and the result variable in wilc_mq_send. Then, the error type is directly returned. If normal operation, freeing memory is not needed in this function. If an error occurs, returns an error after releasing the spin lock. Signed-off-by: Leo Kim <leo.kim@atmel.com> Signed-off-by: Tony Cho <tony.cho@atmel.com> --- V2: add releasing spinlock before returnig an error when an error happens. --- drivers/staging/wilc1000/wilc_msgqueue.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/drivers/staging/wilc1000/wilc_msgqueue.c b/drivers/staging/wilc1000/wilc_msgqueue.c index b13809a..4dfd476 100644 --- a/drivers/staging/wilc1000/wilc_msgqueue.c +++ b/drivers/staging/wilc1000/wilc_msgqueue.c @@ -56,35 +56,38 @@ int wilc_mq_destroy(WILC_MsgQueueHandle *pHandle) int wilc_mq_send(WILC_MsgQueueHandle *pHandle, const void *pvSendBuffer, u32 u32SendBufferSize) { - int result = 0; unsigned long flags; Message *pstrMessage = NULL; if ((!pHandle) || (u32SendBufferSize == 0) || (!pvSendBuffer)) { PRINT_ER("pHandle or pvSendBuffer is null\n"); - result = -EFAULT; - goto ERRORHANDLER; + return -EFAULT; } if (pHandle->bExiting) { PRINT_ER("pHandle fail\n"); - result = -EFAULT; - goto ERRORHANDLER; + return -EFAULT; } spin_lock_irqsave(&pHandle->strCriticalSection, flags); /* construct a new message */ pstrMessage = kmalloc(sizeof(Message), GFP_ATOMIC); - if (!pstrMessage) + + if (!pstrMessage) { + spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); return -ENOMEM; + } + pstrMessage->u32Length = u32SendBufferSize; pstrMessage->pstrNext = NULL; pstrMessage->pvBuffer = kmemdup(pvSendBuffer, u32SendBufferSize, GFP_ATOMIC); + if (!pstrMessage->pvBuffer) { - result = -ENOMEM; - goto ERRORHANDLER; + spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); + kfree(pstrMessage); + return -ENOMEM; } /* add it to the message queue */ @@ -103,14 +106,7 @@ int wilc_mq_send(WILC_MsgQueueHandle *pHandle, up(&pHandle->hSem); -ERRORHANDLER: - /* error occured, free any allocations */ - if (pstrMessage) { - kfree(pstrMessage->pvBuffer); - kfree(pstrMessage); - } - - return result; + return 0; } /*! -- 1.9.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH V2] staging: wilc1000: wilc_msgqueue.c : remove the goto ERRORHANDER 2015-10-14 5:55 [PATCH V2] staging: wilc1000: wilc_msgqueue.c : remove the goto ERRORHANDER Tony Cho @ 2015-10-14 8:32 ` Mike Rapoport 2015-10-14 8:52 ` Tony Cho 0 siblings, 1 reply; 6+ messages in thread From: Mike Rapoport @ 2015-10-14 8:32 UTC (permalink / raw) To: Tony Cho Cc: gregkh, devel, rachel.kim, chris.park, austin.shin, linux-wireless, johnny.kim, Nicolas.FERRE, adel.noureldin, leo.kim, adham.abozaeid On Wed, Oct 14, 2015 at 02:55:43PM +0900, Tony Cho wrote: > From: Leo Kim <leo.kim@atmel.com> > > This patch removes goto ERRORHANDER and the result variable in wilc_mq_send. > Then, the error type is directly returned. If normal operation, freeing memory > is not needed in this function. > If an error occurs, returns an error after releasing the spin lock. > > Signed-off-by: Leo Kim <leo.kim@atmel.com> > Signed-off-by: Tony Cho <tony.cho@atmel.com> > --- > V2: add releasing spinlock before returnig an error when an error happens. > --- > drivers/staging/wilc1000/wilc_msgqueue.c | 28 ++++++++++++---------------- > 1 file changed, 12 insertions(+), 16 deletions(-) > > diff --git a/drivers/staging/wilc1000/wilc_msgqueue.c b/drivers/staging/wilc1000/wilc_msgqueue.c > index b13809a..4dfd476 100644 > --- a/drivers/staging/wilc1000/wilc_msgqueue.c > +++ b/drivers/staging/wilc1000/wilc_msgqueue.c > @@ -56,35 +56,38 @@ int wilc_mq_destroy(WILC_MsgQueueHandle *pHandle) > int wilc_mq_send(WILC_MsgQueueHandle *pHandle, > const void *pvSendBuffer, u32 u32SendBufferSize) > { > - int result = 0; > unsigned long flags; > Message *pstrMessage = NULL; > > if ((!pHandle) || (u32SendBufferSize == 0) || (!pvSendBuffer)) { > PRINT_ER("pHandle or pvSendBuffer is null\n"); > - result = -EFAULT; > - goto ERRORHANDLER; > + return -EFAULT; > } > > if (pHandle->bExiting) { > PRINT_ER("pHandle fail\n"); > - result = -EFAULT; > - goto ERRORHANDLER; > + return -EFAULT; > } > > spin_lock_irqsave(&pHandle->strCriticalSection, flags); > > /* construct a new message */ > pstrMessage = kmalloc(sizeof(Message), GFP_ATOMIC); You can make this allocation outisde the spinlock, then there won't be need to release it if the allocation fails. > - if (!pstrMessage) > + > + if (!pstrMessage) { > + spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); > return -ENOMEM; > + } > + > pstrMessage->u32Length = u32SendBufferSize; > pstrMessage->pstrNext = NULL; > pstrMessage->pvBuffer = kmemdup(pvSendBuffer, u32SendBufferSize, > GFP_ATOMIC); > + > if (!pstrMessage->pvBuffer) { > - result = -ENOMEM; > - goto ERRORHANDLER; > + spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); You are still holding pHandle->hSem here. Moreover, all error paths return while still holding pHandle->hSem. I'd suggest, that instead of trying to return immediately, you'd better move error handling code to the end of the function and use goto and several labels to do appropriate cleanups depending on when the error was caught. E.g. mem_free: kfree(pstrMessage); release_lock: spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); release_sem: up(&pHandle->sem); out: return result; > + kfree(pstrMessage); > + return -ENOMEM; > } > > /* add it to the message queue */ > @@ -103,14 +106,7 @@ int wilc_mq_send(WILC_MsgQueueHandle *pHandle, > > up(&pHandle->hSem); > > -ERRORHANDLER: > - /* error occured, free any allocations */ > - if (pstrMessage) { > - kfree(pstrMessage->pvBuffer); > - kfree(pstrMessage); > - } > - > - return result; > + return 0; > } > > /*! > -- > 1.9.1 > > _______________________________________________ > devel mailing list > devel@linuxdriverproject.org > http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH V2] staging: wilc1000: wilc_msgqueue.c : remove the goto ERRORHANDER 2015-10-14 8:32 ` Mike Rapoport @ 2015-10-14 8:52 ` Tony Cho 2015-10-14 10:39 ` Mike Rapoport 2015-10-17 4:28 ` Greg KH 0 siblings, 2 replies; 6+ messages in thread From: Tony Cho @ 2015-10-14 8:52 UTC (permalink / raw) To: Mike Rapoport Cc: gregkh, devel, rachel.kim, chris.park, austin.shin, linux-wireless, johnny.kim, Nicolas.FERRE, adel.noureldin, leo.kim, adham.abozaeid On 2015년 10월 14일 17:32, Mike Rapoport wrote: > On Wed, Oct 14, 2015 at 02:55:43PM +0900, Tony Cho wrote: >> From: Leo Kim <leo.kim@atmel.com> >> >> This patch removes goto ERRORHANDER and the result variable in wilc_mq_send. >> Then, the error type is directly returned. If normal operation, freeing memory >> is not needed in this function. >> If an error occurs, returns an error after releasing the spin lock. >> >> Signed-off-by: Leo Kim <leo.kim@atmel.com> >> Signed-off-by: Tony Cho <tony.cho@atmel.com> >> --- >> V2: add releasing spinlock before returnig an error when an error happens. >> --- >> drivers/staging/wilc1000/wilc_msgqueue.c | 28 ++++++++++++---------------- >> 1 file changed, 12 insertions(+), 16 deletions(-) >> >> diff --git a/drivers/staging/wilc1000/wilc_msgqueue.c b/drivers/staging/wilc1000/wilc_msgqueue.c >> index b13809a..4dfd476 100644 >> --- a/drivers/staging/wilc1000/wilc_msgqueue.c >> +++ b/drivers/staging/wilc1000/wilc_msgqueue.c >> @@ -56,35 +56,38 @@ int wilc_mq_destroy(WILC_MsgQueueHandle *pHandle) >> int wilc_mq_send(WILC_MsgQueueHandle *pHandle, >> const void *pvSendBuffer, u32 u32SendBufferSize) >> { >> - int result = 0; >> unsigned long flags; >> Message *pstrMessage = NULL; >> >> if ((!pHandle) || (u32SendBufferSize == 0) || (!pvSendBuffer)) { >> PRINT_ER("pHandle or pvSendBuffer is null\n"); >> - result = -EFAULT; >> - goto ERRORHANDLER; >> + return -EFAULT; >> } >> >> if (pHandle->bExiting) { >> PRINT_ER("pHandle fail\n"); >> - result = -EFAULT; >> - goto ERRORHANDLER; >> + return -EFAULT; >> } >> >> spin_lock_irqsave(&pHandle->strCriticalSection, flags); >> >> /* construct a new message */ >> pstrMessage = kmalloc(sizeof(Message), GFP_ATOMIC); > You can make this allocation outisde the spinlock, then there won't be > need to release it if the allocation fails. > >> - if (!pstrMessage) >> + >> + if (!pstrMessage) { >> + spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); >> return -ENOMEM; >> + } >> + >> pstrMessage->u32Length = u32SendBufferSize; >> pstrMessage->pstrNext = NULL; >> pstrMessage->pvBuffer = kmemdup(pvSendBuffer, u32SendBufferSize, >> GFP_ATOMIC); >> + >> if (!pstrMessage->pvBuffer) { >> - result = -ENOMEM; >> - goto ERRORHANDLER; >> + spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); > You are still holding pHandle->hSem here. Moreover, all error paths > return while still holding pHandle->hSem. Can you explain to me what you mean for holding hsem here? Basically, this function cannot release the semaphore (of course, this synchronization mechanism will be changed, anyway) if errors happen. The thread will do his work when it is released without unexpected situations. > I'd suggest, that instead of trying to return immediately, you'd better > move error handling code to the end of the function and use goto and > several labels to do appropriate cleanups depending on when the error > was caught. E.g. I don't want to use goto statement as possible as I can. Do you concern semaphore uses in this function? Thanks for your review, Tony. > > mem_free: > kfree(pstrMessage); > release_lock: > spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); > release_sem: > up(&pHandle->sem); > out: > return result; > >> + kfree(pstrMessage); >> + return -ENOMEM; >> } >> >> /* add it to the message queue */ >> @@ -103,14 +106,7 @@ int wilc_mq_send(WILC_MsgQueueHandle *pHandle, >> >> up(&pHandle->hSem); >> >> -ERRORHANDLER: >> - /* error occured, free any allocations */ >> - if (pstrMessage) { >> - kfree(pstrMessage->pvBuffer); >> - kfree(pstrMessage); >> - } >> - >> - return result; >> + return 0; >> } >> >> /*! >> -- >> 1.9.1 >> >> _______________________________________________ >> devel mailing list >> devel@linuxdriverproject.org >> http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH V2] staging: wilc1000: wilc_msgqueue.c : remove the goto ERRORHANDER 2015-10-14 8:52 ` Tony Cho @ 2015-10-14 10:39 ` Mike Rapoport 2015-10-17 4:28 ` Greg KH 1 sibling, 0 replies; 6+ messages in thread From: Mike Rapoport @ 2015-10-14 10:39 UTC (permalink / raw) To: Tony Cho Cc: gregkh, devel, rachel.kim, chris.park, austin.shin, linux-wireless, johnny.kim, Nicolas.FERRE, adel.noureldin, leo.kim, adham.abozaeid On Wed, Oct 14, 2015 at 05:52:55PM +0900, Tony Cho wrote: > > On 2015년 10월 14일 17:32, Mike Rapoport wrote: > >On Wed, Oct 14, 2015 at 02:55:43PM +0900, Tony Cho wrote: > >>From: Leo Kim <leo.kim@atmel.com> > >> > >>This patch removes goto ERRORHANDER and the result variable in wilc_mq_send. > >>Then, the error type is directly returned. If normal operation, freeing memory > >>is not needed in this function. > >>If an error occurs, returns an error after releasing the spin lock. > >> > >>Signed-off-by: Leo Kim <leo.kim@atmel.com> > >>Signed-off-by: Tony Cho <tony.cho@atmel.com> > >>--- > >>V2: add releasing spinlock before returnig an error when an error happens. > >>--- > >> drivers/staging/wilc1000/wilc_msgqueue.c | 28 ++++++++++++---------------- > >> 1 file changed, 12 insertions(+), 16 deletions(-) > >> if (!pstrMessage->pvBuffer) { > >>- result = -ENOMEM; > >>- goto ERRORHANDLER; > >>+ spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); > >You are still holding pHandle->hSem here. Moreover, all error paths > >return while still holding pHandle->hSem. > > Can you explain to me what you mean for holding hsem here? Basically, this function cannot release > > the semaphore (of course, this synchronization mechanism will be changed, anyway) if errors happen. > > The thread will do his work when it is released without unexpected situations. If the semaphore should not be released if an error happens, you can ignore my comments. > >I'd suggest, that instead of trying to return immediately, you'd better > >move error handling code to the end of the function and use goto and > >several labels to do appropriate cleanups depending on when the error > >was caught. E.g. > > I don't want to use goto statement as possible as I can. Do you concern semaphore uses in this function? > Thanks for your review, > Tony. > > > > >mem_free: > > kfree(pstrMessage); > >release_lock: > > spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); > >release_sem: > > up(&pHandle->sem); > >out: > > return result; > > > >>+ kfree(pstrMessage); > >>+ return -ENOMEM; > >> } > >> /* add it to the message queue */ > >>@@ -103,14 +106,7 @@ int wilc_mq_send(WILC_MsgQueueHandle *pHandle, > >> up(&pHandle->hSem); > >>-ERRORHANDLER: > >>- /* error occured, free any allocations */ > >>- if (pstrMessage) { > >>- kfree(pstrMessage->pvBuffer); > >>- kfree(pstrMessage); > >>- } > >>- > >>- return result; > >>+ return 0; > >> } > >> /*! > >>-- > >>1.9.1 > >> > >>_______________________________________________ > >>devel mailing list > >>devel@linuxdriverproject.org > >>http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH V2] staging: wilc1000: wilc_msgqueue.c : remove the goto ERRORHANDER 2015-10-14 8:52 ` Tony Cho 2015-10-14 10:39 ` Mike Rapoport @ 2015-10-17 4:28 ` Greg KH 2015-10-19 1:21 ` Tony Cho 1 sibling, 1 reply; 6+ messages in thread From: Greg KH @ 2015-10-17 4:28 UTC (permalink / raw) To: Tony Cho Cc: Mike Rapoport, devel, rachel.kim, chris.park, austin.shin, linux-wireless, johnny.kim, Nicolas.FERRE, adel.noureldin, leo.kim, adham.abozaeid On Wed, Oct 14, 2015 at 05:52:55PM +0900, Tony Cho wrote: > > > On 2015년 10월 14일 17:32, Mike Rapoport wrote: > >On Wed, Oct 14, 2015 at 02:55:43PM +0900, Tony Cho wrote: > >>From: Leo Kim <leo.kim@atmel.com> > >> > >>This patch removes goto ERRORHANDER and the result variable in wilc_mq_send. > >>Then, the error type is directly returned. If normal operation, freeing memory > >>is not needed in this function. > >>If an error occurs, returns an error after releasing the spin lock. > >> > >>Signed-off-by: Leo Kim <leo.kim@atmel.com> > >>Signed-off-by: Tony Cho <tony.cho@atmel.com> > >>--- > >>V2: add releasing spinlock before returnig an error when an error happens. > >>--- > >> drivers/staging/wilc1000/wilc_msgqueue.c | 28 ++++++++++++---------------- > >> 1 file changed, 12 insertions(+), 16 deletions(-) > >> > >>diff --git a/drivers/staging/wilc1000/wilc_msgqueue.c b/drivers/staging/wilc1000/wilc_msgqueue.c > >>index b13809a..4dfd476 100644 > >>--- a/drivers/staging/wilc1000/wilc_msgqueue.c > >>+++ b/drivers/staging/wilc1000/wilc_msgqueue.c > >>@@ -56,35 +56,38 @@ int wilc_mq_destroy(WILC_MsgQueueHandle *pHandle) > >> int wilc_mq_send(WILC_MsgQueueHandle *pHandle, > >> const void *pvSendBuffer, u32 u32SendBufferSize) > >> { > >>- int result = 0; > >> unsigned long flags; > >> Message *pstrMessage = NULL; > >> if ((!pHandle) || (u32SendBufferSize == 0) || (!pvSendBuffer)) { > >> PRINT_ER("pHandle or pvSendBuffer is null\n"); > >>- result = -EFAULT; > >>- goto ERRORHANDLER; > >>+ return -EFAULT; > >> } > >> if (pHandle->bExiting) { > >> PRINT_ER("pHandle fail\n"); > >>- result = -EFAULT; > >>- goto ERRORHANDLER; > >>+ return -EFAULT; > >> } > >> spin_lock_irqsave(&pHandle->strCriticalSection, flags); > >> /* construct a new message */ > >> pstrMessage = kmalloc(sizeof(Message), GFP_ATOMIC); > >You can make this allocation outisde the spinlock, then there won't be > >need to release it if the allocation fails. > > > >>- if (!pstrMessage) > >>+ > >>+ if (!pstrMessage) { > >>+ spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); > >> return -ENOMEM; > >>+ } > >>+ > >> pstrMessage->u32Length = u32SendBufferSize; > >> pstrMessage->pstrNext = NULL; > >> pstrMessage->pvBuffer = kmemdup(pvSendBuffer, u32SendBufferSize, > >> GFP_ATOMIC); > >>+ > >> if (!pstrMessage->pvBuffer) { > >>- result = -ENOMEM; > >>- goto ERRORHANDLER; > >>+ spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); > >You are still holding pHandle->hSem here. Moreover, all error paths > >return while still holding pHandle->hSem. > > Can you explain to me what you mean for holding hsem here? Basically, this function cannot release > > the semaphore (of course, this synchronization mechanism will be changed, anyway) if errors happen. > > The thread will do his work when it is released without unexpected situations. > > >I'd suggest, that instead of trying to return immediately, you'd better > >move error handling code to the end of the function and use goto and > >several labels to do appropriate cleanups depending on when the error > >was caught. E.g. > > I don't want to use goto statement as possible as I can. Do you > concern semaphore uses in this function? You should use a goto, it will make the error unwinding much easier and is a very common pattern in Linux kernel code. It will save you many lines in this function, please do it that way instead. thanks, greg k-h ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH V2] staging: wilc1000: wilc_msgqueue.c : remove the goto ERRORHANDER 2015-10-17 4:28 ` Greg KH @ 2015-10-19 1:21 ` Tony Cho 0 siblings, 0 replies; 6+ messages in thread From: Tony Cho @ 2015-10-19 1:21 UTC (permalink / raw) To: Greg KH Cc: Mike Rapoport, devel, rachel.kim, chris.park, austin.shin, linux-wireless, johnny.kim, Nicolas.FERRE, adel.noureldin, leo.kim, adham.abozaeid On 2015년 10월 17일 13:28, Greg KH wrote: > On Wed, Oct 14, 2015 at 05:52:55PM +0900, Tony Cho wrote: >> >> On 2015년 10월 14일 17:32, Mike Rapoport wrote: >>> On Wed, Oct 14, 2015 at 02:55:43PM +0900, Tony Cho wrote: >>>> From: Leo Kim <leo.kim@atmel.com> >>>> >>>> This patch removes goto ERRORHANDER and the result variable in wilc_mq_send. >>>> Then, the error type is directly returned. If normal operation, freeing memory >>>> is not needed in this function. >>>> If an error occurs, returns an error after releasing the spin lock. >>>> >>>> Signed-off-by: Leo Kim <leo.kim@atmel.com> >>>> Signed-off-by: Tony Cho <tony.cho@atmel.com> >>>> --- >>>> V2: add releasing spinlock before returnig an error when an error happens. >>>> --- >>>> drivers/staging/wilc1000/wilc_msgqueue.c | 28 ++++++++++++---------------- >>>> 1 file changed, 12 insertions(+), 16 deletions(-) >>>> >>>> diff --git a/drivers/staging/wilc1000/wilc_msgqueue.c b/drivers/staging/wilc1000/wilc_msgqueue.c >>>> index b13809a..4dfd476 100644 >>>> --- a/drivers/staging/wilc1000/wilc_msgqueue.c >>>> +++ b/drivers/staging/wilc1000/wilc_msgqueue.c >>>> @@ -56,35 +56,38 @@ int wilc_mq_destroy(WILC_MsgQueueHandle *pHandle) >>>> int wilc_mq_send(WILC_MsgQueueHandle *pHandle, >>>> const void *pvSendBuffer, u32 u32SendBufferSize) >>>> { >>>> - int result = 0; >>>> unsigned long flags; >>>> Message *pstrMessage = NULL; >>>> if ((!pHandle) || (u32SendBufferSize == 0) || (!pvSendBuffer)) { >>>> PRINT_ER("pHandle or pvSendBuffer is null\n"); >>>> - result = -EFAULT; >>>> - goto ERRORHANDLER; >>>> + return -EFAULT; >>>> } >>>> if (pHandle->bExiting) { >>>> PRINT_ER("pHandle fail\n"); >>>> - result = -EFAULT; >>>> - goto ERRORHANDLER; >>>> + return -EFAULT; >>>> } >>>> spin_lock_irqsave(&pHandle->strCriticalSection, flags); >>>> /* construct a new message */ >>>> pstrMessage = kmalloc(sizeof(Message), GFP_ATOMIC); >>> You can make this allocation outisde the spinlock, then there won't be >>> need to release it if the allocation fails. >>> >>>> - if (!pstrMessage) >>>> + >>>> + if (!pstrMessage) { >>>> + spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); >>>> return -ENOMEM; >>>> + } >>>> + >>>> pstrMessage->u32Length = u32SendBufferSize; >>>> pstrMessage->pstrNext = NULL; >>>> pstrMessage->pvBuffer = kmemdup(pvSendBuffer, u32SendBufferSize, >>>> GFP_ATOMIC); >>>> + >>>> if (!pstrMessage->pvBuffer) { >>>> - result = -ENOMEM; >>>> - goto ERRORHANDLER; >>>> + spin_unlock_irqrestore(&pHandle->strCriticalSection, flags); >>> You are still holding pHandle->hSem here. Moreover, all error paths >>> return while still holding pHandle->hSem. >> Can you explain to me what you mean for holding hsem here? Basically, this function cannot release >> >> the semaphore (of course, this synchronization mechanism will be changed, anyway) if errors happen. >> >> The thread will do his work when it is released without unexpected situations. >> >>> I'd suggest, that instead of trying to return immediately, you'd better >>> move error handling code to the end of the function and use goto and >>> several labels to do appropriate cleanups depending on when the error >>> was caught. E.g. >> I don't want to use goto statement as possible as I can. Do you >> concern semaphore uses in this function? > You should use a goto, it will make the error unwinding much easier and > is a very common pattern in Linux kernel code. It will save you many > lines in this function, please do it that way instead. ok, I will do that, Thanks, Tony. > > thanks, > > greg k-h ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-10-19 1:21 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-10-14 5:55 [PATCH V2] staging: wilc1000: wilc_msgqueue.c : remove the goto ERRORHANDER Tony Cho 2015-10-14 8:32 ` Mike Rapoport 2015-10-14 8:52 ` Tony Cho 2015-10-14 10:39 ` Mike Rapoport 2015-10-17 4:28 ` Greg KH 2015-10-19 1:21 ` Tony Cho
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).