[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1cb17652-3437-472e-b8d5-8078ba232d60@digitalocean.com>
Date: Mon, 26 Aug 2024 14:22:57 -0500
From: Carlos Bilbao <cbilbao@...italocean.com>
To: Dragos Tatulea <dtatulea@...dia.com>, eli@...lanox.com, mst@...hat.com,
jasowang@...hat.com, xuanzhuo@...ux.alibaba.com
Cc: virtualization@...ts.linux-foundation.org, netdev@...r.kernel.org,
linux-kernel@...r.kernel.org, kvm@...r.kernel.org, eperezma@...hat.com,
sashal@...nel.org, yuehaibing@...wei.com, steven.sistare@...cle.com
Subject: Re: [RFC] Why is set_config not supported in mlx5_vnet?
Hello,
On 8/26/24 10:53 AM, Dragos Tatulea wrote:
>
> On 26.08.24 16:26, Carlos Bilbao wrote:
>> Hello Dragos,
>>
>> On 8/26/24 4:06 AM, Dragos Tatulea wrote:
>>> On 23.08.24 18:54, Carlos Bilbao wrote:
>>>> Hello,
>>>>
>>>> I'm debugging my vDPA setup, and when using ioctl to retrieve the
>>>> configuration, I noticed that it's running in half duplex mode:
>>>>
>>>> Configuration data (24 bytes):
>>>> MAC address: (Mac address)
>>>> Status: 0x0001
>>>> Max virtqueue pairs: 8
>>>> MTU: 1500
>>>> Speed: 0 Mb
>>>> Duplex: Half Duplex
>>>> RSS max key size: 0
>>>> RSS max indirection table length: 0
>>>> Supported hash types: 0x00000000
>>>>
>>>> I believe this might be contributing to the underperformance of vDPA.
>>> mlx5_vdpa vDPA devicess currently do not support the VIRTIO_NET_F_SPEED_DUPLEX
>>> feature which reports speed and duplex. You can check the state on the
>>> PF.
>>
>> According to ethtool, all my devices are running at full duplex. I assume I
>> can disregard this configuration output from the module then.
>>
> Yep.
>
>>>> While looking into how to change this option for Mellanox, I read the following
>>>> kernel code in mlx5_vnet.c:
>>>>
>>>> static void mlx5_vdpa_set_config(struct vdpa_device *vdev, unsigned int offset, const void *buf,
>>>> unsigned int len)
>>>> {
>>>> /* not supported */
>>>> }
>>>>
>>>> I was wondering why this is the case.
>>> TBH, I don't know why it was not added. But in general, the control VQ is the
>>> better way as it's dynamic.
>>>
>>>> Is there another way for me to change
>>>> these configuration settings?
>>>>
>>> The configuration is done using control VQ for most things (MTU, MAC, VQs,
>>> etc). Make sure that you have the CTRL_VQ feature set (should be on by
>>> default). It should appear in `vdpa mgmtdev show` and `vdpa dev config
>>> show`.
>>
>> I see that CTRL_VQ is indeed enabled. Is there any documentation on how to
>> use the control VQ to get/set vDPA configuration values?
>>
>>
> You are most likely using it already through through qemu. You can check
> if the CTR_VQ feature also shows up in the output of `vdpa dev config show`.
>
> What values are you trying to configure btw?
Yes, CTRL_VQ also shows up in vdpa dev config show. There isn't a specific
value I want to configure ATM, but my vDPA isn't performing as expected, so
I'm investigating potential issues. Below is the code I used to retrieve
the configuration from the driver; I'd be happy to send it as a patch if
you or someone else reviews it.
>
> Thanks,
> Dragos
Thanks,
Carlos
---
>From ab6ea66c926eaf1e95eb5d73bc23183e0021ee27 Mon Sep 17 00:00:00 2001
From: Carlos Bilbao <bilbao@...edu>
Date: Sat, 24 Aug 2024 00:24:56 +0000
Subject: [PATCH] mlx5: Add support to update the vDPA configuration
This is needed for VHOST_VDPA_SET_CONFIG.
Signed-off-by: Carlos Bilbao <cbilbao@...italocean.com>
---
drivers/vdpa/mlx5/net/mlx5_vnet.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
index b56aae3f7be3..da31c743b2b9 100644
--- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
+++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
@@ -2909,14 +2909,32 @@ static void mlx5_vdpa_get_config(struct vdpa_device *vdev, unsigned int offset,
struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
- if (offset + len <= sizeof(struct virtio_net_config))
+ if (offset + len <= sizeof(struct virtio_net_config)) {
memcpy(buf, (u8 *)&ndev->config + offset, len);
+ }
+ else
+ {
+ printk(KERN_ERR "%s: Offset and length out of bounds\n",
+ __func__);
+ }
+
}
static void mlx5_vdpa_set_config(struct vdpa_device *vdev, unsigned int offset, const void *buf,
unsigned int len)
{
- /* not supported */
+ struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
+ struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
+
+ if (offset + len <= sizeof(struct virtio_net_config))
+ {
+ memcpy((u8 *)&ndev->config + offset, buf, len);
+ }
+ else
+ {
+ printk(KERN_ERR "%s: Offset and length out of bounds\n",
+ __func__);
+ }
}
static u32 mlx5_vdpa_get_generation(struct vdpa_device *vdev)
--
2.34.1
Powered by blists - more mailing lists