vhost: allow backends to filter memory sections
This patch introduces a vhost op for vhost backends to allow them to filter the memory sections that they can handle. Signed-off-by: Tiwei Bie <tiwei.bie@intel.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
							parent
							
								
									63b88968f1
								
							
						
					
					
						commit
						988a27754b
					
				@ -1620,6 +1620,16 @@ vhost_user_crypto_close_session(struct vhost_dev *dev, uint64_t session_id)
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool vhost_user_mem_section_filter(struct vhost_dev *dev,
 | 
				
			||||||
 | 
					                                          MemoryRegionSection *section)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    bool result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    result = memory_region_get_fd(section->mr) >= 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const VhostOps user_ops = {
 | 
					const VhostOps user_ops = {
 | 
				
			||||||
        .backend_type = VHOST_BACKEND_TYPE_USER,
 | 
					        .backend_type = VHOST_BACKEND_TYPE_USER,
 | 
				
			||||||
        .vhost_backend_init = vhost_user_init,
 | 
					        .vhost_backend_init = vhost_user_init,
 | 
				
			||||||
@ -1650,4 +1660,5 @@ const VhostOps user_ops = {
 | 
				
			|||||||
        .vhost_set_config = vhost_user_set_config,
 | 
					        .vhost_set_config = vhost_user_set_config,
 | 
				
			||||||
        .vhost_crypto_create_session = vhost_user_crypto_create_session,
 | 
					        .vhost_crypto_create_session = vhost_user_crypto_create_session,
 | 
				
			||||||
        .vhost_crypto_close_session = vhost_user_crypto_close_session,
 | 
					        .vhost_crypto_close_session = vhost_user_crypto_close_session,
 | 
				
			||||||
 | 
					        .vhost_backend_mem_section_filter = vhost_user_mem_section_filter,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -386,7 +386,7 @@ static int vhost_verify_ring_mappings(struct vhost_dev *dev,
 | 
				
			|||||||
    return r;
 | 
					    return r;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool vhost_section(MemoryRegionSection *section)
 | 
					static bool vhost_section(struct vhost_dev *dev, MemoryRegionSection *section)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    bool result;
 | 
					    bool result;
 | 
				
			||||||
    bool log_dirty = memory_region_get_dirty_log_mask(section->mr) &
 | 
					    bool log_dirty = memory_region_get_dirty_log_mask(section->mr) &
 | 
				
			||||||
@ -399,6 +399,11 @@ static bool vhost_section(MemoryRegionSection *section)
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    result &= !log_dirty;
 | 
					    result &= !log_dirty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (result && dev->vhost_ops->vhost_backend_mem_section_filter) {
 | 
				
			||||||
 | 
					        result &=
 | 
				
			||||||
 | 
					            dev->vhost_ops->vhost_backend_mem_section_filter(dev, section);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    trace_vhost_section(section->mr->name, result);
 | 
					    trace_vhost_section(section->mr->name, result);
 | 
				
			||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -632,7 +637,7 @@ static void vhost_region_addnop(MemoryListener *listener,
 | 
				
			|||||||
    struct vhost_dev *dev = container_of(listener, struct vhost_dev,
 | 
					    struct vhost_dev *dev = container_of(listener, struct vhost_dev,
 | 
				
			||||||
                                         memory_listener);
 | 
					                                         memory_listener);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!vhost_section(section)) {
 | 
					    if (!vhost_section(dev, section)) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    vhost_region_add_section(dev, section);
 | 
					    vhost_region_add_section(dev, section);
 | 
				
			||||||
 | 
				
			|||||||
@ -101,6 +101,9 @@ typedef int (*vhost_crypto_create_session_op)(struct vhost_dev *dev,
 | 
				
			|||||||
typedef int (*vhost_crypto_close_session_op)(struct vhost_dev *dev,
 | 
					typedef int (*vhost_crypto_close_session_op)(struct vhost_dev *dev,
 | 
				
			||||||
                                             uint64_t session_id);
 | 
					                                             uint64_t session_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef bool (*vhost_backend_mem_section_filter_op)(struct vhost_dev *dev,
 | 
				
			||||||
 | 
					                                                MemoryRegionSection *section);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct VhostOps {
 | 
					typedef struct VhostOps {
 | 
				
			||||||
    VhostBackendType backend_type;
 | 
					    VhostBackendType backend_type;
 | 
				
			||||||
    vhost_backend_init vhost_backend_init;
 | 
					    vhost_backend_init vhost_backend_init;
 | 
				
			||||||
@ -138,6 +141,7 @@ typedef struct VhostOps {
 | 
				
			|||||||
    vhost_set_config_op vhost_set_config;
 | 
					    vhost_set_config_op vhost_set_config;
 | 
				
			||||||
    vhost_crypto_create_session_op vhost_crypto_create_session;
 | 
					    vhost_crypto_create_session_op vhost_crypto_create_session;
 | 
				
			||||||
    vhost_crypto_close_session_op vhost_crypto_close_session;
 | 
					    vhost_crypto_close_session_op vhost_crypto_close_session;
 | 
				
			||||||
 | 
					    vhost_backend_mem_section_filter_op vhost_backend_mem_section_filter;
 | 
				
			||||||
} VhostOps;
 | 
					} VhostOps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const VhostOps user_ops;
 | 
					extern const VhostOps user_ops;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user