 8d04fb55de
			
		
	
	
		8d04fb55de
		
	
	
	
	
		
			
			This finally allows TCG to benefit from the iothread introduction: Drop the global mutex while running pure TCG CPU code. Reacquire the lock when entering MMIO or PIO emulation, or when leaving the TCG loop. We have to revert a few optimization for the current TCG threading model, namely kicking the TCG thread in qemu_mutex_lock_iothread and not kicking it in qemu_cpu_kick. We also need to disable RAM block reordering until we have a more efficient locking mechanism at hand. Still, a Linux x86 UP guest and my Musicpal ARM model boot fine here. These numbers demonstrate where we gain something: 20338 jan 20 0 331m 75m 6904 R 99 0.9 0:50.95 qemu-system-arm 20337 jan 20 0 331m 75m 6904 S 20 0.9 0:26.50 qemu-system-arm The guest CPU was fully loaded, but the iothread could still run mostly independent on a second core. Without the patch we don't get beyond 32206 jan 20 0 330m 73m 7036 R 82 0.9 1:06.00 qemu-system-arm 32204 jan 20 0 330m 73m 7036 S 21 0.9 0:17.03 qemu-system-arm We don't benefit significantly, though, when the guest is not fully loading a host CPU. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Message-Id: <1439220437-23957-10-git-send-email-fred.konrad@greensocs.com> [FK: Rebase, fix qemu_devices_reset deadlock, rm address_space_* mutex] Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com> [EGC: fixed iothread lock for cpu-exec IRQ handling] Signed-off-by: Emilio G. Cota <cota@braap.org> [AJB: -smp single-threaded fix, clean commit msg, BQL fixes] Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <rth@twiddle.net> Reviewed-by: Pranith Kumar <bobby.prani@gmail.com> [PM: target-arm changes] Acked-by: Peter Maydell <peter.maydell@linaro.org>
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  Host code generation common components
 | |
|  *
 | |
|  *  Copyright (c) 2015 Peter Crosthwaite <crosthwaite.peter@gmail.com>
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Lesser General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This library is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public
 | |
|  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| #include "qemu/osdep.h"
 | |
| #include "qemu-common.h"
 | |
| #include "qom/cpu.h"
 | |
| #include "sysemu/cpus.h"
 | |
| #include "qemu/main-loop.h"
 | |
| 
 | |
| uintptr_t qemu_real_host_page_size;
 | |
| intptr_t qemu_real_host_page_mask;
 | |
| 
 | |
| #ifndef CONFIG_USER_ONLY
 | |
| /* mask must never be zero, except for A20 change call */
 | |
| static void tcg_handle_interrupt(CPUState *cpu, int mask)
 | |
| {
 | |
|     int old_mask;
 | |
|     g_assert(qemu_mutex_iothread_locked());
 | |
| 
 | |
|     old_mask = cpu->interrupt_request;
 | |
|     cpu->interrupt_request |= mask;
 | |
| 
 | |
|     /*
 | |
|      * If called from iothread context, wake the target cpu in
 | |
|      * case its halted.
 | |
|      */
 | |
|     if (!qemu_cpu_is_self(cpu)) {
 | |
|         qemu_cpu_kick(cpu);
 | |
|     } else {
 | |
|         if (use_icount) {
 | |
|             cpu->icount_decr.u16.high = 0xffff;
 | |
|             if (!cpu->can_do_io
 | |
|                 && (mask & ~old_mask) != 0) {
 | |
|                 cpu_abort(cpu, "Raised interrupt while not in I/O function");
 | |
|             }
 | |
|         } else {
 | |
|             cpu->tcg_exit_req = 1;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt;
 | |
| #endif
 |