> -----Original Message----- > From: Joe Perches <j...@perches.com> > Sent: Thursday, June 25, 2020 8:29 PM > To: Kirsher, Jeffrey T <jeffrey.t.kirs...@intel.com>; da...@davemloft.net > Cc: Michael, Alice <alice.mich...@intel.com>; netdev@vger.kernel.org; > nhor...@redhat.com; sassm...@redhat.com; Brady, Alan > <alan.br...@intel.com>; Burra, Phani R <phani.r.bu...@intel.com>; Hay, > Joshua A <joshua.a....@intel.com>; Chittim, Madhu > <madhu.chit...@intel.com>; Linga, Pavan Kumar > <pavan.kumar.li...@intel.com>; Skidmore, Donald C > <donald.c.skidm...@intel.com>; Brandeburg, Jesse > <jesse.brandeb...@intel.com>; Samudrala, Sridhar > <sridhar.samudr...@intel.com> > Subject: Re: [net-next v3 13/15] iecm: Add ethtool > > On Thu, 2020-06-25 at 19:07 -0700, Jeff Kirsher wrote: > > From: Alice Michael <alice.mich...@intel.com> > > > > Implement ethtool interface for the common module. > [] > > diff --git a/drivers/net/ethernet/intel/iecm/iecm_ethtool.c > > b/drivers/net/ethernet/intel/iecm/iecm_ethtool.c > [] > > +/* Stats associated with a Tx queue */ static const struct iecm_stats > > +iecm_gstrings_tx_queue_stats[] = { > > + IECM_QUEUE_STAT("%s-%u.packets", q_stats.tx.packets), > > + IECM_QUEUE_STAT("%s-%u.bytes", q_stats.tx.bytes), }; > > + > > +static const struct iecm_stats iecm_gstrings_rx_queue_stats[] = { > > + IECM_QUEUE_STAT("%s-%u.packets", q_stats.rx.packets), > > + IECM_QUEUE_STAT("%s-%u.bytes", q_stats.rx.bytes), > > + IECM_QUEUE_STAT("%s-%u.generic_csum", q_stats.rx.generic_csum), > > + IECM_QUEUE_STAT("%s-%u.basic_csum", q_stats.rx.basic_csum), > > + IECM_QUEUE_STAT("%s-%u.csum_err", q_stats.rx.csum_err), > > + IECM_QUEUE_STAT("%s-%u.hsplit_buf_overflow", > q_stats.rx.hsplit_hbo), > > +}; > > + > > +#define IECM_TX_QUEUE_STATS_LEN > ARRAY_SIZE(iecm_gstrings_tx_queue_stats) > > +#define IECM_RX_QUEUE_STATS_LEN > ARRAY_SIZE(iecm_gstrings_rx_queue_stats) > > + > > +/** > > + * __iecm_add_stat_strings - copy stat strings into ethtool buffer > > + * @p: ethtool supplied buffer > > + * @stats: stat definitions array > > + * @size: size of the stats array > > + * > > + * Format and copy the strings described by stats into the buffer > > +pointed at > > + * by p. > > + */ > > +static void __iecm_add_stat_strings(u8 **p, const struct iecm_stats > > stats[], > > + const unsigned int size, ...) { > > + unsigned int i; > > + > > + for (i = 0; i < size; i++) { > > + va_list args; > > + > > + va_start(args, size); > > + vsnprintf((char *)*p, ETH_GSTRING_LEN, > > + stats[i].stat_string, args); > > + *p += ETH_GSTRING_LEN; > > + va_end(args); > > + } > > +} > > Slightly dangerous to have a possible mismatch between the varargs and the > actual constant format spec. > > Perhaps safer to use something like: > > static const struct iecm_stats iecm_gstrings_tx_queue_stats[] = { > IECM_QUEUE_STAT("packets", q_stats.tx.packets), > IECM_QUEUE_STAT("bytes", q_stats.tx.bytes), }; > > Perhaps use const char * and unsigned int instead of varargs so this formats > the > output without va_start/end > > snprintf(*p, ETH_GSTRING_LEN, "%s-%u.%s", type, index, > stats[i].stat_string); >
Agreed this could be better. Will rework without varargs. Alan