kvm_main.c 28.4 KB
Newer Older
A
Avi Kivity 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Kernel-based Virtual Machine driver for Linux
 *
 * This module enables machines with Intel VT-x extensions to run virtual
 * machines without emulation or binary translation.
 *
 * Copyright (C) 2006 Qumranet, Inc.
 *
 * Authors:
 *   Avi Kivity   <avi@qumranet.com>
 *   Yaniv Kamay  <yaniv@qumranet.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
 */

18
#include "iodev.h"
A
Avi Kivity 已提交
19

20
#include <linux/kvm_host.h>
A
Avi Kivity 已提交
21 22 23 24 25 26 27 28 29 30 31 32
#include <linux/kvm.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/percpu.h>
#include <linux/gfp.h>
#include <linux/mm.h>
#include <linux/miscdevice.h>
#include <linux/vmalloc.h>
#include <linux/reboot.h>
#include <linux/debugfs.h>
#include <linux/highmem.h>
#include <linux/file.h>
33
#include <linux/sysdev.h>
A
Avi Kivity 已提交
34
#include <linux/cpu.h>
A
Alexey Dobriyan 已提交
35
#include <linux/sched.h>
36 37
#include <linux/cpumask.h>
#include <linux/smp.h>
38
#include <linux/anon_inodes.h>
39
#include <linux/profile.h>
40
#include <linux/kvm_para.h>
41
#include <linux/pagemap.h>
42
#include <linux/mman.h>
A
Avi Kivity 已提交
43

A
Avi Kivity 已提交
44 45 46
#include <asm/processor.h>
#include <asm/io.h>
#include <asm/uaccess.h>
47
#include <asm/pgtable.h>
A
Avi Kivity 已提交
48 49 50 51

MODULE_AUTHOR("Qumranet");
MODULE_LICENSE("GPL");

52 53
DEFINE_SPINLOCK(kvm_lock);
LIST_HEAD(vm_list);
54

55 56
static cpumask_t cpus_hardware_enabled;

57 58
struct kmem_cache *kvm_vcpu_cache;
EXPORT_SYMBOL_GPL(kvm_vcpu_cache);
A
Avi Kivity 已提交
59

60 61
static __read_mostly struct preempt_ops kvm_preempt_ops;

A
Avi Kivity 已提交
62 63
static struct dentry *debugfs_dir;

A
Avi Kivity 已提交
64 65 66
static long kvm_vcpu_ioctl(struct file *file, unsigned int ioctl,
			   unsigned long arg);

67 68 69 70 71
static inline int valid_vcpu(int n)
{
	return likely(n >= 0 && n < KVM_MAX_VCPUS);
}

A
Avi Kivity 已提交
72 73 74
/*
 * Switches to specified vcpu, until a matching vcpu_put()
 */
75
void vcpu_load(struct kvm_vcpu *vcpu)
A
Avi Kivity 已提交
76
{
77 78
	int cpu;

A
Avi Kivity 已提交
79
	mutex_lock(&vcpu->mutex);
80 81
	cpu = get_cpu();
	preempt_notifier_register(&vcpu->preempt_notifier);
82
	kvm_arch_vcpu_load(vcpu, cpu);
83
	put_cpu();
A
Avi Kivity 已提交
84 85
}

86
void vcpu_put(struct kvm_vcpu *vcpu)
A
Avi Kivity 已提交
87
{
88
	preempt_disable();
89
	kvm_arch_vcpu_put(vcpu);
90 91
	preempt_notifier_unregister(&vcpu->preempt_notifier);
	preempt_enable();
A
Avi Kivity 已提交
92 93 94
	mutex_unlock(&vcpu->mutex);
}

95 96 97 98 99 100
static void ack_flush(void *_completed)
{
}

void kvm_flush_remote_tlbs(struct kvm *kvm)
{
101
	int i, cpu;
102 103 104 105
	cpumask_t cpus;
	struct kvm_vcpu *vcpu;

	cpus_clear(cpus);
R
Rusty Russell 已提交
106 107 108 109
	for (i = 0; i < KVM_MAX_VCPUS; ++i) {
		vcpu = kvm->vcpus[i];
		if (!vcpu)
			continue;
110
		if (test_and_set_bit(KVM_REQ_TLB_FLUSH, &vcpu->requests))
111 112 113
			continue;
		cpu = vcpu->cpu;
		if (cpu != -1 && cpu != raw_smp_processor_id())
114
			cpu_set(cpu, cpus);
115
	}
116 117 118
	if (cpus_empty(cpus))
		return;
	++kvm->stat.remote_tlb_flush;
119
	smp_call_function_mask(cpus, ack_flush, NULL, 1);
120 121
}

R
Rusty Russell 已提交
122 123 124 125 126 127 128 129 130
int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id)
{
	struct page *page;
	int r;

	mutex_init(&vcpu->mutex);
	vcpu->cpu = -1;
	vcpu->kvm = kvm;
	vcpu->vcpu_id = id;
E
Eddie Dong 已提交
131
	init_waitqueue_head(&vcpu->wq);
R
Rusty Russell 已提交
132 133 134 135 136 137 138 139

	page = alloc_page(GFP_KERNEL | __GFP_ZERO);
	if (!page) {
		r = -ENOMEM;
		goto fail;
	}
	vcpu->run = page_address(page);

140
	r = kvm_arch_vcpu_init(vcpu);
R
Rusty Russell 已提交
141
	if (r < 0)
142
		goto fail_free_run;
R
Rusty Russell 已提交
143 144 145 146 147
	return 0;

fail_free_run:
	free_page((unsigned long)vcpu->run);
fail:
148
	return r;
R
Rusty Russell 已提交
149 150 151 152 153
}
EXPORT_SYMBOL_GPL(kvm_vcpu_init);

void kvm_vcpu_uninit(struct kvm_vcpu *vcpu)
{
154
	kvm_arch_vcpu_uninit(vcpu);
R
Rusty Russell 已提交
155 156 157 158
	free_page((unsigned long)vcpu->run);
}
EXPORT_SYMBOL_GPL(kvm_vcpu_uninit);

159
static struct kvm *kvm_create_vm(void)
A
Avi Kivity 已提交
160
{
161
	struct kvm *kvm = kvm_arch_create_vm();
A
Avi Kivity 已提交
162

163 164
	if (IS_ERR(kvm))
		goto out;
A
Avi Kivity 已提交
165

166 167
	kvm->mm = current->mm;
	atomic_inc(&kvm->mm->mm_count);
168
	spin_lock_init(&kvm->mmu_lock);
169
	kvm_io_bus_init(&kvm->pio_bus);
S
Shaohua Li 已提交
170
	mutex_init(&kvm->lock);
171
	kvm_io_bus_init(&kvm->mmio_bus);
172 173 174
	spin_lock(&kvm_lock);
	list_add(&kvm->vm_list, &vm_list);
	spin_unlock(&kvm_lock);
175
out:
176 177 178
	return kvm;
}

