mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-27 04:22:58 +00:00
ethtool: Centralise validation of ETHTOOL_{G, S}RXFHINDIR parameters
Add a new ethtool operation (get_rxfh_indir_size) to get the indirectional table size. Use this to validate the user buffer size before calling get_rxfh_indir or set_rxfh_indir. Use get_rxnfc to get the number of RX rings, and validate the contents of the new indirection table before calling set_rxfh_indir. Remove this validation from drivers. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Acked-by: Dimitris Michailidis <dm@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
14596f7006
commit
7850f63f16
@@ -565,44 +565,38 @@ vmxnet3_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *info,
|
||||
}
|
||||
|
||||
#ifdef VMXNET3_RSS
|
||||
static int
|
||||
vmxnet3_get_rss_indir(struct net_device *netdev,
|
||||
struct ethtool_rxfh_indir *p)
|
||||
static u32
|
||||
vmxnet3_get_rss_indir_size(struct net_device *netdev)
|
||||
{
|
||||
struct vmxnet3_adapter *adapter = netdev_priv(netdev);
|
||||
struct UPT1_RSSConf *rssConf = adapter->rss_conf;
|
||||
unsigned int n = min_t(unsigned int, p->size, rssConf->indTableSize);
|
||||
|
||||
p->size = rssConf->indTableSize;
|
||||
return rssConf->indTableSize;
|
||||
}
|
||||
|
||||
static int
|
||||
vmxnet3_get_rss_indir(struct net_device *netdev, u32 *p)
|
||||
{
|
||||
struct vmxnet3_adapter *adapter = netdev_priv(netdev);
|
||||
struct UPT1_RSSConf *rssConf = adapter->rss_conf;
|
||||
unsigned int n = rssConf->indTableSize;
|
||||
|
||||
while (n--)
|
||||
p->ring_index[n] = rssConf->indTable[n];
|
||||
p[n] = rssConf->indTable[n];
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int
|
||||
vmxnet3_set_rss_indir(struct net_device *netdev,
|
||||
const struct ethtool_rxfh_indir *p)
|
||||
vmxnet3_set_rss_indir(struct net_device *netdev, const u32 *p)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned long flags;
|
||||
struct vmxnet3_adapter *adapter = netdev_priv(netdev);
|
||||
struct UPT1_RSSConf *rssConf = adapter->rss_conf;
|
||||
|
||||
if (p->size != rssConf->indTableSize)
|
||||
return -EINVAL;
|
||||
for (i = 0; i < rssConf->indTableSize; i++) {
|
||||
/*
|
||||
* Return with error code if any of the queue indices
|
||||
* is out of range
|
||||
*/
|
||||
if (p->ring_index[i] < 0 ||
|
||||
p->ring_index[i] >= adapter->num_rx_queues)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < rssConf->indTableSize; i++)
|
||||
rssConf->indTable[i] = p->ring_index[i];
|
||||
rssConf->indTable[i] = p[i];
|
||||
|
||||
spin_lock_irqsave(&adapter->cmd_lock, flags);
|
||||
VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
|
||||
@@ -629,6 +623,7 @@ static struct ethtool_ops vmxnet3_ethtool_ops = {
|
||||
.set_ringparam = vmxnet3_set_ringparam,
|
||||
.get_rxnfc = vmxnet3_get_rxnfc,
|
||||
#ifdef VMXNET3_RSS
|
||||
.get_rxfh_indir_size = vmxnet3_get_rss_indir_size,
|
||||
.get_rxfh_indir = vmxnet3_get_rss_indir,
|
||||
.set_rxfh_indir = vmxnet3_set_rss_indir,
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user