On Tue, Sep 12, 2023 at 11:00 AM Cindy Lu lulu@redhat.com wrote:
Add the function vduse_alloc_reconnnect_info_mem and vduse_alloc_reconnnect_info_mem In this 2 function, vduse will get/free (vq_num + 1)*page Page 0 will be used to save the reconnection information, The Userspace App will maintain this. Page 1 ~ vq_num + 1 will save the reconnection information for vqs.
Please explain why this is needed instead of only describing how it is implemented. (Code can explain itself).
Signed-off-by: Cindy Lu lulu@redhat.com
drivers/vdpa/vdpa_user/vduse_dev.c | 86 ++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+)
diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vduse_dev.c index 26b7e29cb900..4c256fa31fc4 100644 --- a/drivers/vdpa/vdpa_user/vduse_dev.c +++ b/drivers/vdpa/vdpa_user/vduse_dev.c @@ -30,6 +30,10 @@ #include <uapi/linux/virtio_blk.h> #include <linux/mod_devicetable.h>
+#ifdef CONFIG_X86 +#include <asm/set_memory.h> +#endif
#include "iova_domain.h"
#define DRV_AUTHOR "Yongji Xie xieyongji@bytedance.com" @@ -41,6 +45,23 @@ #define VDUSE_IOVA_SIZE (128 * 1024 * 1024) #define VDUSE_MSG_DEFAULT_TIMEOUT 30
+/* struct vdpa_reconnect_info save the page information for reconnection
- kernel will init these information while alloc the pages
- and use these information to free the pages
- */
+struct vdpa_reconnect_info {
/* Offset (within vm_file) in PAGE_SIZE,
* this just for check, not using
*/
u32 index;
/* physical address for this page*/
phys_addr_t addr;
/* virtual address for this page*/
unsigned long vaddr;
If it could be switched by virt_to_phys() why duplicate those fields?
/* memory size, here always page_size*/
phys_addr_t size;
If it's always PAGE_SIZE why would we have this?
+};
struct vduse_virtqueue { u16 index; u16 num_max; @@ -57,6 +78,7 @@ struct vduse_virtqueue { struct vdpa_callback cb; struct work_struct inject; struct work_struct kick;
struct vdpa_reconnect_info reconnect_info;
};
struct vduse_dev; @@ -106,6 +128,7 @@ struct vduse_dev { u32 vq_align; struct vduse_umem *umem; struct mutex mem_lock;
struct vdpa_reconnect_info reconnect_status;
};
struct vduse_dev_msg { @@ -1030,6 +1053,65 @@ static int vduse_dev_reg_umem(struct vduse_dev *dev, return ret; }
+int vduse_alloc_reconnnect_info_mem(struct vduse_dev *dev) +{
struct vdpa_reconnect_info *info;
struct vduse_virtqueue *vq;
void *addr;
/*page 0 is use to save status,dpdk will use this to save the information
*needed in reconnection,kernel don't need to maintain this
*/
info = &dev->reconnect_status;
addr = (void *)get_zeroed_page(GFP_KERNEL);
if (!addr)
return -1;
-ENOMEM?
Thanks