address_space_destroy_dispatch is called from an RCU callback and hence outside the iothread mutex (BQL). However, after address_space_destroy no new accesses can hit the destroyed AddressSpace so it is not necessary to observe changes to the memory map. Move the memory_listener_unregister call earlier, to make it thread-safe again. Reported-by: Alex Williamson <alex.williamson@redhat.com> Fixes: 374f2981d1f10bc4307f250f24b2a7ddb9b14be0 Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
		
			
				
	
	
		
			36 lines
		
	
	
		
			915 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			915 B
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Declarations for obsolete exec.c functions
 | 
						|
 *
 | 
						|
 * Copyright 2011 Red Hat, Inc. and/or its affiliates
 | 
						|
 *
 | 
						|
 * Authors:
 | 
						|
 *  Avi Kivity <avi@redhat.com>
 | 
						|
 *
 | 
						|
 * This work is licensed under the terms of the GNU GPL, version 2 or
 | 
						|
 * later.  See the COPYING file in the top-level directory.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 * This header is for use by exec.c and memory.c ONLY.  Do not include it.
 | 
						|
 * The functions declared here will be removed soon.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef MEMORY_INTERNAL_H
 | 
						|
#define MEMORY_INTERNAL_H
 | 
						|
 | 
						|
#ifndef CONFIG_USER_ONLY
 | 
						|
typedef struct AddressSpaceDispatch AddressSpaceDispatch;
 | 
						|
 | 
						|
void address_space_init_dispatch(AddressSpace *as);
 | 
						|
void address_space_unregister(AddressSpace *as);
 | 
						|
void address_space_destroy_dispatch(AddressSpace *as);
 | 
						|
 | 
						|
extern const MemoryRegionOps unassigned_mem_ops;
 | 
						|
 | 
						|
bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr,
 | 
						|
                                unsigned size, bool is_write);
 | 
						|
 | 
						|
#endif
 | 
						|
#endif
 |