A
Avi Kivity 已提交
179 180 181 182 183 184
/*
 * Free any memory in @free but not in @dont.
 */
static void kvm_free_physmem_slot(struct kvm_memory_slot *free,
				  struct kvm_memory_slot *dont)
{
185 186
	if (!dont || free->rmap != dont->rmap)
		vfree(free->rmap);
A
Avi Kivity 已提交
187 188 189 190 191

	if (!dont || free->dirty_bitmap != dont->dirty_bitmap)
		vfree(free->dirty_bitmap);

	free->npages = 0;
A
Al Viro 已提交
192
	free->dirty_bitmap = NULL;
193
	free->rmap = NULL;
A
Avi Kivity 已提交
194 195
}

196
void kvm_free_physmem(struct kvm *kvm)
A
Avi Kivity 已提交
197 198 199 200
{
	int i;

	for (i = 0; i < kvm->nmemslots; ++i)
A
Al Viro 已提交
201
		kvm_free_physmem_slot(&kvm->memslots[i], NULL);
A
Avi Kivity 已提交
202 203
}

204 205
static void kvm_destroy_vm(struct kvm *kvm)
{
206 207
	struct mm_struct *mm = kvm->mm;

208 209 210
	spin_lock(&kvm_lock);
	list_del(&kvm->vm_list);
	spin_unlock(&kvm_lock);
211
	kvm_io_bus_destroy(&kvm->pio_bus);
212
	kvm_io_bus_destroy(&kvm->mmio_bus);
213
	kvm_arch_destroy_vm(kvm);
214
	mmdrop(mm);
215 216 217 218 219 220 221
}

static int kvm_vm_release(struct inode *inode, struct file *filp)
{
	struct kvm *kvm = filp->private_data;

	kvm_destroy_vm(kvm);
A
Avi Kivity 已提交
222 223 224 225 226 227 228 229
	return 0;
}

/*
 * Allocate some memory and give it an address in the guest physical address
 * space.
 *
 * Discontiguous memory is allowed, mostly for framebuffers.
230
 *
231
 * Must be called holding mmap_sem for write.
A
Avi Kivity 已提交
232
 */
233 234 235
int __kvm_set_memory_region(struct kvm *kvm,
			    struct kvm_userspace_memory_region *mem,
			    int user_alloc)
A
Avi Kivity 已提交
236 237 238 239 240 241 242 243 244 245 246 247 248 249
{
	int r;
	gfn_t base_gfn;
	unsigned long npages;
	unsigned long i;
	struct kvm_memory_slot *memslot;
	struct kvm_memory_slot old, new;

	r = -EINVAL;
	/* General sanity checks */
	if (mem->memory_size & (PAGE_SIZE - 1))
		goto out;
	if (mem->guest_phys_addr & (PAGE_SIZE - 1))
		goto out;
250
	if (mem->slot >= KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS)
A
Avi Kivity 已提交
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
		goto out;
	if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr)
		goto out;

	memslot = &kvm->memslots[mem->slot];
	base_gfn = mem->guest_phys_addr >> PAGE_SHIFT;
	npages = mem->memory_size >> PAGE_SHIFT;

	if (!npages)
		mem->flags &= ~KVM_MEM_LOG_DIRTY_PAGES;

	new = old = *memslot;

	new.base_gfn = base_gfn;
	new.npages = npages;
	new.flags = mem->flags;

	/* Disallow changing a memory slot's size. */
	r = -EINVAL;
	if (npages && old.npages && npages != old.npages)
271
		goto out_free;
A
Avi Kivity 已提交
272 273 274 275 276 277 278 279 280 281

	/* Check for overlaps */
	r = -EEXIST;
	for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
		struct kvm_memory_slot *s = &kvm->memslots[i];

		if (s == memslot)
			continue;
		if (!((base_gfn + npages <= s->base_gfn) ||
		      (base_gfn >= s->base_gfn + s->npages)))
282
			goto out_free;
A
Avi Kivity 已提交
283 284 285 286
	}

	/* Free page dirty bitmap if unneeded */
	if (!(new.flags & KVM_MEM_LOG_DIRTY_PAGES))
A
Al Viro 已提交
287
		new.dirty_bitmap = NULL;
A
Avi Kivity 已提交
288 289 290 291

	r = -ENOMEM;

	/* Allocate if a slot is being created */
292
	if (npages && !new.rmap) {
M
Mike Day 已提交
293
		new.rmap = vmalloc(npages * sizeof(struct page *));
294 295

		if (!new.rmap)
296
			goto out_free;
297 298

		memset(new.rmap, 0, npages * sizeof(*new.rmap));
299

300
		new.user_alloc = user_alloc;
301
		new.userspace_addr = mem->userspace_addr;
A
Avi Kivity 已提交
302 303 304 305 306 307 308 309
	}

	/* Allocate page dirty bitmap if needed */
	if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) {
		unsigned dirty_bytes = ALIGN(npages, BITS_PER_LONG) / 8;

		new.dirty_bitmap = vmalloc(dirty_bytes);
		if (!new.dirty_bitmap)
310
			goto out_free;
A
Avi Kivity 已提交
311 312 313 314 315 316
		memset(new.dirty_bitmap, 0, dirty_bytes);
	}

	if (mem->slot >= kvm->nmemslots)
		kvm->nmemslots = mem->slot + 1;

317 318
	*memslot = new;

319 320 321 322
	r = kvm_arch_set_memory_region(kvm, mem, old, user_alloc);
	if (r) {
		*memslot = old;
		goto out_free;
323 324
	}

A
Avi Kivity 已提交
325 326 327
	kvm_free_physmem_slot(&old, &new);
	return 0;

328
out_free:
A
Avi Kivity 已提交
329 330 331
	kvm_free_physmem_slot(&new, &old);
out:
	return r;
332 333

}
334 335 336 337 338 339 340 341
EXPORT_SYMBOL_GPL(__kvm_set_memory_region);

int kvm_set_memory_region(struct kvm *kvm,
			  struct kvm_userspace_memory_region *mem,
			  int user_alloc)
{
	int r;

342
	down_write(&current->mm->mmap_sem);
343
	r = __kvm_set_memory_region(kvm, mem, user_alloc);
344
	up_write(&current->mm->mmap_sem);
345 346
	return r;
}
347 348
EXPORT_SYMBOL_GPL(kvm_set_memory_region);

