* kfifo must_check warning
@ 2010-10-19 22:10 Randy Dunlap
2010-10-20 5:12 ` Andrew Morton
0 siblings, 1 reply; 7+ messages in thread
From: Randy Dunlap @ 2010-10-19 22:10 UTC (permalink / raw)
To: lkml; +Cc: Stefani Seibold
In 2.6.36-rc8, I see this build warning:
drivers/char/n_gsm.c: In function 'gsm_dlci_alloc':
drivers/char/n_gsm.c:1580: warning: ignoring return value of '__kfifo_must_check_helper', declared with attribute warn_unused_result
The helper seems to be getting in the way (?). The driver code does this:
if (kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL) < 0) {
kfree(dlci);
return NULL;
}
Should the driver code be doing something else?
or should the kfifo_alloc() macro be checking the result of the helper?
thanks,
---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: kfifo must_check warning 2010-10-19 22:10 kfifo must_check warning Randy Dunlap @ 2010-10-20 5:12 ` Andrew Morton 2010-10-20 16:46 ` kfifo must_check warning (+ patch) Randy Dunlap 0 siblings, 1 reply; 7+ messages in thread From: Andrew Morton @ 2010-10-20 5:12 UTC (permalink / raw) To: Randy Dunlap; +Cc: lkml, Stefani Seibold On Tue, 19 Oct 2010 15:10:48 -0700 Randy Dunlap <randy.dunlap@oracle.com> wrote: > In 2.6.36-rc8, I see this build warning: > > drivers/char/n_gsm.c: In function 'gsm_dlci_alloc': > drivers/char/n_gsm.c:1580: warning: ignoring return value of '__kfifo_must_check_helper', declared with attribute warn_unused_result > > The helper seems to be getting in the way (?). The driver code does this: > > if (kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL) < 0) { > kfree(dlci); > return NULL; > } > > Should the driver code be doing something else? > or should the kfifo_alloc() macro be checking the result of the helper? > A gcc bug, I'd say. The code looks OK and my gcc doesn't warn. Perhaps see if you can find some code transformation in n_gsm.c which makes it go away? Add a new local variable or something. I did see a probably unrelated bug in there though. __kfifo_must_check_helper() coerces its arg into an `unsigned int' and returns an unsigned int. Consequently if kfifo_alloc() tries to return -EINVAL, the above-quoted code won't detect the error: it will see -EINVAL as a large, positive unsigned value. I don't see a simple fix for that apart from creating several flavours of __kfifo_must_check_helper() and carefully going through each instance and using the one which takes (and returns) the correct type. A suitable temporary 2.6.37 patch would bee to just disable __kfifo_must_check_helper(): --- a/include/linux/kfifo.h~a +++ a/include/linux/kfifo.h @@ -171,11 +171,7 @@ struct kfifo_rec_ptr_2 __STRUCT_KFIFO_PT } -static inline unsigned int __must_check -__kfifo_must_check_helper(unsigned int val) -{ - return val; -} +#define __kfifo_must_check_helper(x) (x) /** * kfifo_initialized - Check if the fifo is initialized _ ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: kfifo must_check warning (+ patch) 2010-10-20 5:12 ` Andrew Morton @ 2010-10-20 16:46 ` Randy Dunlap 2010-10-20 17:51 ` miltonm 2010-10-20 18:37 ` Alan Cox 0 siblings, 2 replies; 7+ messages in thread From: Randy Dunlap @ 2010-10-20 16:46 UTC (permalink / raw) To: Andrew Morton; +Cc: lkml, Stefani Seibold On Tue, 19 Oct 2010 22:12:42 -0700 Andrew Morton wrote: > On Tue, 19 Oct 2010 15:10:48 -0700 Randy Dunlap <randy.dunlap@oracle.com> wrote: > > > In 2.6.36-rc8, I see this build warning: > > > > drivers/char/n_gsm.c: In function 'gsm_dlci_alloc': > > drivers/char/n_gsm.c:1580: warning: ignoring return value of '__kfifo_must_check_helper', declared with attribute warn_unused_result > > > > The helper seems to be getting in the way (?). The driver code does this: > > > > if (kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL) < 0) { > > kfree(dlci); > > return NULL; > > } > > > > Should the driver code be doing something else? > > or should the kfifo_alloc() macro be checking the result of the helper? > > > > A gcc bug, I'd say. The code looks OK and my gcc doesn't warn. OK. > Perhaps see if you can find some code transformation in n_gsm.c which > makes it go away? Add a new local variable or something. Yes, that works for me. Patch is below. > I did see a probably unrelated bug in there though. > __kfifo_must_check_helper() coerces its arg into an `unsigned int' and > returns an unsigned int. Consequently if kfifo_alloc() tries to return > -EINVAL, the above-quoted code won't detect the error: it will see > -EINVAL as a large, positive unsigned value. > > I don't see a simple fix for that apart from creating several flavours > of __kfifo_must_check_helper() and carefully going through each > instance and using the one which takes (and returns) the correct type. > > A suitable temporary 2.6.37 patch would bee to just disable > __kfifo_must_check_helper(): > > --- a/include/linux/kfifo.h~a > +++ a/include/linux/kfifo.h > @@ -171,11 +171,7 @@ struct kfifo_rec_ptr_2 __STRUCT_KFIFO_PT > } > > > -static inline unsigned int __must_check > -__kfifo_must_check_helper(unsigned int val) > -{ > - return val; > -} > +#define __kfifo_must_check_helper(x) (x) > > /** > * kfifo_initialized - Check if the fifo is initialized > _ > > -- From: Randy Dunlap <randy.dunlap@oracle.com> Some versions of gcc mysteriously report: drivers/char/n_gsm.c:1580: warning: ignoring return value of '__kfifo_must_check_helper', declared with attribute warn_unused_result This warning can be eliminated by using a local variable for the returned result value, as suggested by Andrew Morton. Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com> --- drivers/char/n_gsm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) --- linux-next-20101019.orig/drivers/char/n_gsm.c +++ linux-next-20101019/drivers/char/n_gsm.c @@ -1573,11 +1573,14 @@ static void gsm_dlci_command(struct gsm_ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr) { struct gsm_dlci *dlci = kzalloc(sizeof(struct gsm_dlci), GFP_ATOMIC); + int err; + if (dlci == NULL) return NULL; spin_lock_init(&dlci->lock); dlci->fifo = &dlci->_fifo; - if (kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL) < 0) { + err = kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL); + if (err < 0) { kfree(dlci); return NULL; } ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: kfifo must_check warning (+ patch) 2010-10-20 16:46 ` kfifo must_check warning (+ patch) Randy Dunlap @ 2010-10-20 17:51 ` miltonm 2010-10-20 18:37 ` Alan Cox 1 sibling, 0 replies; 7+ messages in thread From: miltonm @ 2010-10-20 17:51 UTC (permalink / raw) To: Randy Dunlap; +Cc: Andrew Morton, lkml, Stefani Seibold > --- linux-next-20101019.orig/drivers/char/n_gsm.c > +++ linux-next-20101019/drivers/char/n_gsm.c > @@ -1573,11 +1573,14 @@ static void gsm_dlci_command(struct gsm_ > static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr) > { > struct gsm_dlci *dlci = kzalloc(sizeof(struct gsm_dlci), GFP_ATOMIC); > + int err; > + > if (dlci == NULL) > return NULL; > spin_lock_init(&dlci->lock); > dlci->fifo = &dlci->_fifo; > - if (kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL) < 0) { > + err = kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL); > + if (err < 0) { > kfree(dlci); > return NULL; > } > > I think this is not a gcc bug but Randy's gcc beeing smarter and showing a signed bug with the old code. The earlier discussion had: > > > Should the driver code be doing something else? > > > or should the kfifo_alloc() macro be checking the result of the helper? > > > > > > > A gcc bug, I'd say. The code looks OK and my gcc doesn't warn. > > OK. > > > Perhaps see if you can find some code transformation in n_gsm.c which > > makes it go away? Add a new local variable or something. > > Yes, that works for me. Patch is below. > > > I did see a probably unrelated bug in there though. > > __kfifo_must_check_helper() coerces its arg into an `unsigned int' and > > returns an unsigned int. Consequently if kfifo_alloc() tries to return > > -EINVAL, the above-quoted code won't detect the error: it will see > > -EINVAL as a large, positive unsigned value. > > and then gcc decides that the check of < 0 is meaningless, and then says that the result is unused. Note: I'm a kernel hacker , not a gcc one. This is pure speculation. So to me the helper is the one causing the error! ... and the patch is undoing the damage at the caller. So the correct fix is to change the return type of the helper, and if someone wants the int to be unsigned then it needs to be unsigned long so we can use an is_error type test. milton ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: kfifo must_check warning (+ patch) 2010-10-20 16:46 ` kfifo must_check warning (+ patch) Randy Dunlap 2010-10-20 17:51 ` miltonm @ 2010-10-20 18:37 ` Alan Cox 2010-10-20 18:56 ` Andrew Morton 1 sibling, 1 reply; 7+ messages in thread From: Alan Cox @ 2010-10-20 18:37 UTC (permalink / raw) To: Randy Dunlap; +Cc: Andrew Morton, lkml, Stefani Seibold > Some versions of gcc mysteriously report: > drivers/char/n_gsm.c:1580: warning: ignoring return value of '__kfifo_must_check_helper', declared with attribute warn_unused_result > > This warning can be eliminated by using a local variable for the > returned result value, as suggested by Andrew Morton. But that just hides the bug in the helper surely - the helper has type errors so needs fixing - not this. If you apply this then the underlying bug is just going to get forgotten Alan ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: kfifo must_check warning (+ patch) 2010-10-20 18:37 ` Alan Cox @ 2010-10-20 18:56 ` Andrew Morton 2010-10-20 20:09 ` Stefani Seibold 0 siblings, 1 reply; 7+ messages in thread From: Andrew Morton @ 2010-10-20 18:56 UTC (permalink / raw) To: Alan Cox; +Cc: Randy Dunlap, lkml, Stefani Seibold On Wed, 20 Oct 2010 19:37:02 +0100 Alan Cox <alan@lxorguk.ukuu.org.uk> wrote: > > Some versions of gcc mysteriously report: > > drivers/char/n_gsm.c:1580: warning: ignoring return value of '__kfifo_must_check_helper', declared with attribute warn_unused_result > > > > This warning can be eliminated by using a local variable for the > > returned result value, as suggested by Andrew Morton. > > But that just hides the bug in the helper surely - the helper has type > errors so needs fixing - not this. If you apply this then the underlying > bug is just going to get forgotten > It won't get forgotten. I agree that the warning is probably an artifact of the signedness thing. So for 2.6.36, disabling __kfifo_must_check_helper() will suffice. I'm sure that Stefani will fix up __kfifo_must_check_helper() for real for 2.6.37, then we can see if the warning reoccurs. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: kfifo must_check warning (+ patch) 2010-10-20 18:56 ` Andrew Morton @ 2010-10-20 20:09 ` Stefani Seibold 0 siblings, 0 replies; 7+ messages in thread From: Stefani Seibold @ 2010-10-20 20:09 UTC (permalink / raw) To: Andrew Morton; +Cc: Alan Cox, Randy Dunlap, lkml The problem should be fixed. I renamed the __kfifo_must_check_helper() into __kfifo_uint_must_check_helper() and add a new __kfifo_int_must_check_helper() which is now used for kfifo_alloc(). A kernel linux 2.6.36-rc compiled with gcc 4.4.4 doesn't show the warning. There a only two functions which return a int: kfifo_alloc() and kfifo_init(). The later one does not make use of __kfifo_int_must_check_helper(), but this could be change if required. I will send the patch in a separate mail. Am Mittwoch, den 20.10.2010, 11:56 -0700 schrieb Andrew Morton: > On Wed, 20 Oct 2010 19:37:02 +0100 > Alan Cox <alan@lxorguk.ukuu.org.uk> wrote: > > > > Some versions of gcc mysteriously report: > > > drivers/char/n_gsm.c:1580: warning: ignoring return value of '__kfifo_must_check_helper', declared with attribute warn_unused_result > > > > > > This warning can be eliminated by using a local variable for the > > > returned result value, as suggested by Andrew Morton. > > > > But that just hides the bug in the helper surely - the helper has type > > errors so needs fixing - not this. If you apply this then the underlying > > bug is just going to get forgotten > > > > It won't get forgotten. > > I agree that the warning is probably an artifact of the signedness > thing. So for 2.6.36, disabling __kfifo_must_check_helper() will > suffice. I'm sure that Stefani will fix up __kfifo_must_check_helper() > for real for 2.6.37, then we can see if the warning reoccurs. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-10-20 20:54 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-10-19 22:10 kfifo must_check warning Randy Dunlap 2010-10-20 5:12 ` Andrew Morton 2010-10-20 16:46 ` kfifo must_check warning (+ patch) Randy Dunlap 2010-10-20 17:51 ` miltonm 2010-10-20 18:37 ` Alan Cox 2010-10-20 18:56 ` Andrew Morton 2010-10-20 20:09 ` Stefani Seibold
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox