On Tue, Dec 04, 2012 at 07:07:58PM +0800, Jason Wang wrote: > This patch implement the ethtool_{set|get}_channels method of ethool to allow > user to change the number of queues dymaically when the device is running. This > would let the user to configure it on demand. > > Signed-off-by: Jason Wang <jasowang@xxxxxxxxxx> > --- > drivers/net/virtio_net.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 44 insertions(+), 0 deletions(-) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 912f5b2..b9f9887 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -1589,10 +1589,54 @@ static struct virtio_driver virtio_net_driver = { > #endif > }; > > +/* TODO: Eliminate OOO packets during switching */ > +static int virtnet_set_channels(struct net_device *dev, > + struct ethtool_channels *channels) > +{ > + struct virtnet_info *vi = netdev_priv(dev); > + u16 queue_pairs = channels->combined_count; > + u16 old_queue_pairs = vi->curr_queue_pairs; > + > + /* We don't support separate rx/tx channels. > + * We don't allow setting 'other' channels. > + */ > + if (channels->rx_count || channels->tx_count || channels->other_count) > + return -EINVAL; > + > + if (queue_pairs > vi->max_queue_pairs) > + return -EINVAL; > + > + vi->curr_queue_pairs = queue_pairs; > + if (virtnet_set_queues(vi) == 0) { > + netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs); > + netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs); Just use queue_pairs - it's shorter. > + > + virtnet_set_affinity(vi, true); > + } else > + vi->curr_queue_pairs = old_queue_pairs; Should be ret = virtnet_set_queues(vi); if (ret) { vi->curr_queue_pairs = old_queue_pairs; return ret; } otherwise we loose error reporting. Also it's better if virtnet_set_queues gets queue_pairs as parameter and set curr_queue_pairs on success. > + > + return 0; > +} > + > +static void virtnet_get_channels(struct net_device *dev, > + struct ethtool_channels *channels) > +{ > + struct virtnet_info *vi = netdev_priv(dev); > + > + channels->combined_count = vi->curr_queue_pairs; > + channels->max_combined = vi->max_queue_pairs; > + channels->max_other = 0; > + channels->rx_count = 0; > + channels->tx_count = 0; > + channels->other_count = 0; > +} > + > static const struct ethtool_ops virtnet_ethtool_ops = { > .get_drvinfo = virtnet_get_drvinfo, > .get_link = ethtool_op_get_link, > .get_ringparam = virtnet_get_ringparam, > + .set_channels = virtnet_set_channels, > + .get_channels = virtnet_get_channels, > }; > > static int __init init(void) > -- > 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html