349 350 351 352
int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
				   struct
				   kvm_userspace_memory_region *mem,
				   int user_alloc)
353
{
354 355
	if (mem->slot >= KVM_MEMORY_SLOTS)
		return -EINVAL;
356
	return kvm_set_memory_region(kvm, mem, user_alloc);
A
Avi Kivity 已提交
357 358
}

359 360
int kvm_get_dirty_log(struct kvm *kvm,
			struct kvm_dirty_log *log, int *is_dirty)
A
Avi Kivity 已提交
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375
{
	struct kvm_memory_slot *memslot;
	int r, i;
	int n;
	unsigned long any = 0;

	r = -EINVAL;
	if (log->slot >= KVM_MEMORY_SLOTS)
		goto out;

	memslot = &kvm->memslots[log->slot];
	r = -ENOENT;
	if (!memslot->dirty_bitmap)
		goto out;

376
	n = ALIGN(memslot->npages, BITS_PER_LONG) / 8;
A
Avi Kivity 已提交
377

378
	for (i = 0; !any && i < n/sizeof(long); ++i)
A
Avi Kivity 已提交
379 380 381 382 383 384
		any = memslot->dirty_bitmap[i];

	r = -EFAULT;
	if (copy_to_user(log->dirty_bitmap, memslot->dirty_bitmap, n))
		goto out;

385 386
	if (any)
		*is_dirty = 1;
A
Avi Kivity 已提交
387 388 389 390 391 392

	r = 0;
out:
	return r;
}

393 394 395 396 397 398
int is_error_page(struct page *page)
{
	return page == bad_page;
}
EXPORT_SYMBOL_GPL(is_error_page);

I
Izik Eidus 已提交
399 400 401 402 403 404 405 406 407 408 409
static inline unsigned long bad_hva(void)
{
	return PAGE_OFFSET;
}

int kvm_is_error_hva(unsigned long addr)
{
	return addr == bad_hva();
}
EXPORT_SYMBOL_GPL(kvm_is_error_hva);

410
static struct kvm_memory_slot *__gfn_to_memslot(struct kvm *kvm, gfn_t gfn)
A
Avi Kivity 已提交
411 412 413 414 415 416 417 418 419 420
{
	int i;

	for (i = 0; i < kvm->nmemslots; ++i) {
		struct kvm_memory_slot *memslot = &kvm->memslots[i];

		if (gfn >= memslot->base_gfn
		    && gfn < memslot->base_gfn + memslot->npages)
			return memslot;
	}
A
Al Viro 已提交
421
	return NULL;
A
Avi Kivity 已提交
422
}
423 424 425 426 427 428

struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn)
{
	gfn = unalias_gfn(kvm, gfn);
	return __gfn_to_memslot(kvm, gfn);
}
A
Avi Kivity 已提交
429

430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn)
{
	int i;

	gfn = unalias_gfn(kvm, gfn);
	for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
		struct kvm_memory_slot *memslot = &kvm->memslots[i];

		if (gfn >= memslot->base_gfn
		    && gfn < memslot->base_gfn + memslot->npages)
			return 1;
	}
	return 0;
}
EXPORT_SYMBOL_GPL(kvm_is_visible_gfn);

I
Izik Eidus 已提交
446 447 448 449 450 451 452 453 454 455 456
static unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn)
{
	struct kvm_memory_slot *slot;

	gfn = unalias_gfn(kvm, gfn);
	slot = __gfn_to_memslot(kvm, gfn);
	if (!slot)
		return bad_hva();
	return (slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE);
}

457 458 459
/*
 * Requires current->mm->mmap_sem to be held
 */
460
struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn)
A
Avi Kivity 已提交
461
{
462
	struct page *page[1];
I
Izik Eidus 已提交
463
	unsigned long addr;
464
	int npages;
A
Avi Kivity 已提交
465

466 467
	might_sleep();

I
Izik Eidus 已提交
468 469
	addr = gfn_to_hva(kvm, gfn);
	if (kvm_is_error_hva(addr)) {
470
		get_page(bad_page);
471
		return bad_page;
472
	}
473

I
Izik Eidus 已提交
474 475 476
	npages = get_user_pages(current, current->mm, addr, 1, 1, 1, page,
				NULL);

477 478 479
	if (npages != 1) {
		get_page(bad_page);
		return bad_page;
480
	}
481 482

	return page[0];
A
Avi Kivity 已提交
483
}
484

A
Avi Kivity 已提交
485 486
EXPORT_SYMBOL_GPL(gfn_to_page);

487 488 489 490 491 492 493
void kvm_release_page_clean(struct page *page)
{
	put_page(page);
}
EXPORT_SYMBOL_GPL(kvm_release_page_clean);

void kvm_release_page_dirty(struct page *page)
494 495 496 497 498
{
	if (!PageReserved(page))
		SetPageDirty(page);
	put_page(page);
}
499
EXPORT_SYMBOL_GPL(kvm_release_page_dirty);
500

501 502 503 504 505 506 507 508 509 510 511
static int next_segment(unsigned long len, int offset)
{
	if (len > PAGE_SIZE - offset)
		return PAGE_SIZE - offset;
	else
		return len;
}

int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset,
			int len)
{
512 513
	int r;
	unsigned long addr;
514

515 516 517 518 519
	addr = gfn_to_hva(kvm, gfn);
	if (kvm_is_error_hva(addr))
		return -EFAULT;
	r = copy_from_user(data, (void __user *)addr + offset, len);
	if (r)
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
		return -EFAULT;
	return 0;
}
EXPORT_SYMBOL_GPL(kvm_read_guest_page);

int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len)
{
	gfn_t gfn = gpa >> PAGE_SHIFT;
	int seg;
	int offset = offset_in_page(gpa);
	int ret;

	while ((seg = next_segment(len, offset)) != 0) {
		ret = kvm_read_guest_page(kvm, gfn, data, offset, seg);
		if (ret < 0)
			return ret;
		offset = 0;
		len -= seg;
		data += seg;
		++gfn;
	}
	return 0;
}
EXPORT_SYMBOL_GPL(kvm_read_guest);

545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data,
			  unsigned long len)
{
	int r;
	unsigned long addr;
	gfn_t gfn = gpa >> PAGE_SHIFT;
	int offset = offset_in_page(gpa);

	addr = gfn_to_hva(kvm, gfn);
	if (kvm_is_error_hva(addr))
		return -EFAULT;
	r = __copy_from_user_inatomic(data, (void __user *)addr + offset, len);
	if (r)
		return -EFAULT;
	return 0;
}
EXPORT_SYMBOL(kvm_read_guest_atomic);

