Message ID | 1712844751-53514-5-git-send-email-hengqi@linux.alibaba.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | ethtool: provide the dim profile fine-tuning channel | expand |
On 4/11/2024 7:12 AM, Heng Qi wrote: > Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding. > > > Virtio-net has different types of back-end device > implementations. In order to effectively optimize > the dim library's gains for different device > implementations, let's use the new interface params > to fine-tune the profile list. > > Signed-off-by: Heng Qi <hengqi@linux.alibaba.com> > --- > drivers/net/virtio_net.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index a64656e..813d9ed 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -3584,7 +3584,7 @@ static void virtnet_rx_dim_work(struct work_struct *work) > if (!rq->dim_enabled) > continue; > > - update_moder = net_dim_get_rx_moderation(dim->mode, dim->profile_ix); > + update_moder = dev->rx_eqe_profile[dim->profile_ix]; Looking at this it seems like the driver has to be aware of the active profile type, i.e. eqe or cqe. Why not continue to use the dim->mode and also the net_dim_get_rx_moderation() helper? Does the dim->mode not get updated based on the ethtool command(s) setting up the new and active profile? Thanks, Brett > if (update_moder.usec != rq->intr_coal.max_usecs || > update_moder.pkts != rq->intr_coal.max_packets) { > err = virtnet_send_rx_ctrl_coal_vq_cmd(vi, qnum, > @@ -3868,7 +3868,8 @@ static int virtnet_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info) > > static const struct ethtool_ops virtnet_ethtool_ops = { > .supported_coalesce_params = ETHTOOL_COALESCE_MAX_FRAMES | > - ETHTOOL_COALESCE_USECS | ETHTOOL_COALESCE_USE_ADAPTIVE_RX, > + ETHTOOL_COALESCE_USECS | ETHTOOL_COALESCE_USE_ADAPTIVE_RX | > + ETHTOOL_COALESCE_RX_EQE_PROFILE, > .get_drvinfo = virtnet_get_drvinfo, > .get_link = ethtool_op_get_link, > .get_ringparam = virtnet_get_ringparam, > @@ -4424,6 +4425,7 @@ static int virtnet_find_vqs(struct virtnet_info *vi) > > static void virtnet_dim_init(struct virtnet_info *vi) > { > + struct net_device *dev = vi->dev; > int i; > > if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_VQ_NOTF_COAL)) > @@ -4433,6 +4435,8 @@ static void virtnet_dim_init(struct virtnet_info *vi) > INIT_WORK(&vi->rq[i].dim.work, virtnet_rx_dim_work); > vi->rq[i].dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE; > } > + > + dev->priv_flags |= IFF_PROFILE_USEC | IFF_PROFILE_PKTS; > } > > static int virtnet_alloc_queues(struct virtnet_info *vi) > -- > 1.8.3.1 > >
在 2024/4/11 下午11:23, Brett Creeley 写道: > > > On 4/11/2024 7:12 AM, Heng Qi wrote: >> Caution: This message originated from an External Source. Use proper >> caution when opening attachments, clicking links, or responding. >> >> >> Virtio-net has different types of back-end device >> implementations. In order to effectively optimize >> the dim library's gains for different device >> implementations, let's use the new interface params >> to fine-tune the profile list. >> >> Signed-off-by: Heng Qi <hengqi@linux.alibaba.com> >> --- >> drivers/net/virtio_net.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c >> index a64656e..813d9ed 100644 >> --- a/drivers/net/virtio_net.c >> +++ b/drivers/net/virtio_net.c >> @@ -3584,7 +3584,7 @@ static void virtnet_rx_dim_work(struct >> work_struct *work) >> if (!rq->dim_enabled) >> continue; >> >> - update_moder = net_dim_get_rx_moderation(dim->mode, >> dim->profile_ix); >> + update_moder = dev->rx_eqe_profile[dim->profile_ix]; > > Looking at this it seems like the driver has to be aware of the active > profile type, i.e. eqe or cqe. Why not continue to use the dim->mode > and also the net_dim_get_rx_moderation() helper? At this point I plan to issue a patch set after this to clean up all related drivers together, which I have mentioned in the cover-letter: " Since the profile now exists in netdevice, adding a function similar to net_dim_get_rx_moderation_dev() with netdevice as argument is nice, but this would be better along with cleaning up the rest of the drivers, which we can get to very soon after this set. " > > Does the dim->mode not get updated based on the ethtool command(s) > setting up the new and active profile? This will not be updated. Thanks. > > Thanks, > > Brett > >> if (update_moder.usec != rq->intr_coal.max_usecs || >> update_moder.pkts != rq->intr_coal.max_packets) { >> err = virtnet_send_rx_ctrl_coal_vq_cmd(vi, >> qnum, >> @@ -3868,7 +3868,8 @@ static int virtnet_set_rxnfc(struct net_device >> *dev, struct ethtool_rxnfc *info) >> >> static const struct ethtool_ops virtnet_ethtool_ops = { >> .supported_coalesce_params = ETHTOOL_COALESCE_MAX_FRAMES | >> - ETHTOOL_COALESCE_USECS | >> ETHTOOL_COALESCE_USE_ADAPTIVE_RX, >> + ETHTOOL_COALESCE_USECS | >> ETHTOOL_COALESCE_USE_ADAPTIVE_RX | >> + ETHTOOL_COALESCE_RX_EQE_PROFILE, >> .get_drvinfo = virtnet_get_drvinfo, >> .get_link = ethtool_op_get_link, >> .get_ringparam = virtnet_get_ringparam, >> @@ -4424,6 +4425,7 @@ static int virtnet_find_vqs(struct virtnet_info >> *vi) >> >> static void virtnet_dim_init(struct virtnet_info *vi) >> { >> + struct net_device *dev = vi->dev; >> int i; >> >> if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_VQ_NOTF_COAL)) >> @@ -4433,6 +4435,8 @@ static void virtnet_dim_init(struct >> virtnet_info *vi) >> INIT_WORK(&vi->rq[i].dim.work, virtnet_rx_dim_work); >> vi->rq[i].dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE; >> } >> + >> + dev->priv_flags |= IFF_PROFILE_USEC | IFF_PROFILE_PKTS; >> } >> >> static int virtnet_alloc_queues(struct virtnet_info *vi) >> -- >> 1.8.3.1 >> >>
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index a64656e..813d9ed 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -3584,7 +3584,7 @@ static void virtnet_rx_dim_work(struct work_struct *work) if (!rq->dim_enabled) continue; - update_moder = net_dim_get_rx_moderation(dim->mode, dim->profile_ix); + update_moder = dev->rx_eqe_profile[dim->profile_ix]; if (update_moder.usec != rq->intr_coal.max_usecs || update_moder.pkts != rq->intr_coal.max_packets) { err = virtnet_send_rx_ctrl_coal_vq_cmd(vi, qnum, @@ -3868,7 +3868,8 @@ static int virtnet_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info) static const struct ethtool_ops virtnet_ethtool_ops = { .supported_coalesce_params = ETHTOOL_COALESCE_MAX_FRAMES | - ETHTOOL_COALESCE_USECS | ETHTOOL_COALESCE_USE_ADAPTIVE_RX, + ETHTOOL_COALESCE_USECS | ETHTOOL_COALESCE_USE_ADAPTIVE_RX | + ETHTOOL_COALESCE_RX_EQE_PROFILE, .get_drvinfo = virtnet_get_drvinfo, .get_link = ethtool_op_get_link, .get_ringparam = virtnet_get_ringparam, @@ -4424,6 +4425,7 @@ static int virtnet_find_vqs(struct virtnet_info *vi) static void virtnet_dim_init(struct virtnet_info *vi) { + struct net_device *dev = vi->dev; int i; if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_VQ_NOTF_COAL)) @@ -4433,6 +4435,8 @@ static void virtnet_dim_init(struct virtnet_info *vi) INIT_WORK(&vi->rq[i].dim.work, virtnet_rx_dim_work); vi->rq[i].dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE; } + + dev->priv_flags |= IFF_PROFILE_USEC | IFF_PROFILE_PKTS; } static int virtnet_alloc_queues(struct virtnet_info *vi)
Virtio-net has different types of back-end device implementations. In order to effectively optimize the dim library's gains for different device implementations, let's use the new interface params to fine-tune the profile list. Signed-off-by: Heng Qi <hengqi@linux.alibaba.com> --- drivers/net/virtio_net.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)