diff mbox series

[net-next,v6,4/4] virtio-net: support dim profile fine-tuning

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

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next, async
netdev/ynl success Generated files up to date; no warnings/errors; GEN HAS DIFF 2 files changed, 250 insertions(+);
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit fail Errors and warnings before: 19 this patch: 19
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers success CCed 8 of 8 maintainers
netdev/build_clang fail Errors and warnings before: 24 this patch: 24
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn fail Errors and warnings before: 19 this patch: 19
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 32 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Heng Qi April 11, 2024, 2:12 p.m. UTC
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(-)

Comments

Brett Creeley April 11, 2024, 3:23 p.m. UTC | #1
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
> 
>
Heng Qi April 12, 2024, 2:19 a.m. UTC | #2
在 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 mbox series

Patch

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)