563 564 565
int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data,
			 int offset, int len)
{
566 567
	int r;
	unsigned long addr;
568

569 570 571 572 573
	addr = gfn_to_hva(kvm, gfn);
	if (kvm_is_error_hva(addr))
		return -EFAULT;
	r = copy_to_user((void __user *)addr + offset, data, len);
	if (r)
574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
		return -EFAULT;
	mark_page_dirty(kvm, gfn);
	return 0;
}
EXPORT_SYMBOL_GPL(kvm_write_guest_page);

int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data,
		    unsigned long len)
{
	gfn_t gfn = gpa >> PAGE_SHIFT;
	int seg;
	int offset = offset_in_page(gpa);
	int ret;

	while ((seg = next_segment(len, offset)) != 0) {
		ret = kvm_write_guest_page(kvm, gfn, data, offset, seg);
		if (ret < 0)
			return ret;
		offset = 0;
		len -= seg;
		data += seg;
		++gfn;
	}
	return 0;
}

int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len)
{
602
	return kvm_write_guest_page(kvm, gfn, empty_zero_page, offset, len);
603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
}
EXPORT_SYMBOL_GPL(kvm_clear_guest_page);

int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len)
{
	gfn_t gfn = gpa >> PAGE_SHIFT;
	int seg;
	int offset = offset_in_page(gpa);
	int ret;

        while ((seg = next_segment(len, offset)) != 0) {
		ret = kvm_clear_guest_page(kvm, gfn, offset, seg);
		if (ret < 0)
			return ret;
		offset = 0;
		len -= seg;
		++gfn;
	}
	return 0;
}
EXPORT_SYMBOL_GPL(kvm_clear_guest);

A
Avi Kivity 已提交
625 626
void mark_page_dirty(struct kvm *kvm, gfn_t gfn)
{
627
	struct kvm_memory_slot *memslot;
A
Avi Kivity 已提交
628

629
	gfn = unalias_gfn(kvm, gfn);
R
Rusty Russell 已提交
630 631 632
	memslot = __gfn_to_memslot(kvm, gfn);
	if (memslot && memslot->dirty_bitmap) {
		unsigned long rel_gfn = gfn - memslot->base_gfn;
A
Avi Kivity 已提交
633

R
Rusty Russell 已提交
634 635 636
		/* avoid RMW */
		if (!test_bit(rel_gfn, memslot->dirty_bitmap))
			set_bit(rel_gfn, memslot->dirty_bitmap);
A
Avi Kivity 已提交
637 638 639
	}
}

E
Eddie Dong 已提交
640 641 642
/*
 * The vCPU has executed a HLT instruction with in-kernel mode enabled.
 */
643
void kvm_vcpu_block(struct kvm_vcpu *vcpu)
644
{
E
Eddie Dong 已提交
645 646 647 648 649 650 651
	DECLARE_WAITQUEUE(wait, current);

	add_wait_queue(&vcpu->wq, &wait);

	/*
	 * We will block until either an interrupt or a signal wakes us up
	 */
652 653
	while (!kvm_cpu_has_interrupt(vcpu)
	       && !signal_pending(current)
654
	       && !kvm_arch_vcpu_runnable(vcpu)) {
E
Eddie Dong 已提交
655 656 657 658 659
		set_current_state(TASK_INTERRUPTIBLE);
		vcpu_put(vcpu);
		schedule();
		vcpu_load(vcpu);
	}
660

661
	__set_current_state(TASK_RUNNING);
E
Eddie Dong 已提交
662 663 664
	remove_wait_queue(&vcpu->wq, &wait);
}

A
Avi Kivity 已提交
665 666
void kvm_resched(struct kvm_vcpu *vcpu)
{
667 668
	if (!need_resched())
		return;
A
Avi Kivity 已提交
669 670 671 672
	cond_resched();
}
EXPORT_SYMBOL_GPL(kvm_resched);

673
static int kvm_vcpu_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
674 675 676 677
{
	struct kvm_vcpu *vcpu = vma->vm_file->private_data;
	struct page *page;

678
	if (vmf->pgoff == 0)
679
		page = virt_to_page(vcpu->run);
680
	else if (vmf->pgoff == KVM_PIO_PAGE_OFFSET)
681
		page = virt_to_page(vcpu->arch.pio_data);
682
	else
683
		return VM_FAULT_SIGBUS;
684
	get_page(page);
685 686
	vmf->page = page;
	return 0;
687 688 689
}

static struct vm_operations_struct kvm_vcpu_vm_ops = {
690
	.fault = kvm_vcpu_fault,
691 692 693 694 695 696 697 698
};

static int kvm_vcpu_mmap(struct file *file, struct vm_area_struct *vma)
{
	vma->vm_ops = &kvm_vcpu_vm_ops;
	return 0;
}

A
Avi Kivity 已提交
699 700 701 702 703 704 705 706 707 708 709 710
static int kvm_vcpu_release(struct inode *inode, struct file *filp)
{
	struct kvm_vcpu *vcpu = filp->private_data;

	fput(vcpu->kvm->filp);
	return 0;
}

static struct file_operations kvm_vcpu_fops = {
	.release        = kvm_vcpu_release,
	.unlocked_ioctl = kvm_vcpu_ioctl,
	.compat_ioctl   = kvm_vcpu_ioctl,
711
	.mmap           = kvm_vcpu_mmap,
A
Avi Kivity 已提交
712 713 714 715 716 717 718 719 720 721 722
};

/*
 * Allocates an inode for the vcpu.
 */
static int create_vcpu_fd(struct kvm_vcpu *vcpu)
{
	int fd, r;
	struct inode *inode;
	struct file *file;

723 724 725 726
	r = anon_inode_getfd(&fd, &inode, &file,
			     "kvm-vcpu", &kvm_vcpu_fops, vcpu);
	if (r)
		return r;
A
Avi Kivity 已提交
727 728 729 730
	atomic_inc(&vcpu->kvm->filp->f_count);
	return fd;
}

731 732 733 734 735 736 737 738 739
/*
 * Creates some virtual cpus.  Good luck creating more than one.
 */
