All of lore.kernel.org
 help / color / mirror / Atom feed
* wl18xx: Bad format for rx_frames_per_rates in debugfs?
@ 2015-03-12 12:39 ` Nicolas Iooss
  0 siblings, 0 replies; 6+ messages in thread
From: Nicolas Iooss @ 2015-03-12 12:39 UTC (permalink / raw)
  To: linux-wireless, Kalle Valo; +Cc: netdev, linux-kernel

Hello,

While adding __printf attributes to several functions in the kernel, I
got a surprising gcc warning in drivers/net/wireless/ti/wl18xx/debugfs.c
about "format '%u' expects argument of type 'unsigned int', but argument
5 has type 'u32 *'".

Indeed it seems that commit c5d94169e818 ("wl18xx: use new fw stats
structures") [1] introduced an array field "u32 rx_frames_per_rates[50]"
in struct wl18xx_acx_rx_rate_stat but is using
WL18XX_DEBUGFS_FWSTATS_FILE(rx_rate, rx_frames_per_rates, "%u"); instead
of something like WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate,
rx_frames_per_rates, 50); for displaying this value.  So I believe that
currently the rx_rate entry in debugfs contains a kernel pointer instead
of the actual data.  As I don't have the hardware to test I can't be
sure of it.

Is this a real bug which needs to be fixed or something weird I haven't
understood yet?

Thanks

--
Nicolas

[1]
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c5d94169e8189d02dfbd6143411908357865d777

PS: I got this gcc warning by adding __printf(4, 5) to
wl1271_format_buffer() prototype in
drivers/net/wireless/ti/wlcore/debugfs.h:

In file included from
/usr/src/linux/drivers/net/wireless/ti/wl18xx/debugfs.c:23:0:
    /usr/src/linux/drivers/net/wireless/ti/wl18xx/debugfs.c: In function
'rx_rate_rx_frames_per_rates_read':
    /usr/src/linux/drivers/net/wireless/ti/wl18xx/debugfs.c:34:32:
error: format '%u' expects argument of type 'unsigned int', but argument
5 has type 'u32 *' [-Werror=format=]
      DEBUGFS_FWSTATS_FILE(a, b, c, wl18xx_acx_statistics)
                                    ^

/usr/src/linux/drivers/net/wireless/ti/wl18xx/../wlcore/debugfs.h:77:9:
note: in definition of macro 'DEBUGFS_FWSTATS_FILE'
      struct struct_type *stats = wl->stats.fw_stats;   \
             ^
    /usr/src/linux/drivers/net/wireless/ti/wl18xx/debugfs.c:142:1: note:
in expansion of macro 'WL18XX_DEBUGFS_FWSTATS_FILE'
     WL18XX_DEBUGFS_FWSTATS_FILE(rx_rate, rx_frames_per_rates, "%u");
     ^

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

* wl18xx: Bad format for rx_frames_per_rates in debugfs?
@ 2015-03-12 12:39 ` Nicolas Iooss
  0 siblings, 0 replies; 6+ messages in thread
From: Nicolas Iooss @ 2015-03-12 12:39 UTC (permalink / raw)
  To: linux-wireless-u79uwXL29TY76Z2rM5mHXA, Kalle Valo
  Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA

Hello,

While adding __printf attributes to several functions in the kernel, I
got a surprising gcc warning in drivers/net/wireless/ti/wl18xx/debugfs.c
about "format '%u' expects argument of type 'unsigned int', but argument
5 has type 'u32 *'".

Indeed it seems that commit c5d94169e818 ("wl18xx: use new fw stats
structures") [1] introduced an array field "u32 rx_frames_per_rates[50]"
in struct wl18xx_acx_rx_rate_stat but is using
WL18XX_DEBUGFS_FWSTATS_FILE(rx_rate, rx_frames_per_rates, "%u"); instead
of something like WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate,
rx_frames_per_rates, 50); for displaying this value.  So I believe that
currently the rx_rate entry in debugfs contains a kernel pointer instead
of the actual data.  As I don't have the hardware to test I can't be
sure of it.

Is this a real bug which needs to be fixed or something weird I haven't
understood yet?

Thanks

--
Nicolas

[1]
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c5d94169e8189d02dfbd6143411908357865d777

PS: I got this gcc warning by adding __printf(4, 5) to
wl1271_format_buffer() prototype in
drivers/net/wireless/ti/wlcore/debugfs.h:

