vhost+postcopy: Add vhost waker
Register a waker function in vhost-user code to be notified when pages arrive or requests to previously mapped pages get requested. Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
							parent
							
								
									d488b349a3
								
							
						
					
					
						commit
						c07e36158f
					
				| @ -13,6 +13,9 @@ vhost_user_postcopy_fault_handler_found(int i, uint64_t region_offset, uint64_t | ||||
| vhost_user_postcopy_listen(void) "" | ||||
| vhost_user_set_mem_table_postcopy(uint64_t client_addr, uint64_t qhva, int reply_i, int region_i) "client:0x%"PRIx64" for hva: 0x%"PRIx64" reply %d region %d" | ||||
| vhost_user_set_mem_table_withfd(int index, const char *name, uint64_t memory_size, uint64_t guest_phys_addr, uint64_t userspace_addr, uint64_t offset) "%d:%s: size:0x%"PRIx64" GPA:0x%"PRIx64" QVA/userspace:0x%"PRIx64" RB offset:0x%"PRIx64 | ||||
| vhost_user_postcopy_waker(const char *rb, uint64_t rb_offset) "%s + 0x%"PRIx64 | ||||
| vhost_user_postcopy_waker_found(uint64_t client_addr) "0x%"PRIx64 | ||||
| vhost_user_postcopy_waker_nomatch(const char *rb, uint64_t rb_offset) "%s + 0x%"PRIx64 | ||||
| 
 | ||||
| # hw/virtio/virtio.c | ||||
| virtqueue_alloc_element(void *elem, size_t sz, unsigned in_num, unsigned out_num) "elem %p size %zd in_num %u out_num %u" | ||||
|  | ||||
| @ -1006,6 +1006,35 @@ static int vhost_user_postcopy_fault_handler(struct PostCopyFD *pcfd, | ||||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| static int vhost_user_postcopy_waker(struct PostCopyFD *pcfd, RAMBlock *rb, | ||||
|                                      uint64_t offset) | ||||
| { | ||||
|     struct vhost_dev *dev = pcfd->data; | ||||
|     struct vhost_user *u = dev->opaque; | ||||
|     int i; | ||||
| 
 | ||||
|     trace_vhost_user_postcopy_waker(qemu_ram_get_idstr(rb), offset); | ||||
| 
 | ||||
|     if (!u) { | ||||
|         return 0; | ||||
|     } | ||||
|     /* Translate the offset into an address in the clients address space */ | ||||
|     for (i = 0; i < MIN(dev->mem->nregions, u->region_rb_len); i++) { | ||||
|         if (u->region_rb[i] == rb && | ||||
|             offset >= u->region_rb_offset[i] && | ||||
|             offset < (u->region_rb_offset[i] + | ||||
|                       dev->mem->regions[i].memory_size)) { | ||||
|             uint64_t client_addr = (offset - u->region_rb_offset[i]) + | ||||
|                                    u->postcopy_client_bases[i]; | ||||
|             trace_vhost_user_postcopy_waker_found(client_addr); | ||||
|             return postcopy_wake_shared(pcfd, client_addr, rb); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     trace_vhost_user_postcopy_waker_nomatch(qemu_ram_get_idstr(rb), offset); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Called at the start of an inbound postcopy on reception of the | ||||
|  * 'advise' command. | ||||
| @ -1051,6 +1080,7 @@ static int vhost_user_postcopy_advise(struct vhost_dev *dev, Error **errp) | ||||
|     u->postcopy_fd.fd = ufd; | ||||
|     u->postcopy_fd.data = dev; | ||||
|     u->postcopy_fd.handler = vhost_user_postcopy_fault_handler; | ||||
|     u->postcopy_fd.waker = vhost_user_postcopy_waker; | ||||
|     u->postcopy_fd.idstr = "vhost-user"; /* Need to find unique name */ | ||||
|     postcopy_register_shared_ufd(&u->postcopy_fd); | ||||
|     return 0; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dr. David Alan Gilbert
						Dr. David Alan Gilbert