static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, int n)
{
	int r;
	struct kvm_vcpu *vcpu;

	if (!valid_vcpu(n))
R
Rusty Russell 已提交
740
		return -EINVAL;
741

742
	vcpu = kvm_arch_vcpu_create(kvm, n);
R
Rusty Russell 已提交
743 744
	if (IS_ERR(vcpu))
		return PTR_ERR(vcpu);
745

746 747
	preempt_notifier_init(&vcpu->preempt_notifier, &kvm_preempt_ops);

748 749 750 751
	r = kvm_arch_vcpu_setup(vcpu);
	if (r)
		goto vcpu_destroy;

S
Shaohua Li 已提交
752
	mutex_lock(&kvm->lock);
R
Rusty Russell 已提交
753 754
	if (kvm->vcpus[n]) {
		r = -EEXIST;
S
Shaohua Li 已提交
755
		mutex_unlock(&kvm->lock);
756
		goto vcpu_destroy;
R
Rusty Russell 已提交
757 758
	}
	kvm->vcpus[n] = vcpu;
S
Shaohua Li 已提交
759
	mutex_unlock(&kvm->lock);
760

R
Rusty Russell 已提交
761
	/* Now it's all set up, let userspace reach it */
A
Avi Kivity 已提交
762 763
	r = create_vcpu_fd(vcpu);
	if (r < 0)
R
Rusty Russell 已提交
764 765
		goto unlink;
	return r;
766

R
Rusty Russell 已提交
767
unlink:
S
Shaohua Li 已提交
768
	mutex_lock(&kvm->lock);
R
Rusty Russell 已提交
769
	kvm->vcpus[n] = NULL;
S
Shaohua Li 已提交
770
	mutex_unlock(&kvm->lock);
771
vcpu_destroy:
772
	kvm_arch_vcpu_destroy(vcpu);
773 774 775
	return r;
}

A
Avi Kivity 已提交
776 777 778 779 780 781 782 783 784 785 786
static int kvm_vcpu_ioctl_set_sigmask(struct kvm_vcpu *vcpu, sigset_t *sigset)
{
	if (sigset) {
		sigdelsetmask(sigset, sigmask(SIGKILL)|sigmask(SIGSTOP));
		vcpu->sigset_active = 1;
		vcpu->sigset = *sigset;
	} else
		vcpu->sigset_active = 0;
	return 0;
}

A
Avi Kivity 已提交
787 788
static long kvm_vcpu_ioctl(struct file *filp,
			   unsigned int ioctl, unsigned long arg)
A
Avi Kivity 已提交
789
{
A
Avi Kivity 已提交
790
	struct kvm_vcpu *vcpu = filp->private_data;
A
Al Viro 已提交
791
	void __user *argp = (void __user *)arg;
792
	int r;
A
Avi Kivity 已提交
793

794 795
	if (vcpu->kvm->mm != current->mm)
		return -EIO;
A
Avi Kivity 已提交
796
	switch (ioctl) {
797
	case KVM_RUN:
798 799 800
		r = -EINVAL;
		if (arg)
			goto out;
801
		r = kvm_arch_vcpu_ioctl_run(vcpu, vcpu->run);
A
Avi Kivity 已提交
802 803 804 805
		break;
	case KVM_GET_REGS: {
		struct kvm_regs kvm_regs;

A
Avi Kivity 已提交
806
		memset(&kvm_regs, 0, sizeof kvm_regs);
807
		r = kvm_arch_vcpu_ioctl_get_regs(vcpu, &kvm_regs);
A
Avi Kivity 已提交
808 809 810
		if (r)
			goto out;
		r = -EFAULT;
A
Al Viro 已提交
811
		if (copy_to_user(argp, &kvm_regs, sizeof kvm_regs))
A
Avi Kivity 已提交
812 813 814 815 816 817 818 819
			goto out;
		r = 0;
		break;
	}
	case KVM_SET_REGS: {
		struct kvm_regs kvm_regs;

		r = -EFAULT;
A
Al Viro 已提交
820
		if (copy_from_user(&kvm_regs, argp, sizeof kvm_regs))
A
Avi Kivity 已提交
821
			goto out;
822
		r = kvm_arch_vcpu_ioctl_set_regs(vcpu, &kvm_regs);
A
Avi Kivity 已提交
823 824 825 826 827 828 829 830
		if (r)
			goto out;
		r = 0;
		break;
	}
	case KVM_GET_SREGS: {
		struct kvm_sregs kvm_sregs;

A
Avi Kivity 已提交
831
		memset(&kvm_sregs, 0, sizeof kvm_sregs);
832
		r = kvm_arch_vcpu_ioctl_get_sregs(vcpu, &kvm_sregs);
A
Avi Kivity 已提交
833 834 835
		if (r)
			goto out;
		r = -EFAULT;
A
Al Viro 已提交
836
		if (copy_to_user(argp, &kvm_sregs, sizeof kvm_sregs))
A
Avi Kivity 已提交
837 838 839 840 841 842 843 844
			goto out;
		r = 0;
		break;
	}
	case KVM_SET_SREGS: {
		struct kvm_sregs kvm_sregs;

		r = -EFAULT;
A
Al Viro 已提交
845
		if (copy_from_user(&kvm_sregs, argp, sizeof kvm_sregs))
A
Avi Kivity 已提交
846
			goto out;
847
		r = kvm_arch_vcpu_ioctl_set_sregs(vcpu, &kvm_sregs);
A
Avi Kivity 已提交
848 849 850 851 852 853 854 855 856
		if (r)
			goto out;
		r = 0;
		break;
	}
	case KVM_TRANSLATE: {
		struct kvm_translation tr;

		r = -EFAULT;
A
Al Viro 已提交
857
		if (copy_from_user(&tr, argp, sizeof tr))
A
Avi Kivity 已提交
858
			goto out;
859
		r = kvm_arch_vcpu_ioctl_translate(vcpu, &tr);
A
Avi Kivity 已提交
860 861 862
		if (r)
			goto out;
		r = -EFAULT;
A
Al Viro 已提交
863
		if (copy_to_user(argp, &tr, sizeof tr))
A
Avi Kivity 已提交
864 865 866 867 868 869 870 871
			goto out;
		r = 0;
		break;
	}
	case KVM_DEBUG_GUEST: {
		struct kvm_debug_guest dbg;

		r = -EFAULT;
A
Al Viro 已提交
872
		if (copy_from_user(&dbg, argp, sizeof dbg))
A
Avi Kivity 已提交
873
			goto out;
874
		r = kvm_arch_vcpu_ioctl_debug_guest(vcpu, &dbg);
A
Avi Kivity 已提交
875 876 877 878 879
		if (r)
			goto out;
		r = 0;
		break;
	}
A
Avi Kivity 已提交
880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902
	case KVM_SET_SIGNAL_MASK: {
		struct kvm_signal_mask __user *sigmask_arg = argp;
		struct kvm_signal_mask kvm_sigmask;
		sigset_t sigset, *p;

		p = NULL;
		if (argp) {
			r = -EFAULT;
			if (copy_from_user(&kvm_sigmask, argp,
					   sizeof kvm_sigmask))
				goto out;
			r = -EINVAL;
			if (kvm_sigmask.len != sizeof sigset)
				goto out;
			r = -EFAULT;
			if (copy_from_user(&sigset, sigmask_arg->sigset,
					   sizeof sigset))
				goto out;
			p = &sigset;
		}
		r = kvm_vcpu_ioctl_set_sigmask(vcpu, &sigset);
		break;
	}
A
Avi Kivity 已提交
903 904 905 906
	case KVM_GET_FPU: {
		struct kvm_fpu fpu;

		memset(&fpu, 0, sizeof fpu);
907
		r = kvm_arch_vcpu_ioctl_get_fpu(vcpu, &fpu);
A
Avi Kivity 已提交
908 909 910 911 912 913 914 915 916 917 918 919 920 921
		if (r)
			goto out;
		r = -EFAULT;
		if (copy_to_user(argp, &fpu, sizeof fpu))
			goto out;
		r = 0;
		break;
	}
	case KVM_SET_FPU: {
		struct kvm_fpu fpu;

		r = -EFAULT;
		if (copy_from_user(&fpu, argp, sizeof fpu))
			goto out;
922
		r = kvm_arch_vcpu_ioctl_set_fpu(vcpu, &fpu);
A
Avi Kivity 已提交
923 924 925 926 927
		if (r)
			goto out;
		r = 0;
		break;
	}
A
Avi Kivity 已提交
928
	default:
929
		r = kvm_arch_vcpu_ioctl(filp, ioctl, arg);
A
Avi Kivity 已提交
930 931 932 933 934 935 936 937 938 939
	}
out:
	return r;
}