In file included from
/usr/src/linux/drivers/net/wireless/ti/wl18xx/debugfs.c:23:0:
    /usr/src/linux/drivers/net/wireless/ti/wl18xx/debugfs.c: In function
'rx_rate_rx_frames_per_rates_read':
    /usr/src/linux/drivers/net/wireless/ti/wl18xx/debugfs.c:34:32:
error: format '%u' expects argument of type 'unsigned int', but argument
5 has type 'u32 *' [-Werror=format=]
      DEBUGFS_FWSTATS_FILE(a, b, c, wl18xx_acx_statistics)
                                    ^

/usr/src/linux/drivers/net/wireless/ti/wl18xx/../wlcore/debugfs.h:77:9:
note: in definition of macro 'DEBUGFS_FWSTATS_FILE'
      struct struct_type *stats = wl->stats.fw_stats;   \
             ^
    /usr/src/linux/drivers/net/wireless/ti/wl18xx/debugfs.c:142:1: note:
in expansion of macro 'WL18XX_DEBUGFS_FWSTATS_FILE'
     WL18XX_DEBUGFS_FWSTATS_FILE(rx_rate, rx_frames_per_rates, "%u");
     ^
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: wl18xx: Bad format for rx_frames_per_rates in debugfs?
  2015-03-12 12:39 ` Nicolas Iooss
  (?)
@ 2015-03-12 13:16 ` Eliad Peller
  -1 siblings, 0 replies; 6+ messages in thread
From: Eliad Peller @ 2015-03-12 13:16 UTC (permalink / raw)
  To: Nicolas Iooss
  Cc: linux-wireless, Kalle Valo, open list:NETWORKING DRIVERS, linux-kernel

On Thu, Mar 12, 2015 at 2:39 PM, Nicolas Iooss
<nicolas.iooss_linux@m4x.org> wrote:
> Hello,
>
> While adding __printf attributes to several functions in the kernel, I
> got a surprising gcc warning in drivers/net/wireless/ti/wl18xx/debugfs.c
> about "format '%u' expects argument of type 'unsigned int', but argument
> 5 has type 'u32 *'".
>
> Indeed it seems that commit c5d94169e818 ("wl18xx: use new fw stats
> structures") [1] introduced an array field "u32 rx_frames_per_rates[50]"
> in struct wl18xx_acx_rx_rate_stat but is using
> WL18XX_DEBUGFS_FWSTATS_FILE(rx_rate, rx_frames_per_rates, "%u"); instead
> of something like WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate,
> rx_frames_per_rates, 50); for displaying this value.  So I believe that
> currently the rx_rate entry in debugfs contains a kernel pointer instead
> of the actual data.  As I don't have the hardware to test I can't be
> sure of it.
>
> Is this a real bug which needs to be fixed or something weird I haven't
> understood yet?
>
yes, seems like a bug.

Eliad.

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

