用户可以通过ethtool -g/G
获取或设置对应网络接口收发队列参数:
如获取eth0
收发队列深度可以通过如下方式进行:
其中:pre-set maximums
对应网卡预设的最大值,current hardware settings
对应网卡当前设置值。
以STMMAC驱动为例,当用户调用ethtool获取时,对应驱动实现是这样的:
//drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
static void stmmac_get_ringparam(struct net_device *netdev,
struct ethtool_ringparam *ring)
{
struct stmmac_priv *priv = netdev_priv(netdev);
ring->rx_max_pending = DMA_MAX_RX_SIZE;
ring->tx_max_pending = DMA_MAX_TX_SIZE;
ring->rx_pending = priv->dma_rx_size;
ring->tx_pending = priv->dma_tx_size;
}
ethtool_ringparam
结构定义如下:
//include/uapi/linux/ethtool.h
/*
* 如果接口没有单独的接收小包和/或巨型包环形缓冲区,
* rx_mini_max_pending 和/或 rx_jumbo_max_pending 将为 0。
*/
struct ethtool_ringparam {
//命令编号,可以是 %ETHTOOL_GRINGPARAM 或 %ETHTOOL_SRINGPARAM
__u32 cmd;
//每个接收环形缓冲区支持的最大待处理条目数。只读
__u32 rx_max_pending;
//每个接收小包环形缓冲区支持的最大待处理条目数。只读
__u32 rx_mini_max_pending;
//每个接收巨型包环形缓冲区支持的最大待处理条目数。只读
__u32 rx_jumbo_max_pending;
//每个发送环形缓冲区支持的最大待处理条目数。只读
__u32 tx_max_pending;
//每个接收环形缓冲区当前的最大待处理条目数
__u32 rx_pending;
//每个接收小包环形缓冲区当前的最大待处理条目数
__u32 rx_mini_pending;
//每个接收巨型包环形缓冲区当前的最大待处理条目数
__u32 rx_jumbo_pending;
//每个发送环形缓冲区当前的最大待处理条目数
__u32 tx_pending;
};
设置收发队列深度可以通过如下方式进行:
以上命令分别修改了RX和TX队列的深度,通过ethtool -g
可以查看到设置已经生效。
以STMMAC驱动为例,当执行以上命令时,对应驱动实现是这样的:
static int stmmac_set_ringparam(struct net_device *netdev,
struct ethtool_ringparam *ring)
{
if (ring->rx_mini_pending || ring->rx_jumbo_pending ||
ring->rx_pending < DMA_MIN_RX_SIZE ||
ring->rx_pending > DMA_MAX_RX_SIZE ||
!is_power_of_2(ring->rx_pending) ||
ring->tx_pending < DMA_MIN_TX_SIZE ||
ring->tx_pending > DMA_MAX_TX_SIZE ||
!is_power_of_2(ring->tx_pending))
return -EINVAL;
return stmmac_reinit_ringparam(netdev, ring->rx_pending,
ring->tx_pending);
}
在驱动中,首先对传入的参数进行了合法性判断,对于不支持的参数设置直接返回错误。参数无误则会修改收发队列深度信息。