static long kvm_vm_ioctl(struct file *filp,
			   unsigned int ioctl, unsigned long arg)
{
	struct kvm *kvm = filp->private_data;
	void __user *argp = (void __user *)arg;
940
	int r;
A
Avi Kivity 已提交
941

942 943
	if (kvm->mm != current->mm)
		return -EIO;
A
Avi Kivity 已提交
944 945 946 947 948 949
	switch (ioctl) {
	case KVM_CREATE_VCPU:
		r = kvm_vm_ioctl_create_vcpu(kvm, arg);
		if (r < 0)
			goto out;
		break;
950 951 952 953 954 955 956 957 958
	case KVM_SET_USER_MEMORY_REGION: {
		struct kvm_userspace_memory_region kvm_userspace_mem;

		r = -EFAULT;
		if (copy_from_user(&kvm_userspace_mem, argp,
						sizeof kvm_userspace_mem))
			goto out;

		r = kvm_vm_ioctl_set_memory_region(kvm, &kvm_userspace_mem, 1);
A
Avi Kivity 已提交
959 960 961 962 963 964 965 966
		if (r)
			goto out;
		break;
	}
	case KVM_GET_DIRTY_LOG: {
		struct kvm_dirty_log log;

		r = -EFAULT;
A
Al Viro 已提交
967
		if (copy_from_user(&log, argp, sizeof log))
A
Avi Kivity 已提交
968
			goto out;
969
		r = kvm_vm_ioctl_get_dirty_log(kvm, &log);
A
Avi Kivity 已提交
970 971 972 973
		if (r)
			goto out;
		break;
	}
974
	default:
975
		r = kvm_arch_vm_ioctl(filp, ioctl, arg);
976 977 978 979 980
	}
out:
	return r;
}

981
static int kvm_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
982 983 984 985
{
	struct kvm *kvm = vma->vm_file->private_data;
	struct page *page;

986 987
	if (!kvm_is_visible_gfn(kvm, vmf->pgoff))
		return VM_FAULT_SIGBUS;
988
	page = gfn_to_page(kvm, vmf->pgoff);
989
	if (is_error_page(page)) {
990
		kvm_release_page_clean(page);
991
		return VM_FAULT_SIGBUS;
992
	}
993 994
	vmf->page = page;
	return 0;
995 996 997
}

static struct vm_operations_struct kvm_vm_vm_ops = {
998
	.fault = kvm_vm_fault,
999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
};

static int kvm_vm_mmap(struct file *file, struct vm_area_struct *vma)
{
	vma->vm_ops = &kvm_vm_vm_ops;
	return 0;
}

static struct file_operations kvm_vm_fops = {
	.release        = kvm_vm_release,
	.unlocked_ioctl = kvm_vm_ioctl,
	.compat_ioctl   = kvm_vm_ioctl,
	.mmap           = kvm_vm_mmap,
};

static int kvm_dev_ioctl_create_vm(void)
{
	int fd, r;
	struct inode *inode;
	struct file *file;
	struct kvm *kvm;

	kvm = kvm_create_vm();
1022 1023 1024 1025 1026 1027
	if (IS_ERR(kvm))
		return PTR_ERR(kvm);
	r = anon_inode_getfd(&fd, &inode, &file, "kvm-vm", &kvm_vm_fops, kvm);
	if (r) {
		kvm_destroy_vm(kvm);
		return r;
1028 1029
	}

A
Avi Kivity 已提交
1030
	kvm->filp = file;
1031 1032 1033 1034 1035 1036 1037 1038

	return fd;
}

static long kvm_dev_ioctl(struct file *filp,
			  unsigned int ioctl, unsigned long arg)
{
	void __user *argp = (void __user *)arg;
1039
	long r = -EINVAL;
1040 1041 1042

	switch (ioctl) {
	case KVM_GET_API_VERSION:
1043 1044 1045
		r = -EINVAL;
		if (arg)
			goto out;
1046 1047 1048
		r = KVM_API_VERSION;
		break;
	case KVM_CREATE_VM:
1049 1050 1051
		r = -EINVAL;
		if (arg)
			goto out;
1052 1053
		r = kvm_dev_ioctl_create_vm();
		break;
1054 1055
	case KVM_CHECK_EXTENSION:
		r = kvm_dev_ioctl_check_extension((long)argp);
1056
		break;
1057 1058 1059 1060
	case KVM_GET_VCPU_MMAP_SIZE:
		r = -EINVAL;
		if (arg)
			goto out;
1061
		r = 2 * PAGE_SIZE;
1062
		break;
A
Avi Kivity 已提交
1063
	default:
1064
		return kvm_arch_dev_ioctl(filp, ioctl, arg);
A
Avi Kivity 已提交
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075
	}
out:
	return r;
}

static struct file_operations kvm_chardev_ops = {
	.unlocked_ioctl = kvm_dev_ioctl,
	.compat_ioctl   = kvm_dev_ioctl,
};