* [PATCH] wl18xx: show rx_frames_per_rates as an array as it really is
  2015-03-12 12:39 ` Nicolas Iooss
  (?)
  (?)
@ 2015-03-13  7:17 ` Nicolas Iooss
  2015-03-16 16:07     ` Kalle Valo
  -1 siblings, 1 reply; 6+ messages in thread
From: Nicolas Iooss @ 2015-03-13  7:17 UTC (permalink / raw)
  To: kvalo, eliad, linux-wireless; +Cc: netdev, linux-kernel, Nicolas Iooss

In struct wl18xx_acx_rx_rate_stat, rx_frames_per_rates field is an
array, not a number.  This means WL18XX_DEBUGFS_FWSTATS_FILE can't be
used to display this field in debugfs (it would display a pointer, not
the actual data).  Use WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY instead.

This bug has been found by adding a __printf attribute to
wl1271_format_buffer.  gcc complained about "format '%u' expects
argument of type 'unsigned int', but argument 5 has type 'u32 *'".

Fixes: c5d94169e818 ("wl18xx: use new fw stats structures")
Signed-off-by: Nicolas Iooss <nicolas.iooss_linux@m4x.org>
---

This patch is only compile-tested as I haven't got the hardware to
test it live.

 drivers/net/wireless/ti/wl18xx/debugfs.c | 2 +-
 drivers/net/wireless/ti/wlcore/debugfs.h | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/ti/wl18xx/debugfs.c b/drivers/net/wireless/ti/wl18xx/debugfs.c
index c93fae95baac..5fbd2230f372 100644
--- a/drivers/net/wireless/ti/wl18xx/debugfs.c
+++ b/drivers/net/wireless/ti/wl18xx/debugfs.c
@@ -139,7 +139,7 @@ WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, protection_filter, "%u");
 WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, accum_arp_pend_requests, "%u");
 WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, max_arp_queue_dep, "%u");
 
-WL18XX_DEBUGFS_FWSTATS_FILE(rx_rate, rx_frames_per_rates, "%u");
+WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate, rx_frames_per_rates, 50);
 
 WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_vs_rate,
 				  AGGR_STATS_TX_AGG*AGGR_STATS_TX_RATE);
diff --git a/drivers/net/wireless/ti/wlcore/debugfs.h b/drivers/net/wireless/ti/wlcore/debugfs.h
index 0f2cfb0d2a9e..bf14676e6515 100644
--- a/drivers/net/wireless/ti/wlcore/debugfs.h
+++ b/drivers/net/wireless/ti/wlcore/debugfs.h
@@ -26,8 +26,8 @@
 
 #include "wlcore.h"
 
-int wl1271_format_buffer(char __user *userbuf, size_t count,
-			 loff_t *ppos, char *fmt, ...);
+__printf(4, 5) int wl1271_format_buffer(char __user *userbuf, size_t count,
+					loff_t *ppos, char *fmt, ...);
 
 int wl1271_debugfs_init(struct wl1271 *wl);
 void wl1271_debugfs_exit(struct wl1271 *wl);
-- 
2.3.2


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

* Re: wl18xx: show rx_frames_per_rates as an array as it really is
@ 2015-03-16 16:07     ` Kalle Valo
  0 siblings, 0 replies; 6+ messages in thread
From: Kalle Valo @ 2015-03-16 16:07 UTC (permalink / raw)
  To: Nicolas Iooss; +Cc: eliad, linux-wireless, netdev, linux-kernel, Nicolas Iooss


> In struct wl18xx_acx_rx_rate_stat, rx_frames_per_rates field is an
> array, not a number.  This means WL18XX_DEBUGFS_FWSTATS_FILE can't be
> used to display this field in debugfs (it would display a pointer, not
> the actual data).  Use WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY instead.
> 
> This bug has been found by adding a __printf attribute to
> wl1271_format_buffer.  gcc complained about "format '%u' expects
> argument of type 'unsigned int', but argument 5 has type 'u32 *'".
> 
> Fixes: c5d94169e818 ("wl18xx: use new fw stats structures")
> Signed-off-by: Nicolas Iooss <nicolas.iooss_linux@m4x.org>

Thanks, applied to wireless-drivers-next.git.

Kalle Valo

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

* Re: wl18xx: show rx_frames_per_rates as an array as it really is
@ 2015-03-16 16:07     ` Kalle Valo
  0 siblings, 0 replies; 6+ messages in thread
From: Kalle Valo @ 2015-03-16 16:07 UTC (permalink / raw)
  To: Nicolas Iooss
  Cc: eliad-Ix1uc/W3ht7QT0dZR+AlfA,
	linux-wireless-u79uwXL29TY76Z2rM5mHXA,
	netdev-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, Nicolas Iooss


> In struct wl18xx_acx_rx_rate_stat, rx_frames_per_rates field is an
> array, not a number.  This means WL18XX_DEBUGFS_FWSTATS_FILE can't be
> used to display this field in debugfs (it would display a pointer, not
> the actual data).  Use WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY instead.
> 
> This bug has been found by adding a __printf attribute to
> wl1271_format_buffer.  gcc complained about "format '%u' expects
> argument of type 'unsigned int', but argument 5 has type 'u32 *'".
> 
> Fixes: c5d94169e818 ("wl18xx: use new fw stats structures")
> Signed-off-by: Nicolas Iooss <nicolas.iooss_linux-oWGTIYur0i8@public.gmane.org>

Thanks, applied to wireless-drivers-next.git.

Kalle Valo
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

end of thread, other threads:[~2015-03-16 16:07 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-12 12:39 wl18xx: Bad format for rx_frames_per_rates in debugfs? Nicolas Iooss
2015-03-12 12:39 ` Nicolas Iooss
2015-03-12 13:16 ` Eliad Peller
2015-03-13  7:17 ` [PATCH] wl18xx: show rx_frames_per_rates as an array as it really is Nicolas Iooss
2015-03-16 16:07   ` Kalle Valo
2015-03-16 16:07     ` Kalle Valo

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.