translate-all: make less of tb_invalidate_phys_page_range depend on is_cpu_write_access
is_cpu_write_access is only set if tb_invalidate_phys_page_range is called from tb_invalidate_phys_page_fast, and hence from notdirty_mem_write. However: - the code bitmap can be built directly in tb_invalidate_phys_page_fast (unconditionally, since is_cpu_write_access would always be passed as 1); - the virtual address is not needed to mark the page as "not containing code" (dirty code bitmap = 1), so we can also remove that use of is_cpu_write_access. For calls of tb_invalidate_phys_page_range that do not come from notdirty_mem_write, the next call to notdirty_mem_write will notice that the page does not contain code anymore, and will fix up the TLB entry. The parameter needs to remain in order to guard accesses to cpu->mem_io_pc. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									9564f52da7
								
							
						
					
					
						commit
						fc377bcf61
					
				@ -1082,12 +1082,6 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
 | 
			
		||||
    if (!p) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    if (!p->code_bitmap &&
 | 
			
		||||
        ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD &&
 | 
			
		||||
        is_cpu_write_access) {
 | 
			
		||||
        /* build code bitmap */
 | 
			
		||||
        build_page_bitmap(p);
 | 
			
		||||
    }
 | 
			
		||||
#if defined(TARGET_HAS_PRECISE_SMC)
 | 
			
		||||
    if (cpu != NULL) {
 | 
			
		||||
        env = cpu->env_ptr;
 | 
			
		||||
@ -1157,9 +1151,7 @@ void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
 | 
			
		||||
    /* if no code remaining, no need to continue to use slow writes */
 | 
			
		||||
    if (!p->first_tb) {
 | 
			
		||||
        invalidate_page_bitmap(p);
 | 
			
		||||
        if (is_cpu_write_access) {
 | 
			
		||||
            tlb_unprotect_code(start);
 | 
			
		||||
        }
 | 
			
		||||
        tlb_unprotect_code(start);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef TARGET_HAS_PRECISE_SMC
 | 
			
		||||
@ -1192,6 +1184,11 @@ void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len)
 | 
			
		||||
    if (!p) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    if (!p->code_bitmap &&
 | 
			
		||||
        ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD) {
 | 
			
		||||
        /* build code bitmap */
 | 
			
		||||
        build_page_bitmap(p);
 | 
			
		||||
    }
 | 
			
		||||
    if (p->code_bitmap) {
 | 
			
		||||
        unsigned int nr;
 | 
			
		||||
        unsigned long b;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user