static struct miscdevice kvm_dev = {
A
Avi Kivity 已提交
1076
	KVM_MINOR,
A
Avi Kivity 已提交
1077 1078 1079 1080
	"kvm",
	&kvm_chardev_ops,
};

1081 1082 1083 1084 1085 1086 1087
static void hardware_enable(void *junk)
{
	int cpu = raw_smp_processor_id();

	if (cpu_isset(cpu, cpus_hardware_enabled))
		return;
	cpu_set(cpu, cpus_hardware_enabled);
1088
	kvm_arch_hardware_enable(NULL);
1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
}

static void hardware_disable(void *junk)
{
	int cpu = raw_smp_processor_id();

	if (!cpu_isset(cpu, cpus_hardware_enabled))
		return;
	cpu_clear(cpu, cpus_hardware_enabled);
	decache_vcpus_on_cpu(cpu);
1099
	kvm_arch_hardware_disable(NULL);
1100 1101
}

A
Avi Kivity 已提交
1102 1103 1104 1105 1106
static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val,
			   void *v)
{
	int cpu = (long)v;

1107
	val &= ~CPU_TASKS_FROZEN;
A
Avi Kivity 已提交
1108
	switch (val) {
1109
	case CPU_DYING:
1110 1111 1112 1113
		printk(KERN_INFO "kvm: disabling virtualization on CPU%d\n",
		       cpu);
		hardware_disable(NULL);
		break;
A
Avi Kivity 已提交
1114
	case CPU_UP_CANCELED:
1115 1116
		printk(KERN_INFO "kvm: disabling virtualization on CPU%d\n",
		       cpu);
1117
		smp_call_function_single(cpu, hardware_disable, NULL, 0, 1);
A
Avi Kivity 已提交
1118
		break;
1119 1120 1121
	case CPU_ONLINE:
		printk(KERN_INFO "kvm: enabling virtualization on CPU%d\n",
		       cpu);
1122
		smp_call_function_single(cpu, hardware_enable, NULL, 0, 1);
A
Avi Kivity 已提交
1123 1124 1125 1126 1127
		break;
	}
	return NOTIFY_OK;
}

1128
static int kvm_reboot(struct notifier_block *notifier, unsigned long val,
M
Mike Day 已提交
1129
		      void *v)
1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
{
	if (val == SYS_RESTART) {
		/*
		 * Some (well, at least mine) BIOSes hang on reboot if
		 * in vmx root mode.
		 */
		printk(KERN_INFO "kvm: exiting hardware virtualization\n");
		on_each_cpu(hardware_disable, NULL, 0, 1);
	}
	return NOTIFY_OK;
}

static struct notifier_block kvm_reboot_notifier = {
	.notifier_call = kvm_reboot,
	.priority = 0,
};

1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183
void kvm_io_bus_init(struct kvm_io_bus *bus)
{
	memset(bus, 0, sizeof(*bus));
}

void kvm_io_bus_destroy(struct kvm_io_bus *bus)
{
	int i;

	for (i = 0; i < bus->dev_count; i++) {
		struct kvm_io_device *pos = bus->devs[i];

		kvm_iodevice_destructor(pos);
	}
}

struct kvm_io_device *kvm_io_bus_find_dev(struct kvm_io_bus *bus, gpa_t addr)
{
	int i;

	for (i = 0; i < bus->dev_count; i++) {
		struct kvm_io_device *pos = bus->devs[i];

		if (pos->in_range(pos, addr))
			return pos;
	}

	return NULL;
}

void kvm_io_bus_register_dev(struct kvm_io_bus *bus, struct kvm_io_device *dev)
{
	BUG_ON(bus->dev_count > (NR_IOBUS_DEVS-1));

	bus->devs[bus->dev_count++] = dev;
}

A
Avi Kivity 已提交
1184 1185 1186 1187 1188
static struct notifier_block kvm_cpu_notifier = {
	.notifier_call = kvm_cpu_hotplug,
	.priority = 20, /* must be > scheduler priority */
};

1189
static int vm_stat_get(void *_offset, u64 *val)
1190 1191 1192 1193
{
	unsigned offset = (long)_offset;
	struct kvm *kvm;

1194
	*val = 0;
1195 1196
	spin_lock(&kvm_lock);
	list_for_each_entry(kvm, &vm_list, vm_list)
1197
		*val += *(u32 *)((void *)kvm + offset);
1198
	spin_unlock(&kvm_lock);
1199
	return 0;
1200 1201 1202 1203
}

DEFINE_SIMPLE_ATTRIBUTE(vm_stat_fops, vm_stat_get, NULL, "%llu\n");

1204
static int vcpu_stat_get(void *_offset, u64 *val)
A
Avi Kivity 已提交
1205 1206 1207 1208 1209 1210
{
	unsigned offset = (long)_offset;
	struct kvm *kvm;
	struct kvm_vcpu *vcpu;
	int i;

1211
	*val = 0;
A
Avi Kivity 已提交
1212 1213 1214
	spin_lock(&kvm_lock);
	list_for_each_entry(kvm, &vm_list, vm_list)
		for (i = 0; i < KVM_MAX_VCPUS; ++i) {
R
Rusty Russell 已提交
1215 1216
			vcpu = kvm->vcpus[i];
			if (vcpu)
1217
				*val += *(u32 *)((void *)vcpu + offset);
A
Avi Kivity 已提交
1218 1219
		}
	spin_unlock(&kvm_lock);
1220
	return 0;
A
Avi Kivity 已提交
1221 1222
}

1223 1224 1225 1226 1227 1228
DEFINE_SIMPLE_ATTRIBUTE(vcpu_stat_fops, vcpu_stat_get, NULL, "%llu\n");

static struct file_operations *stat_fops[] = {
	[KVM_STAT_VCPU] = &vcpu_stat_fops,
	[KVM_STAT_VM]   = &vm_stat_fops,
};
A
Avi Kivity 已提交
1229

1230
static void kvm_init_debug(void)
A
Avi Kivity 已提交
1231 1232 1233
{
	struct kvm_stats_debugfs_item *p;

A
Al Viro 已提交
1234
	debugfs_dir = debugfs_create_dir("kvm", NULL);
A
Avi Kivity 已提交
1235
	for (p = debugfs_entries; p->name; ++p)
A
Avi Kivity 已提交
1236 1237
		p->dentry = debugfs_create_file(p->name, 0444, debugfs_dir,
						(void *)(long)p->offset,
1238
						stat_fops[p->kind]);
A
Avi Kivity 已提交
1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249
}

