@@ -773,15 +773,25 @@ static int vhost_virtqueue_set_addr(struct vhost_dev *dev,
773
773
struct vhost_virtqueue * vq ,
774
774
unsigned idx , bool enable_log )
775
775
{
776
- struct vhost_vring_addr addr = {
777
- .index = idx ,
778
- .desc_user_addr = (uint64_t )(unsigned long )vq -> desc ,
779
- .avail_user_addr = (uint64_t )(unsigned long )vq -> avail ,
780
- .used_user_addr = (uint64_t )(unsigned long )vq -> used ,
781
- .log_guest_addr = vq -> used_phys ,
782
- .flags = enable_log ? (1 << VHOST_VRING_F_LOG ) : 0 ,
783
- };
784
- int r = dev -> vhost_ops -> vhost_set_vring_addr (dev , & addr );
776
+ struct vhost_vring_addr addr ;
777
+ int r ;
778
+ memset (& addr , 0 , sizeof (struct vhost_vring_addr ));
779
+
780
+ if (dev -> vhost_ops -> vhost_vq_get_addr ) {
781
+ r = dev -> vhost_ops -> vhost_vq_get_addr (dev , & addr , vq );
782
+ if (r < 0 ) {
783
+ VHOST_OPS_DEBUG ("vhost_vq_get_addr failed" );
784
+ return - errno ;
785
+ }
786
+ } else {
787
+ addr .desc_user_addr = (uint64_t )(unsigned long )vq -> desc ;
788
+ addr .avail_user_addr = (uint64_t )(unsigned long )vq -> avail ;
789
+ addr .used_user_addr = (uint64_t )(unsigned long )vq -> used ;
790
+ }
791
+ addr .index = idx ;
792
+ addr .log_guest_addr = vq -> used_phys ;
793
+ addr .flags = enable_log ? (1 << VHOST_VRING_F_LOG ) : 0 ;
794
+ r = dev -> vhost_ops -> vhost_set_vring_addr (dev , & addr );
785
795
if (r < 0 ) {
786
796
VHOST_OPS_DEBUG ("vhost_set_vring_addr failed" );
787
797
return - errno ;
0 commit comments