On Sun, Apr 25, 2021 at 7:38 PM Jason Wang <jasowang@xxxxxxxxxx> wrote:
So this is the proposed model for mlx5 vdpa with doorbell per-instance
在 2021/4/25 下午9:25, Eli Cohen 写道:
On Thu, Apr 22, 2021 at 04:59:11PM +0800, Jason Wang wrote:
在 2021/4/22 下午4:39, Eli Cohen 写道:This nearly matches we have in ConnectX devices. All the doorbells are
On Thu, Apr 22, 2021 at 04:21:45PM +0800, Jason Wang wrote:It's usally not safe and a layer violation if other registers are placed at
在 2021/4/22 下午4:07, Eli Cohen 写道:I am checking if it is safe to map the any part of the SF's BAR to
On Thu, Apr 22, 2021 at 09:03:58AM +0300, Eli Cohen wrote:I'm not quite sure but since the calculation of the sf_bar_length is doen
On Thu, Apr 22, 2021 at 10:37:38AM +0800, Jason Wang wrote:
在 2021/4/21 下午6:41, Eli Cohen 写道:Correct, so I guess I should return here 4096.
Implement mlx5_get_vq_notification() to return the doorbell address.Note that the page will be mapped in to guest, so it's only safe if the
Size is set to one system page as required.
Signed-off-by: Eli Cohen <elic@xxxxxxxxxx>
---
drivers/vdpa/mlx5/core/mlx5_vdpa.h | 1 +
drivers/vdpa/mlx5/core/resources.c | 1 +
drivers/vdpa/mlx5/net/mlx5_vnet.c | 6 ++++++
3 files changed, 8 insertions(+)
diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h
index b6cc53ba980c..49de62cda598 100644
--- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h
+++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h
@@ -41,6 +41,7 @@ struct mlx5_vdpa_resources {
u32 pdn;
struct mlx5_uars_page *uar;
void __iomem *kick_addr;
+ u64 phys_kick_addr;
u16 uid;
u32 null_mkey;
bool valid;
diff --git a/drivers/vdpa/mlx5/core/resources.c b/drivers/vdpa/mlx5/core/resources.c
index 6521cbd0f5c2..665f8fc1710f 100644
--- a/drivers/vdpa/mlx5/core/resources.c
+++ b/drivers/vdpa/mlx5/core/resources.c
@@ -247,6 +247,7 @@ int mlx5_vdpa_alloc_resources(struct mlx5_vdpa_dev *mvdev)
goto err_key;
kick_addr = mdev->bar_addr + offset;
+ res->phys_kick_addr = kick_addr;
res->kick_addr = ioremap(kick_addr, PAGE_SIZE);
if (!res->kick_addr) {
diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
index 10c5fef3c020..680751074d2a 100644
--- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
+++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
@@ -1865,8 +1865,14 @@ static void mlx5_vdpa_free(struct vdpa_device *vdev)
static struct vdpa_notification_area mlx5_get_vq_notification(struct vdpa_device *vdev, u16 idx)
{
+ struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
struct vdpa_notification_area ret = {};
+ struct mlx5_vdpa_net *ndev;
+
+ ndev = to_mlx5_vdpa_ndev(mvdev);
+ ret.addr = (phys_addr_t)ndev->mvdev.res.phys_kick_addr;
+ ret.size = PAGE_SIZE;
doorbeel exclusively own the page. This means if there're other registers in
the page, we can not let the doorbell bypass to work.
So this is suspicious at least in the case of subfunction where we calculate
the bar length in mlx5_sf_dev_table_create() as:
table->sf_bar_length = 1 << (MLX5_CAP_GEN(dev, log_min_sf_size) + 12);
It looks to me this can only work for the arch with PAGE_SIZE = 4096,
otherwise we can map more into the userspace(guest).
via a shift of 12, it might be correct.
And please double check if the doorbell own the page exclusively.
userspace without harming other functions. If this is true, I will check
if I can return PAGE_SIZE without compromising security.
the same page.
I think we mayThe movitiaton of the current design is to be fit seamless into how Qemu
need to extend struct vdpa_notification_area to contain another field
offset which indicates the offset from addr where the actual doorbell
resides.
model doorbell layouts currently:
1) page-per-vq, each vq has its own page aligned doorbell
2) 2 bytes doorbell, each vq has its own 2 byte aligend doorbell
Only 1) is support in vhost-vDPA (and vhost-user) since it's rather simple
and secure (page aligned) to be modelled and implemented via mmap().
Exporting a complex layout is possbile but requires careful design.
Actually, we had antoher option
3) shared doorbell: all virtqueue shares a single page aligned doorbell
located at the same place. For 4K page size atchitectures it is aligned
to the start of the page. For larger page sizes it is not aligned.
If we don't allow to some offset within the page, it means that direct
doorbells will not work for 64K page size archs over ConnectX.
Right, just to clarify. This can still be model by the current
page-per-vq model. It means the doorbell will be mapped into different
pages for each virtqueue by Qemu. So from the view of Qemu or guest,
each virtqueue has its own doorbell in this case.
(rather than per-vq), assuming the exclusive ownership of mapped
doorbell page?
So it means this new layout perhaps will have to introduce new virtio
This is not yet supported by Qemu.
For "not supported" I meant present this (doorbells sharing) layout to
guest.
features to guest thus not compatible with eixsting driver?
-Siwei
Thanks
Thanks
Yes.I also think that the check in vhost_vdpa_mmap() should verify that theActually I think it's ok since you verify the size equals vma->vm_end -
returned size is not smaller than PAGE_SIZE because the returned address
vma->vm_start which must be at least PAGE_SIZE.
Thanks
might just be aligned to PAGE_SIZE. I think this should be enoght but
maybe also use the same logic in vhost_vdpa_fault().