static void kvm_exit_debug(void)
{
	struct kvm_stats_debugfs_item *p;

	for (p = debugfs_entries; p->name; ++p)
		debugfs_remove(p->dentry);
	debugfs_remove(debugfs_dir);
}

1250 1251
static int kvm_suspend(struct sys_device *dev, pm_message_t state)
{
A
Avi Kivity 已提交
1252
	hardware_disable(NULL);
1253 1254 1255 1256 1257
	return 0;
}

static int kvm_resume(struct sys_device *dev)
{
A
Avi Kivity 已提交
1258
	hardware_enable(NULL);
1259 1260 1261 1262
	return 0;
}

static struct sysdev_class kvm_sysdev_class = {
1263
	.name = "kvm",
1264 1265 1266 1267 1268 1269 1270 1271 1272
	.suspend = kvm_suspend,
	.resume = kvm_resume,
};

static struct sys_device kvm_sysdev = {
	.id = 0,
	.cls = &kvm_sysdev_class,
};

1273
struct page *bad_page;
A
Avi Kivity 已提交
1274

1275 1276 1277 1278 1279 1280 1281 1282 1283 1284
static inline
struct kvm_vcpu *preempt_notifier_to_vcpu(struct preempt_notifier *pn)
{
	return container_of(pn, struct kvm_vcpu, preempt_notifier);
}

static void kvm_sched_in(struct preempt_notifier *pn, int cpu)
{
	struct kvm_vcpu *vcpu = preempt_notifier_to_vcpu(pn);

1285
	kvm_arch_vcpu_load(vcpu, cpu);
1286 1287 1288 1289 1290 1291 1292
}

static void kvm_sched_out(struct preempt_notifier *pn,
			  struct task_struct *next)
{
	struct kvm_vcpu *vcpu = preempt_notifier_to_vcpu(pn);

1293
	kvm_arch_vcpu_put(vcpu);
1294 1295
}

1296
int kvm_init(void *opaque, unsigned int vcpu_size,
1297
		  struct module *module)
A
Avi Kivity 已提交
1298 1299
{
	int r;
Y
Yang, Sheng 已提交
1300
	int cpu;
A
Avi Kivity 已提交
1301

1302 1303
	kvm_init_debug();

1304 1305
	r = kvm_arch_init(opaque);
	if (r)
1306
		goto out_fail;
1307 1308 1309 1310 1311 1312 1313 1314

	bad_page = alloc_page(GFP_KERNEL | __GFP_ZERO);

	if (bad_page == NULL) {
		r = -ENOMEM;
		goto out;
	}

1315
	r = kvm_arch_hardware_setup();
A
Avi Kivity 已提交
1316
	if (r < 0)
1317
		goto out_free_0;
A
Avi Kivity 已提交
1318

Y
Yang, Sheng 已提交
1319 1320
	for_each_online_cpu(cpu) {
		smp_call_function_single(cpu,
1321
				kvm_arch_check_processor_compat,
Y
Yang, Sheng 已提交
1322 1323
				&r, 0, 1);
		if (r < 0)
1324
			goto out_free_1;
Y
Yang, Sheng 已提交
1325 1326
	}

1327
	on_each_cpu(hardware_enable, NULL, 0, 1);
A
Avi Kivity 已提交
1328 1329
	r = register_cpu_notifier(&kvm_cpu_notifier);
	if (r)
1330
		goto out_free_2;
A
Avi Kivity 已提交
1331 1332
	register_reboot_notifier(&kvm_reboot_notifier);

1333 1334
	r = sysdev_class_register(&kvm_sysdev_class);
	if (r)
1335
		goto out_free_3;
1336 1337 1338

	r = sysdev_register(&kvm_sysdev);
	if (r)
1339
		goto out_free_4;
1340

1341 1342
	/* A kmem cache lets us meet the alignment requirements of fx_save. */
	kvm_vcpu_cache = kmem_cache_create("kvm_vcpu", vcpu_size,
J
Joe Perches 已提交
1343 1344
					   __alignof__(struct kvm_vcpu),
					   0, NULL);
1345 1346
	if (!kvm_vcpu_cache) {
		r = -ENOMEM;
1347
		goto out_free_5;
1348 1349
	}

A
Avi Kivity 已提交
1350 1351 1352 1353
	kvm_chardev_ops.owner = module;

	r = misc_register(&kvm_dev);
	if (r) {
M
Mike Day 已提交
1354
		printk(KERN_ERR "kvm: misc device register failed\n");
A
Avi Kivity 已提交
1355 1356 1357
		goto out_free;
	}

1358 1359 1360
	kvm_preempt_ops.sched_in = kvm_sched_in;
	kvm_preempt_ops.sched_out = kvm_sched_out;

1361
	return 0;
A
Avi Kivity 已提交
1362 1363

out_free:
1364
	kmem_cache_destroy(kvm_vcpu_cache);
1365
out_free_5:
1366
	sysdev_unregister(&kvm_sysdev);
1367
out_free_4:
1368
	sysdev_class_unregister(&kvm_sysdev_class);
1369
out_free_3:
A
Avi Kivity 已提交
1370
	unregister_reboot_notifier(&kvm_reboot_notifier);
A
Avi Kivity 已提交
1371
	unregister_cpu_notifier(&kvm_cpu_notifier);
1372
out_free_2:
1373
	on_each_cpu(hardware_disable, NULL, 0, 1);
1374
out_free_1:
1375
	kvm_arch_hardware_unsetup();
1376 1377
out_free_0:
	__free_page(bad_page);
1378
out:
1379
	kvm_arch_exit();
1380
	kvm_exit_debug();
1381
out_fail:
A
Avi Kivity 已提交
1382 1383
	return r;
}
1384
EXPORT_SYMBOL_GPL(kvm_init);
A
Avi Kivity 已提交
1385

1386
void kvm_exit(void)
A
Avi Kivity 已提交
1387 1388
{
	misc_deregister(&kvm_dev);
1389
	kmem_cache_destroy(kvm_vcpu_cache);
1390 1391
	sysdev_unregister(&kvm_sysdev);
	sysdev_class_unregister(&kvm_sysdev_class);
A
Avi Kivity 已提交
1392
	unregister_reboot_notifier(&kvm_reboot_notifier);
1393
	unregister_cpu_notifier(&kvm_cpu_notifier);
1394
	on_each_cpu(hardware_disable, NULL, 0, 1);
1395
	kvm_arch_hardware_unsetup();
1396
	kvm_arch_exit();
A
Avi Kivity 已提交
1397
	kvm_exit_debug();
1398
	__free_page(bad_page);
A
Avi Kivity 已提交
1399
}
1400
EXPORT_SYMBOL_GPL(kvm_exit);