Messages in this thread Patch in this message | | | From | Nick Desaulniers <> | Date | Wed, 29 Mar 2023 10:10:20 -0700 | Subject | Re: [PATCH net-next] net: ethernet: ti: Fix format specifier in netcp_create_interface() |
| |
On Wed, Mar 29, 2023 at 8:08 AM Nathan Chancellor <nathan@kernel.org> wrote: > > After commit 3948b05950fd ("net: introduce a config option to tweak > MAX_SKB_FRAGS"), clang warns: > > drivers/net/ethernet/ti/netcp_core.c:2085:4: warning: format specifies type 'long' but the argument has type 'int' [-Wformat] > MAX_SKB_FRAGS); > ^~~~~~~~~~~~~ > include/linux/dev_printk.h:144:65: note: expanded from macro 'dev_err' > dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__) > ~~~ ^~~~~~~~~~~ > include/linux/dev_printk.h:110:23: note: expanded from macro 'dev_printk_index_wrap' > _p_func(dev, fmt, ##__VA_ARGS__); \ > ~~~ ^~~~~~~~~~~ > include/linux/skbuff.h:352:23: note: expanded from macro 'MAX_SKB_FRAGS' > #define MAX_SKB_FRAGS CONFIG_MAX_SKB_FRAGS > ^~~~~~~~~~~~~~~~~~~~ > ./include/generated/autoconf.h:11789:30: note: expanded from macro 'CONFIG_MAX_SKB_FRAGS' > #define CONFIG_MAX_SKB_FRAGS 17 > ^~ > 1 warning generated. > > Follow the pattern of the rest of the tree by changing the specifier to > '%u' and casting MAX_SKB_FRAGS explicitly to 'unsigned int', which > eliminates the warning. > > Fixes: 3948b05950fd ("net: introduce a config option to tweak MAX_SKB_FRAGS") > Signed-off-by: Nathan Chancellor <nathan@kernel.org> > --- > I am a little confused as to why the solution for this warning is > casting to 'unsigned int' rather than just updating all the specifiers > to be '%d', as I do not see how MAX_SKB_FRAGS can be any type other than > just 'int' but I figured I would be consistent with the other fixes I > have seen around this issue.
MAX_SKB_FRAGS might be defined by Kconfig, see: 352 #define MAX_SKB_FRAGS CONFIG_MAX_SKB_FRAGS in include/linux/skbuff.h. The Kconfig is declared in net/Kconfig:254.
Because integer literals in C are signed, the cast is necessary to avoid the format specifier from warning about the wrong signedness. It would be preferable to have a `U` suffix on the literal value, then the cast would be unnecessary.
Untested: ``` diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 494a23a976b0..67cb6bfc4056 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -349,7 +349,7 @@ struct sk_buff; # define CONFIG_MAX_SKB_FRAGS 17 #endif
-#define MAX_SKB_FRAGS CONFIG_MAX_SKB_FRAGS +#define MAX_SKB_FRAGS CONFIG_MAX_SKB_FRAGS ## U
extern int sysctl_max_skb_frags; ``` Perhaps other code using MAX_SKB_FRAGS might have to worry about signedness and conversions.
But I think what you have is fine for now. Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Though the above might be a longer-term solution since this might pop up again. > --- > drivers/net/ethernet/ti/netcp_core.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/ethernet/ti/netcp_core.c b/drivers/net/ethernet/ti/netcp_core.c > index 1bb596a9d8a2..d829113c16ee 100644 > --- a/drivers/net/ethernet/ti/netcp_core.c > +++ b/drivers/net/ethernet/ti/netcp_core.c > @@ -2081,8 +2081,8 @@ static int netcp_create_interface(struct netcp_device *netcp_device, > netcp->tx_pool_region_id = temp[1]; > > if (netcp->tx_pool_size < MAX_SKB_FRAGS) { > - dev_err(dev, "tx-pool size too small, must be at least %ld\n", > - MAX_SKB_FRAGS); > + dev_err(dev, "tx-pool size too small, must be at least %u\n", > + (unsigned int)MAX_SKB_FRAGS); > ret = -ENODEV; > goto quit; > } > > --- > base-commit: 3b064f541be822dc095991c6dda20a75eb51db5e > change-id: 20230329-net-ethernet-ti-wformat-acaa86350657 > > Best regards, > -- > Nathan Chancellor <nathan@kernel.org> >
-- Thanks, ~Nick Desaulniers
| |