vhost-user: don't merge regions with different fds
vhost currently merges regions with contiguious virtual and physical addresses. This breaks for vhost-user since that also needs fds to match. Add a vhost_ops entry to compare the fds for vhost-user only. Cc: qemu-stable@nongnu.org Cc: Victor Kaplansky <victork@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
							parent
							
								
									b54ca0c3df
								
							
						
					
					
						commit
						ffe42cc14c
					
				| @ -611,6 +611,25 @@ static int vhost_user_migration_done(struct vhost_dev *dev, char* mac_addr) | ||||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| static bool vhost_user_can_merge(struct vhost_dev *dev, | ||||
|                                  uint64_t start1, uint64_t size1, | ||||
|                                  uint64_t start2, uint64_t size2) | ||||
| { | ||||
|     ram_addr_t ram_addr; | ||||
|     int mfd, rfd; | ||||
|     MemoryRegion *mr; | ||||
| 
 | ||||
|     mr = qemu_ram_addr_from_host((void *)(uintptr_t)start1, &ram_addr); | ||||
|     assert(mr); | ||||
|     mfd = qemu_get_ram_fd(ram_addr); | ||||
| 
 | ||||
|     mr = qemu_ram_addr_from_host((void *)(uintptr_t)start2, &ram_addr); | ||||
|     assert(mr); | ||||
|     rfd = qemu_get_ram_fd(ram_addr); | ||||
| 
 | ||||
|     return mfd == rfd; | ||||
| } | ||||
| 
 | ||||
| const VhostOps user_ops = { | ||||
|         .backend_type = VHOST_BACKEND_TYPE_USER, | ||||
|         .vhost_backend_init = vhost_user_init, | ||||
| @ -633,4 +652,5 @@ const VhostOps user_ops = { | ||||
|         .vhost_set_vring_enable = vhost_user_set_vring_enable, | ||||
|         .vhost_requires_shm_log = vhost_user_requires_shm_log, | ||||
|         .vhost_migration_done = vhost_user_migration_done, | ||||
|         .vhost_backend_can_merge = vhost_user_can_merge, | ||||
| }; | ||||
|  | ||||
| @ -260,6 +260,13 @@ static void vhost_dev_assign_memory(struct vhost_dev *dev, | ||||
|             continue; | ||||
|         } | ||||
| 
 | ||||
|         if (dev->vhost_ops->vhost_backend_can_merge && | ||||
|             !dev->vhost_ops->vhost_backend_can_merge(dev, uaddr, size, | ||||
|                                                      reg->userspace_addr, | ||||
|                                                      reg->memory_size)) { | ||||
|             continue; | ||||
|         } | ||||
| 
 | ||||
|         if (merged) { | ||||
|             --to; | ||||
|             assert(to >= 0); | ||||
|  | ||||
| @ -70,6 +70,9 @@ typedef int (*vhost_set_vring_enable_op)(struct vhost_dev *dev, | ||||
| typedef bool (*vhost_requires_shm_log_op)(struct vhost_dev *dev); | ||||
| typedef int (*vhost_migration_done_op)(struct vhost_dev *dev, | ||||
|                                        char *mac_addr); | ||||
| typedef bool (*vhost_backend_can_merge_op)(struct vhost_dev *dev, | ||||
|                                            uint64_t start1, uint64_t size1, | ||||
|                                            uint64_t start2, uint64_t size2); | ||||
| 
 | ||||
| typedef struct VhostOps { | ||||
|     VhostBackendType backend_type; | ||||
| @ -97,6 +100,7 @@ typedef struct VhostOps { | ||||
|     vhost_set_vring_enable_op vhost_set_vring_enable; | ||||
|     vhost_requires_shm_log_op vhost_requires_shm_log; | ||||
|     vhost_migration_done_op vhost_migration_done; | ||||
|     vhost_backend_can_merge_op vhost_backend_can_merge; | ||||
| } VhostOps; | ||||
| 
 | ||||
| extern const VhostOps user_ops; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Michael S. Tsirkin
						Michael S. Tsirkin