@ -86,11 +86,11 @@ static bool vhost_vdpa_listener_skipped_section(MemoryRegionSection *section,
* The caller must set asid = 0 if the device does not support asid .
* This is not an ABI break since it is set to 0 by the initializer anyway .
*/
int vhost_vdpa_dma_map ( struct vhost_vdpa * v , uint32_t asid , hwaddr iova ,
int vhost_vdpa_dma_map ( VhostVDPAShared * s , uint32_t asid , hwaddr iova ,
hwaddr size , void * vaddr , bool readonly )
{
struct vhost_msg_v2 msg = { } ;
int fd = v - > shared - > device_fd ;
int fd = s - > device_fd ;
int ret = 0 ;
msg . type = VHOST_IOTLB_MSG_V2 ;
@ -101,7 +101,7 @@ int vhost_vdpa_dma_map(struct vhost_vdpa *v, uint32_t asid, hwaddr iova,
msg . iotlb . perm = readonly ? VHOST_ACCESS_RO : VHOST_ACCESS_RW ;
msg . iotlb . type = VHOST_IOTLB_UPDATE ;
trace_vhost_vdpa_dma_map ( v - > shared , fd , msg . type , msg . asid , msg . iotlb . iova ,
trace_vhost_vdpa_dma_map ( s , fd , msg . type , msg . asid , msg . iotlb . iova ,
msg . iotlb . size , msg . iotlb . uaddr , msg . iotlb . perm ,
msg . iotlb . type ) ;
@ -118,11 +118,11 @@ int vhost_vdpa_dma_map(struct vhost_vdpa *v, uint32_t asid, hwaddr iova,
* The caller must set asid = 0 if the device does not support asid .
* This is not an ABI break since it is set to 0 by the initializer anyway .
*/
int vhost_vdpa_dma_unmap ( struct vhost_vdpa * v , uint32_t asid , hwaddr iova ,
int vhost_vdpa_dma_unmap ( VhostVDPAShared * s , uint32_t asid , hwaddr iova ,
hwaddr size )
{
struct vhost_msg_v2 msg = { } ;
int fd = v - > shared - > device_fd ;
int fd = s - > device_fd ;
int ret = 0 ;
msg . type = VHOST_IOTLB_MSG_V2 ;
@ -131,8 +131,8 @@ int vhost_vdpa_dma_unmap(struct vhost_vdpa *v, uint32_t asid, hwaddr iova,
msg . iotlb . size = size ;
msg . iotlb . type = VHOST_IOTLB_INVALIDATE ;
trace_vhost_vdpa_dma_unmap ( v - > shared , fd , msg . type , msg . asid ,
msg . iotlb . iova , msg . iotlb . size , msg . iotlb . type ) ;
trace_vhost_vdpa_dma_unmap ( s , fd , msg . type , msg . asid , msg . iotlb . iova ,
msg . iotlb . size , msg . iotlb . type ) ;
if ( write ( fd , & msg , sizeof ( msg ) ) ! = sizeof ( msg ) ) {
error_report ( " failed to write, fd=%d, errno=%d (%s) " ,
@ -143,30 +143,29 @@ int vhost_vdpa_dma_unmap(struct vhost_vdpa *v, uint32_t asid, hwaddr iova,
return ret ;
}
static void vhost_vdpa_listener_begin_batch ( struct vhost_vdpa * v )
static void vhost_vdpa_listener_begin_batch ( VhostVDPAShared * s )
{
int fd = v - > shared - > device_fd ;
int fd = s - > device_fd ;
struct vhost_msg_v2 msg = {
. type = VHOST_IOTLB_MSG_V2 ,
. iotlb . type = VHOST_IOTLB_BATCH_BEGIN ,
} ;
trace_vhost_vdpa_listener_begin_batch ( v - > shared , fd , msg . type ,
msg . iotlb . type ) ;
trace_vhost_vdpa_listener_begin_batch ( s , fd , msg . type , msg . iotlb . type ) ;
if ( write ( fd , & msg , sizeof ( msg ) ) ! = sizeof ( msg ) ) {
error_report ( " failed to write, fd=%d, errno=%d (%s) " ,
fd , errno , strerror ( errno ) ) ;
}
}
static void vhost_vdpa_iotlb_batch_begin_once ( struct vhost_vdpa * v )
static void vhost_vdpa_iotlb_batch_begin_once ( VhostVDPAShared * s )
{
if ( v - > shared - > backend_cap & ( 0x1ULL < < VHOST_BACKEND_F_IOTLB_BATCH ) & &
! v - > shared - > iotlb_batch_begin_sent ) {
vhost_vdpa_listener_begin_batch ( v ) ;
if ( s - > backend_cap & ( 0x1ULL < < VHOST_BACKEND_F_IOTLB_BATCH ) & &
! s - > iotlb_batch_begin_sent ) {
vhost_vdpa_listener_begin_batch ( s ) ;
}
v - > shared - > iotlb_batch_begin_sent = true ;
s - > iotlb_batch_begin_sent = true ;
}
static void vhost_vdpa_listener_commit ( MemoryListener * listener )
@ -226,7 +225,7 @@ static void vhost_vdpa_iommu_map_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)
if ( ! memory_get_xlat_addr ( iotlb , & vaddr , NULL , & read_only , NULL ) ) {
return ;
}
ret = vhost_vdpa_dma_map ( v , VHOST_VDPA_GUEST_PA_ASID , iova ,
ret = vhost_vdpa_dma_map ( v - > shared , VHOST_VDPA_GUEST_PA_ASID , iova ,
iotlb - > addr_mask + 1 , vaddr , read_only ) ;
if ( ret ) {
error_report ( " vhost_vdpa_dma_map(%p, 0x% " HWADDR_PRIx " , "
@ -234,7 +233,7 @@ static void vhost_vdpa_iommu_map_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)
v , iova , iotlb - > addr_mask + 1 , vaddr , ret ) ;
}
} else {
ret = vhost_vdpa_dma_unmap ( v , VHOST_VDPA_GUEST_PA_ASID , iova ,
ret = vhost_vdpa_dma_unmap ( v - > shared , VHOST_VDPA_GUEST_PA_ASID , iova ,
iotlb - > addr_mask + 1 ) ;
if ( ret ) {
error_report ( " vhost_vdpa_dma_unmap(%p, 0x% " HWADDR_PRIx " , "
@ -370,8 +369,8 @@ static void vhost_vdpa_listener_region_add(MemoryListener *listener,
iova = mem_region . iova ;
}
vhost_vdpa_iotlb_batch_begin_once ( v ) ;
ret = vhost_vdpa_dma_map ( v , VHOST_VDPA_GUEST_PA_ASID , iova ,
vhost_vdpa_iotlb_batch_begin_once ( v - > shared ) ;
ret = vhost_vdpa_dma_map ( v - > shared , VHOST_VDPA_GUEST_PA_ASID , iova ,
int128_get64 ( llsize ) , vaddr , section - > readonly ) ;
if ( ret ) {
error_report ( " vhost vdpa map fail! " ) ;
@ -455,13 +454,13 @@ static void vhost_vdpa_listener_region_del(MemoryListener *listener,
iova = result - > iova ;
vhost_iova_tree_remove ( v - > shared - > iova_tree , * result ) ;
}
vhost_vdpa_iotlb_batch_begin_once ( v ) ;
vhost_vdpa_iotlb_batch_begin_once ( v - > shared ) ;
/*
* The unmap ioctl doesn ' t accept a full 64 - bit . need to check it
*/
if ( int128_eq ( llsize , int128_2_64 ( ) ) ) {
llsize = int128_rshift ( llsize , 1 ) ;
ret = vhost_vdpa_dma_unmap ( v , VHOST_VDPA_GUEST_PA_ASID , iova ,
ret = vhost_vdpa_dma_unmap ( v - > shared , VHOST_VDPA_GUEST_PA_ASID , iova ,
int128_get64 ( llsize ) ) ;
if ( ret ) {
@ -471,7 +470,7 @@ static void vhost_vdpa_listener_region_del(MemoryListener *listener,
}
iova + = int128_get64 ( llsize ) ;
}
ret = vhost_vdpa_dma_unmap ( v , VHOST_VDPA_GUEST_PA_ASID , iova ,
ret = vhost_vdpa_dma_unmap ( v - > shared , VHOST_VDPA_GUEST_PA_ASID , iova ,
int128_get64 ( llsize ) ) ;
if ( ret ) {
@ -1081,7 +1080,8 @@ static void vhost_vdpa_svq_unmap_ring(struct vhost_vdpa *v, hwaddr addr)
}
size = ROUND_UP ( result - > size , qemu_real_host_page_size ( ) ) ;
r = vhost_vdpa_dma_unmap ( v , v - > address_space_id , result - > iova , size ) ;
r = vhost_vdpa_dma_unmap ( v - > shared , v - > address_space_id , result - > iova ,
size ) ;
if ( unlikely ( r < 0 ) ) {
error_report ( " Unable to unmap SVQ vring: %s (%d) " , g_strerror ( - r ) , - r ) ;
return ;
@ -1121,7 +1121,7 @@ static bool vhost_vdpa_svq_map_ring(struct vhost_vdpa *v, DMAMap *needle,
return false ;
}
r = vhost_vdpa_dma_map ( v , v - > address_space_id , needle - > iova ,
r = vhost_vdpa_dma_map ( v - > shared , v - > address_space_id , needle - > iova ,
needle - > size + 1 ,
( void * ) ( uintptr_t ) needle - > translated_addr ,
needle - > perm = = IOMMU_RO ) ;