1267f685bSPaolo Bonzini /* 2267f685bSPaolo Bonzini * CPU thread main loop - common bits for user and system mode emulation 3267f685bSPaolo Bonzini * 4267f685bSPaolo Bonzini * Copyright (c) 2003-2005 Fabrice Bellard 5267f685bSPaolo Bonzini * 6267f685bSPaolo Bonzini * This library is free software; you can redistribute it and/or 7267f685bSPaolo Bonzini * modify it under the terms of the GNU Lesser General Public 8267f685bSPaolo Bonzini * License as published by the Free Software Foundation; either 9267f685bSPaolo Bonzini * version 2 of the License, or (at your option) any later version. 10267f685bSPaolo Bonzini * 11267f685bSPaolo Bonzini * This library is distributed in the hope that it will be useful, 12267f685bSPaolo Bonzini * but WITHOUT ANY WARRANTY; without even the implied warranty of 13267f685bSPaolo Bonzini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14267f685bSPaolo Bonzini * Lesser General Public License for more details. 15267f685bSPaolo Bonzini * 16267f685bSPaolo Bonzini * You should have received a copy of the GNU Lesser General Public 17267f685bSPaolo Bonzini * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18267f685bSPaolo Bonzini */ 19267f685bSPaolo Bonzini 20267f685bSPaolo Bonzini #include "qemu/osdep.h" 2153f5ed95SPaolo Bonzini #include "qemu/main-loop.h" 22267f685bSPaolo Bonzini #include "exec/cpu-common.h" 232e5b09fdSMarkus Armbruster #include "hw/core/cpu.h" 24267f685bSPaolo Bonzini #include "sysemu/cpus.h" 256e8a355dSDaniel Brodsky #include "qemu/lockable.h" 26267f685bSPaolo Bonzini 27267f685bSPaolo Bonzini static QemuMutex qemu_cpu_list_lock; 28ab129972SPaolo Bonzini static QemuCond exclusive_cond; 29ab129972SPaolo Bonzini static QemuCond exclusive_resume; 30d148d90eSSergey Fedorov static QemuCond qemu_work_cond; 31267f685bSPaolo Bonzini 32c265e976SPaolo Bonzini /* >= 1 if a thread is inside start_exclusive/end_exclusive. Written 33c265e976SPaolo Bonzini * under qemu_cpu_list_lock, read with atomic operations. 34c265e976SPaolo Bonzini */ 35ab129972SPaolo Bonzini static int pending_cpus; 36ab129972SPaolo Bonzini 37267f685bSPaolo Bonzini void qemu_init_cpu_list(void) 38267f685bSPaolo Bonzini { 39ab129972SPaolo Bonzini /* This is needed because qemu_init_cpu_list is also called by the 40ab129972SPaolo Bonzini * child process in a fork. */ 41ab129972SPaolo Bonzini pending_cpus = 0; 42ab129972SPaolo Bonzini 43267f685bSPaolo Bonzini qemu_mutex_init(&qemu_cpu_list_lock); 44ab129972SPaolo Bonzini qemu_cond_init(&exclusive_cond); 45ab129972SPaolo Bonzini qemu_cond_init(&exclusive_resume); 46d148d90eSSergey Fedorov qemu_cond_init(&qemu_work_cond); 47267f685bSPaolo Bonzini } 48267f685bSPaolo Bonzini 49267f685bSPaolo Bonzini void cpu_list_lock(void) 50267f685bSPaolo Bonzini { 51267f685bSPaolo Bonzini qemu_mutex_lock(&qemu_cpu_list_lock); 52267f685bSPaolo Bonzini } 53267f685bSPaolo Bonzini 54267f685bSPaolo Bonzini void cpu_list_unlock(void) 55267f685bSPaolo Bonzini { 56267f685bSPaolo Bonzini qemu_mutex_unlock(&qemu_cpu_list_lock); 57267f685bSPaolo Bonzini } 58267f685bSPaolo Bonzini 59267f685bSPaolo Bonzini static bool cpu_index_auto_assigned; 60267f685bSPaolo Bonzini 61267f685bSPaolo Bonzini static int cpu_get_free_index(void) 62267f685bSPaolo Bonzini { 63267f685bSPaolo Bonzini CPUState *some_cpu; 64*716386e3SAlex Bennée int max_cpu_index = 0; 65267f685bSPaolo Bonzini 66267f685bSPaolo Bonzini cpu_index_auto_assigned = true; 67267f685bSPaolo Bonzini CPU_FOREACH(some_cpu) { 68*716386e3SAlex Bennée if (some_cpu->cpu_index >= max_cpu_index) { 69*716386e3SAlex Bennée max_cpu_index = some_cpu->cpu_index + 1; 70267f685bSPaolo Bonzini } 71*716386e3SAlex Bennée } 72*716386e3SAlex Bennée return max_cpu_index; 73267f685bSPaolo Bonzini } 74267f685bSPaolo Bonzini 75267f685bSPaolo Bonzini void cpu_list_add(CPUState *cpu) 76267f685bSPaolo Bonzini { 776e8a355dSDaniel Brodsky QEMU_LOCK_GUARD(&qemu_cpu_list_lock); 78267f685bSPaolo Bonzini if (cpu->cpu_index == UNASSIGNED_CPU_INDEX) { 79267f685bSPaolo Bonzini cpu->cpu_index = cpu_get_free_index(); 80267f685bSPaolo Bonzini assert(cpu->cpu_index != UNASSIGNED_CPU_INDEX); 81267f685bSPaolo Bonzini } else { 82267f685bSPaolo Bonzini assert(!cpu_index_auto_assigned); 83267f685bSPaolo Bonzini } 84068a5ea0SEmilio G. Cota QTAILQ_INSERT_TAIL_RCU(&cpus, cpu, node); 85267f685bSPaolo Bonzini } 86267f685bSPaolo Bonzini 87267f685bSPaolo Bonzini void cpu_list_remove(CPUState *cpu) 88267f685bSPaolo Bonzini { 896e8a355dSDaniel Brodsky QEMU_LOCK_GUARD(&qemu_cpu_list_lock); 90267f685bSPaolo Bonzini if (!QTAILQ_IN_USE(cpu, node)) { 91267f685bSPaolo Bonzini /* there is nothing to undo since cpu_exec_init() hasn't been called */ 92267f685bSPaolo Bonzini return; 93267f685bSPaolo Bonzini } 94267f685bSPaolo Bonzini 95068a5ea0SEmilio G. Cota QTAILQ_REMOVE_RCU(&cpus, cpu, node); 96267f685bSPaolo Bonzini cpu->cpu_index = UNASSIGNED_CPU_INDEX; 97267f685bSPaolo Bonzini } 98d148d90eSSergey Fedorov 99d148d90eSSergey Fedorov struct qemu_work_item { 100d148d90eSSergey Fedorov struct qemu_work_item *next; 101d148d90eSSergey Fedorov run_on_cpu_func func; 10214e6fe12SPaolo Bonzini run_on_cpu_data data; 10353f5ed95SPaolo Bonzini bool free, exclusive, done; 104d148d90eSSergey Fedorov }; 105d148d90eSSergey Fedorov 106d148d90eSSergey Fedorov static void queue_work_on_cpu(CPUState *cpu, struct qemu_work_item *wi) 107d148d90eSSergey Fedorov { 108d148d90eSSergey Fedorov qemu_mutex_lock(&cpu->work_mutex); 109d148d90eSSergey Fedorov if (cpu->queued_work_first == NULL) { 110d148d90eSSergey Fedorov cpu->queued_work_first = wi; 111d148d90eSSergey Fedorov } else { 112d148d90eSSergey Fedorov cpu->queued_work_last->next = wi; 113d148d90eSSergey Fedorov } 114d148d90eSSergey Fedorov cpu->queued_work_last = wi; 115d148d90eSSergey Fedorov wi->next = NULL; 116d148d90eSSergey Fedorov wi->done = false; 117d148d90eSSergey Fedorov qemu_mutex_unlock(&cpu->work_mutex); 118d148d90eSSergey Fedorov 119d148d90eSSergey Fedorov qemu_cpu_kick(cpu); 120d148d90eSSergey Fedorov } 121d148d90eSSergey Fedorov 12214e6fe12SPaolo Bonzini void do_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data, 123d148d90eSSergey Fedorov QemuMutex *mutex) 124d148d90eSSergey Fedorov { 125d148d90eSSergey Fedorov struct qemu_work_item wi; 126d148d90eSSergey Fedorov 127d148d90eSSergey Fedorov if (qemu_cpu_is_self(cpu)) { 128d148d90eSSergey Fedorov func(cpu, data); 129d148d90eSSergey Fedorov return; 130d148d90eSSergey Fedorov } 131d148d90eSSergey Fedorov 132d148d90eSSergey Fedorov wi.func = func; 133d148d90eSSergey Fedorov wi.data = data; 1340e55539cSPaolo Bonzini wi.done = false; 135d148d90eSSergey Fedorov wi.free = false; 13653f5ed95SPaolo Bonzini wi.exclusive = false; 137d148d90eSSergey Fedorov 138d148d90eSSergey Fedorov queue_work_on_cpu(cpu, &wi); 139d148d90eSSergey Fedorov while (!atomic_mb_read(&wi.done)) { 140d148d90eSSergey Fedorov CPUState *self_cpu = current_cpu; 141d148d90eSSergey Fedorov 142d148d90eSSergey Fedorov qemu_cond_wait(&qemu_work_cond, mutex); 143d148d90eSSergey Fedorov current_cpu = self_cpu; 144d148d90eSSergey Fedorov } 145d148d90eSSergey Fedorov } 146d148d90eSSergey Fedorov 14714e6fe12SPaolo Bonzini void async_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data) 148d148d90eSSergey Fedorov { 149d148d90eSSergey Fedorov struct qemu_work_item *wi; 150d148d90eSSergey Fedorov 151d148d90eSSergey Fedorov wi = g_malloc0(sizeof(struct qemu_work_item)); 152d148d90eSSergey Fedorov wi->func = func; 153d148d90eSSergey Fedorov wi->data = data; 154d148d90eSSergey Fedorov wi->free = true; 155d148d90eSSergey Fedorov 156d148d90eSSergey Fedorov queue_work_on_cpu(cpu, wi); 157d148d90eSSergey Fedorov } 158d148d90eSSergey Fedorov 159ab129972SPaolo Bonzini /* Wait for pending exclusive operations to complete. The CPU list lock 160ab129972SPaolo Bonzini must be held. */ 161ab129972SPaolo Bonzini static inline void exclusive_idle(void) 162ab129972SPaolo Bonzini { 163ab129972SPaolo Bonzini while (pending_cpus) { 164ab129972SPaolo Bonzini qemu_cond_wait(&exclusive_resume, &qemu_cpu_list_lock); 165ab129972SPaolo Bonzini } 166ab129972SPaolo Bonzini } 167ab129972SPaolo Bonzini 168ab129972SPaolo Bonzini /* Start an exclusive operation. 169758e1b2bSPaolo Bonzini Must only be called from outside cpu_exec. */ 170ab129972SPaolo Bonzini void start_exclusive(void) 171ab129972SPaolo Bonzini { 172ab129972SPaolo Bonzini CPUState *other_cpu; 173c265e976SPaolo Bonzini int running_cpus; 174ab129972SPaolo Bonzini 175ab129972SPaolo Bonzini qemu_mutex_lock(&qemu_cpu_list_lock); 176ab129972SPaolo Bonzini exclusive_idle(); 177ab129972SPaolo Bonzini 178ab129972SPaolo Bonzini /* Make all other cpus stop executing. */ 179c265e976SPaolo Bonzini atomic_set(&pending_cpus, 1); 180c265e976SPaolo Bonzini 181c265e976SPaolo Bonzini /* Write pending_cpus before reading other_cpu->running. */ 182c265e976SPaolo Bonzini smp_mb(); 183c265e976SPaolo Bonzini running_cpus = 0; 184ab129972SPaolo Bonzini CPU_FOREACH(other_cpu) { 185c265e976SPaolo Bonzini if (atomic_read(&other_cpu->running)) { 186c265e976SPaolo Bonzini other_cpu->has_waiter = true; 187c265e976SPaolo Bonzini running_cpus++; 188ab129972SPaolo Bonzini qemu_cpu_kick(other_cpu); 189ab129972SPaolo Bonzini } 190ab129972SPaolo Bonzini } 191c265e976SPaolo Bonzini 192c265e976SPaolo Bonzini atomic_set(&pending_cpus, running_cpus + 1); 193ab129972SPaolo Bonzini while (pending_cpus > 1) { 194ab129972SPaolo Bonzini qemu_cond_wait(&exclusive_cond, &qemu_cpu_list_lock); 195ab129972SPaolo Bonzini } 196758e1b2bSPaolo Bonzini 197758e1b2bSPaolo Bonzini /* Can release mutex, no one will enter another exclusive 198758e1b2bSPaolo Bonzini * section until end_exclusive resets pending_cpus to 0. 199758e1b2bSPaolo Bonzini */ 200758e1b2bSPaolo Bonzini qemu_mutex_unlock(&qemu_cpu_list_lock); 201cfbc3c60SEmilio G. Cota 202cfbc3c60SEmilio G. Cota current_cpu->in_exclusive_context = true; 203ab129972SPaolo Bonzini } 204ab129972SPaolo Bonzini 205758e1b2bSPaolo Bonzini /* Finish an exclusive operation. */ 206ab129972SPaolo Bonzini void end_exclusive(void) 207ab129972SPaolo Bonzini { 208cfbc3c60SEmilio G. Cota current_cpu->in_exclusive_context = false; 209cfbc3c60SEmilio G. Cota 210758e1b2bSPaolo Bonzini qemu_mutex_lock(&qemu_cpu_list_lock); 211c265e976SPaolo Bonzini atomic_set(&pending_cpus, 0); 212ab129972SPaolo Bonzini qemu_cond_broadcast(&exclusive_resume); 213ab129972SPaolo Bonzini qemu_mutex_unlock(&qemu_cpu_list_lock); 214ab129972SPaolo Bonzini } 215ab129972SPaolo Bonzini 216ab129972SPaolo Bonzini /* Wait for exclusive ops to finish, and begin cpu execution. */ 217ab129972SPaolo Bonzini void cpu_exec_start(CPUState *cpu) 218ab129972SPaolo Bonzini { 219c265e976SPaolo Bonzini atomic_set(&cpu->running, true); 220c265e976SPaolo Bonzini 221c265e976SPaolo Bonzini /* Write cpu->running before reading pending_cpus. */ 222c265e976SPaolo Bonzini smp_mb(); 223c265e976SPaolo Bonzini 224c265e976SPaolo Bonzini /* 1. start_exclusive saw cpu->running == true and pending_cpus >= 1. 225c265e976SPaolo Bonzini * After taking the lock we'll see cpu->has_waiter == true and run---not 226c265e976SPaolo Bonzini * for long because start_exclusive kicked us. cpu_exec_end will 227c265e976SPaolo Bonzini * decrement pending_cpus and signal the waiter. 228c265e976SPaolo Bonzini * 229c265e976SPaolo Bonzini * 2. start_exclusive saw cpu->running == false but pending_cpus >= 1. 230c265e976SPaolo Bonzini * This includes the case when an exclusive item is running now. 231c265e976SPaolo Bonzini * Then we'll see cpu->has_waiter == false and wait for the item to 232c265e976SPaolo Bonzini * complete. 233c265e976SPaolo Bonzini * 234c265e976SPaolo Bonzini * 3. pending_cpus == 0. Then start_exclusive is definitely going to 235c265e976SPaolo Bonzini * see cpu->running == true, and it will kick the CPU. 236c265e976SPaolo Bonzini */ 237c265e976SPaolo Bonzini if (unlikely(atomic_read(&pending_cpus))) { 2386e8a355dSDaniel Brodsky QEMU_LOCK_GUARD(&qemu_cpu_list_lock); 239c265e976SPaolo Bonzini if (!cpu->has_waiter) { 240c265e976SPaolo Bonzini /* Not counted in pending_cpus, let the exclusive item 241c265e976SPaolo Bonzini * run. Since we have the lock, just set cpu->running to true 242c265e976SPaolo Bonzini * while holding it; no need to check pending_cpus again. 243c265e976SPaolo Bonzini */ 244c265e976SPaolo Bonzini atomic_set(&cpu->running, false); 245ab129972SPaolo Bonzini exclusive_idle(); 246c265e976SPaolo Bonzini /* Now pending_cpus is zero. */ 247c265e976SPaolo Bonzini atomic_set(&cpu->running, true); 248c265e976SPaolo Bonzini } else { 249c265e976SPaolo Bonzini /* Counted in pending_cpus, go ahead and release the 250c265e976SPaolo Bonzini * waiter at cpu_exec_end. 251c265e976SPaolo Bonzini */ 252c265e976SPaolo Bonzini } 253ab129972SPaolo Bonzini } 254c265e976SPaolo Bonzini } 255ab129972SPaolo Bonzini 256ab129972SPaolo Bonzini /* Mark cpu as not executing, and release pending exclusive ops. */ 257ab129972SPaolo Bonzini void cpu_exec_end(CPUState *cpu) 258ab129972SPaolo Bonzini { 259c265e976SPaolo Bonzini atomic_set(&cpu->running, false); 260c265e976SPaolo Bonzini 261c265e976SPaolo Bonzini /* Write cpu->running before reading pending_cpus. */ 262c265e976SPaolo Bonzini smp_mb(); 263c265e976SPaolo Bonzini 264c265e976SPaolo Bonzini /* 1. start_exclusive saw cpu->running == true. Then it will increment 265c265e976SPaolo Bonzini * pending_cpus and wait for exclusive_cond. After taking the lock 266c265e976SPaolo Bonzini * we'll see cpu->has_waiter == true. 267c265e976SPaolo Bonzini * 268c265e976SPaolo Bonzini * 2. start_exclusive saw cpu->running == false but here pending_cpus >= 1. 269c265e976SPaolo Bonzini * This includes the case when an exclusive item started after setting 270c265e976SPaolo Bonzini * cpu->running to false and before we read pending_cpus. Then we'll see 271c265e976SPaolo Bonzini * cpu->has_waiter == false and not touch pending_cpus. The next call to 272c265e976SPaolo Bonzini * cpu_exec_start will run exclusive_idle if still necessary, thus waiting 273c265e976SPaolo Bonzini * for the item to complete. 274c265e976SPaolo Bonzini * 275c265e976SPaolo Bonzini * 3. pending_cpus == 0. Then start_exclusive is definitely going to 276c265e976SPaolo Bonzini * see cpu->running == false, and it can ignore this CPU until the 277c265e976SPaolo Bonzini * next cpu_exec_start. 278c265e976SPaolo Bonzini */ 279c265e976SPaolo Bonzini if (unlikely(atomic_read(&pending_cpus))) { 2806e8a355dSDaniel Brodsky QEMU_LOCK_GUARD(&qemu_cpu_list_lock); 281c265e976SPaolo Bonzini if (cpu->has_waiter) { 282c265e976SPaolo Bonzini cpu->has_waiter = false; 283c265e976SPaolo Bonzini atomic_set(&pending_cpus, pending_cpus - 1); 284ab129972SPaolo Bonzini if (pending_cpus == 1) { 285ab129972SPaolo Bonzini qemu_cond_signal(&exclusive_cond); 286ab129972SPaolo Bonzini } 287ab129972SPaolo Bonzini } 288ab129972SPaolo Bonzini } 289c265e976SPaolo Bonzini } 290ab129972SPaolo Bonzini 29114e6fe12SPaolo Bonzini void async_safe_run_on_cpu(CPUState *cpu, run_on_cpu_func func, 29214e6fe12SPaolo Bonzini run_on_cpu_data data) 29353f5ed95SPaolo Bonzini { 29453f5ed95SPaolo Bonzini struct qemu_work_item *wi; 29553f5ed95SPaolo Bonzini 29653f5ed95SPaolo Bonzini wi = g_malloc0(sizeof(struct qemu_work_item)); 29753f5ed95SPaolo Bonzini wi->func = func; 29853f5ed95SPaolo Bonzini wi->data = data; 29953f5ed95SPaolo Bonzini wi->free = true; 30053f5ed95SPaolo Bonzini wi->exclusive = true; 30153f5ed95SPaolo Bonzini 30253f5ed95SPaolo Bonzini queue_work_on_cpu(cpu, wi); 30353f5ed95SPaolo Bonzini } 30453f5ed95SPaolo Bonzini 305d148d90eSSergey Fedorov void process_queued_cpu_work(CPUState *cpu) 306d148d90eSSergey Fedorov { 307d148d90eSSergey Fedorov struct qemu_work_item *wi; 308d148d90eSSergey Fedorov 309d148d90eSSergey Fedorov if (cpu->queued_work_first == NULL) { 310d148d90eSSergey Fedorov return; 311d148d90eSSergey Fedorov } 312d148d90eSSergey Fedorov 313d148d90eSSergey Fedorov qemu_mutex_lock(&cpu->work_mutex); 314d148d90eSSergey Fedorov while (cpu->queued_work_first != NULL) { 315d148d90eSSergey Fedorov wi = cpu->queued_work_first; 316d148d90eSSergey Fedorov cpu->queued_work_first = wi->next; 317d148d90eSSergey Fedorov if (!cpu->queued_work_first) { 318d148d90eSSergey Fedorov cpu->queued_work_last = NULL; 319d148d90eSSergey Fedorov } 320d148d90eSSergey Fedorov qemu_mutex_unlock(&cpu->work_mutex); 32153f5ed95SPaolo Bonzini if (wi->exclusive) { 32253f5ed95SPaolo Bonzini /* Running work items outside the BQL avoids the following deadlock: 32353f5ed95SPaolo Bonzini * 1) start_exclusive() is called with the BQL taken while another 32453f5ed95SPaolo Bonzini * CPU is running; 2) cpu_exec in the other CPU tries to takes the 32553f5ed95SPaolo Bonzini * BQL, so it goes to sleep; start_exclusive() is sleeping too, so 32653f5ed95SPaolo Bonzini * neither CPU can proceed. 32753f5ed95SPaolo Bonzini */ 32853f5ed95SPaolo Bonzini qemu_mutex_unlock_iothread(); 32953f5ed95SPaolo Bonzini start_exclusive(); 330d148d90eSSergey Fedorov wi->func(cpu, wi->data); 33153f5ed95SPaolo Bonzini end_exclusive(); 33253f5ed95SPaolo Bonzini qemu_mutex_lock_iothread(); 33353f5ed95SPaolo Bonzini } else { 33453f5ed95SPaolo Bonzini wi->func(cpu, wi->data); 33553f5ed95SPaolo Bonzini } 336d148d90eSSergey Fedorov qemu_mutex_lock(&cpu->work_mutex); 337d148d90eSSergey Fedorov if (wi->free) { 338d148d90eSSergey Fedorov g_free(wi); 339d148d90eSSergey Fedorov } else { 340d148d90eSSergey Fedorov atomic_mb_set(&wi->done, true); 341d148d90eSSergey Fedorov } 342d148d90eSSergey Fedorov } 343d148d90eSSergey Fedorov qemu_mutex_unlock(&cpu->work_mutex); 344d148d90eSSergey Fedorov qemu_cond_broadcast(&qemu_work_cond); 345d148d90eSSergey Fedorov } 346