On Tue, Aug 27, 2024 at 3:23 AM Carlos Bilbao <cbilbao@xxxxxxxxxxxxxxxx> wrote: > > 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@xxxxxx> > 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@xxxxxxxxxxxxxxxx> > --- > 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__); > + } > } This should follow the virtio-spec, for modern virtio-net devices, most of the fields are read only. Thanks > > static u32 mlx5_vdpa_get_generation(struct vdpa_device *vdev) > -- > 2.34.1 > >