Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F97083199
D10070.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
19 KB
Referenced Files
None
Subscribers
None
D10070.diff
View Options
Index: sys/amd64/vmm/amd/svm.c
===================================================================
--- sys/amd64/vmm/amd/svm.c
+++ sys/amd64/vmm/amd/svm.c
@@ -98,6 +98,9 @@
static MALLOC_DEFINE(M_SVM, "svm", "svm");
static MALLOC_DEFINE(M_SVM_VLAPIC, "svm-vlapic", "svm-vlapic");
+/* Number of vCPUs */
+extern u_int maxvcpus;
+
/* Per-CPU context area. */
extern struct pcpu __pcpu[];
@@ -558,7 +561,7 @@
iopm_pa = vtophys(svm_sc->iopm_bitmap);
msrpm_pa = vtophys(svm_sc->msr_bitmap);
pml4_pa = svm_sc->nptp;
- for (i = 0; i < VM_MAXCPU; i++) {
+ for (i = 0; i < maxvcpus; i++) {
vcpu = svm_get_vcpu(svm_sc, i);
vcpu->nextrip = ~0;
vcpu->lastcpu = NOCPU;
Index: sys/amd64/vmm/amd/svm_softc.h
===================================================================
--- sys/amd64/vmm/amd/svm_softc.h
+++ sys/amd64/vmm/amd/svm_softc.h
@@ -58,6 +58,7 @@
struct svm_softc {
uint8_t iopm_bitmap[SVM_IO_BITMAP_SIZE]; /* shared by all vcpus */
uint8_t msr_bitmap[SVM_MSR_BITMAP_SIZE]; /* shared by all vcpus */
+ /* FIXME: make this maxvcpus */
uint8_t apic_page[VM_MAXCPU][PAGE_SIZE];
struct svm_vcpu vcpu[VM_MAXCPU];
vm_offset_t nptp; /* nested page table */
Index: sys/amd64/vmm/intel/vmcs.c
===================================================================
--- sys/amd64/vmm/intel/vmcs.c
+++ sys/amd64/vmm/intel/vmcs.c
@@ -50,6 +50,8 @@
#include <ddb/ddb.h>
#endif
+extern u_int maxvcpus;
+
static uint64_t
vmcs_fix_regval(uint32_t encoding, uint64_t val)
{
Index: sys/amd64/vmm/intel/vmx.h
===================================================================
--- sys/amd64/vmm/intel/vmx.h
+++ sys/amd64/vmm/intel/vmx.h
@@ -109,6 +109,7 @@
/* virtual machine softc */
struct vmx {
+ /* FIXME: make this use maxvcpus */
struct vmcs vmcs[VM_MAXCPU]; /* one vmcs per virtual cpu */
struct apic_page apic_page[VM_MAXCPU]; /* one apic page per vcpu */
char msr_bitmap[PAGE_SIZE];
Index: sys/amd64/vmm/intel/vmx.c
===================================================================
--- sys/amd64/vmm/intel/vmx.c
+++ sys/amd64/vmm/intel/vmx.c
@@ -113,6 +113,8 @@
#define HANDLED 1
#define UNHANDLED 0
+extern u_int maxvcpus;
+
static MALLOC_DEFINE(M_VMX, "vmx", "vmx");
static MALLOC_DEFINE(M_VLAPIC, "vlapic", "vlapic");
@@ -384,11 +386,11 @@
panic("vpid_free: invalid vpid %d", vpid);
/*
- * VPIDs [0,VM_MAXCPU] are special and are not allocated from
+ * VPIDs [0,maxvcpus] are special and are not allocated from
* the unit number allocator.
*/
- if (vpid > VM_MAXCPU)
+ if (vpid > maxvcpus)
free_unr(vpid_unr, vpid);
}
@@ -397,7 +399,7 @@
{
int i, x;
- if (num <= 0 || num > VM_MAXCPU)
+ if (num <= 0 || num > maxvcpus)
panic("invalid number of vpids requested: %d", num);
/*
@@ -426,7 +428,7 @@
/*
* If the unit number allocator does not have enough unique
- * VPIDs then we need to allocate from the [1,VM_MAXCPU] range.
+ * VPIDs then we need to allocate from the [1,maxvcpus] range.
*
* These VPIDs are not be unique across VMs but this does not
* affect correctness because the combined mappings are also
@@ -450,13 +452,13 @@
* VPID 0 is required when the "enable VPID" execution control is
* disabled.
*
- * VPIDs [1,VM_MAXCPU] are used as the "overflow namespace" when the
+ * VPIDs [1,maxvcpus] are used as the "overflow namespace" when the
* unit number allocator does not have sufficient unique VPIDs to
* satisfy the allocation.
*
* The remaining VPIDs are managed by the unit number allocator.
*/
- vpid_unr = new_unrhdr(VM_MAXCPU + 1, 0xffff, NULL);
+ vpid_unr = new_unrhdr(maxvcpus + 1, 0xffff, NULL);
}
static void
@@ -814,12 +816,14 @@
static void *
vmx_vminit(struct vm *vm, pmap_t pmap)
{
- uint16_t vpid[VM_MAXCPU];
+ uint16_t *vpid;
int i, error;
struct vmx *vmx;
struct vmcs *vmcs;
uint32_t exc_bitmap;
+ vpid = malloc(sizeof(uint16_t)*maxvcpus, M_VMX, M_WAITOK | M_ZERO);
+
vmx = malloc(sizeof(struct vmx), M_VMX, M_WAITOK | M_ZERO);
if ((uintptr_t)vmx & PAGE_MASK) {
panic("malloc of struct vmx not aligned on %d byte boundary",
@@ -871,7 +875,7 @@
guest_msr_ro(vmx, MSR_TSC))
panic("vmx_vminit: error setting guest msr access");
- vpid_alloc(vpid, VM_MAXCPU);
+ vpid_alloc(vpid, maxvcpus);
if (virtual_interrupt_delivery) {
error = vm_map_mmio(vm, DEFAULT_APIC_BASE, PAGE_SIZE,
@@ -880,7 +884,7 @@
KASSERT(error == 0, ("vm_map_mmio(apicbase) error %d", error));
}
- for (i = 0; i < VM_MAXCPU; i++) {
+ for (i = 0; i < maxvcpus; i++) {
vmcs = &vmx->vmcs[i];
vmcs->identifier = vmx_revision();
error = vmclear(vmcs);
@@ -955,6 +959,8 @@
vmx->ctx[i].pmap = pmap;
}
+ free(vpid, M_VMX);
+
return (vmx);
}
@@ -2722,7 +2728,7 @@
if (apic_access_virtualization(vmx, 0))
vm_unmap_mmio(vmx->vm, DEFAULT_APIC_BASE, PAGE_SIZE);
- for (i = 0; i < VM_MAXCPU; i++)
+ for (i = 0; i < maxvcpus; i++)
vpid_free(vmx->state[i].vpid);
free(vmx, M_VMX);
Index: sys/amd64/vmm/io/vlapic.c
===================================================================
--- sys/amd64/vmm/io/vlapic.c
+++ sys/amd64/vmm/io/vlapic.c
@@ -76,6 +76,8 @@
*/
#define VLAPIC_BUS_FREQ (128 * 1024 * 1024)
+extern u_int maxvcpus;
+
static __inline uint32_t
vlapic_get_id(struct vlapic *vlapic)
{
@@ -836,7 +838,7 @@
*/
CPU_ZERO(dmask);
vcpuid = vm_apicid2vcpuid(vm, dest);
- if (vcpuid < VM_MAXCPU)
+ if (vcpuid < maxvcpus)
CPU_SET(vcpuid, dmask);
} else {
/*
@@ -906,6 +908,10 @@
}
}
+/*
+ * FIXME: make this use maxvcpus. However, I don't yet see how this can be
+ * made dynamic, since VMM_STAT_ARRAY uses SYSINIT.
+ */
static VMM_STAT_ARRAY(IPIS_SENT, VM_MAXCPU, "ipis sent to vcpu");
static void
@@ -1028,7 +1034,7 @@
if ((icrval & APIC_LEVEL_MASK) == APIC_LEVEL_DEASSERT)
return (0);
- if (vlapic->vcpuid == 0 && dest != 0 && dest < VM_MAXCPU) {
+ if (vlapic->vcpuid == 0 && dest != 0 && dest < maxvcpus) {
vlapic2 = vm_lapic(vlapic->vm, dest);
/* move from INIT to waiting-for-SIPI state */
@@ -1041,7 +1047,7 @@
}
if (mode == APIC_DELMODE_STARTUP) {
- if (vlapic->vcpuid == 0 && dest != 0 && dest < VM_MAXCPU) {
+ if (vlapic->vcpuid == 0 && dest != 0 && dest < maxvcpus) {
vlapic2 = vm_lapic(vlapic->vm, dest);
/*
@@ -1445,7 +1451,7 @@
vlapic_init(struct vlapic *vlapic)
{
KASSERT(vlapic->vm != NULL, ("vlapic_init: vm is not initialized"));
- KASSERT(vlapic->vcpuid >= 0 && vlapic->vcpuid < VM_MAXCPU,
+ KASSERT(vlapic->vcpuid >= 0 && vlapic->vcpuid < maxvcpus,
("vlapic_init: vcpuid is not initialized"));
KASSERT(vlapic->apic_page != NULL, ("vlapic_init: apic_page is not "
"initialized"));
Index: sys/amd64/vmm/vmm.c
===================================================================
--- sys/amd64/vmm/vmm.c
+++ sys/amd64/vmm/vmm.c
@@ -161,7 +161,8 @@
struct mem_seg mem_segs[VM_MAX_MEMSEGS]; /* (o) guest memory regions */
struct vmspace *vmspace; /* (o) guest's address space */
char name[VM_MAX_NAMELEN]; /* (o) virtual machine name */
- struct vcpu vcpu[VM_MAXCPU]; /* (i) guest vcpus */
+ /* FIXME: make this use maxvcpus */
+ struct vcpu vcpu[VM_MAXCPU]; /* (i) guest vcpus */
};
static int vmm_initialized;
@@ -228,6 +229,8 @@
static bool sysmem_mapping(struct vm *vm, struct mem_map *mm);
static void vcpu_notify_event_locked(struct vcpu *vcpu, bool lapic_intr);
+extern u_int maxvcpus;
+
#ifdef KTR
static const char *
vcpu_state2str(enum vcpu_state state)
@@ -265,7 +268,7 @@
{
struct vcpu *vcpu;
- KASSERT(vcpu_id >= 0 && vcpu_id < VM_MAXCPU,
+ KASSERT(vcpu_id >= 0 && vcpu_id < maxvcpus,
("vcpu_init: invalid vcpu %d", vcpu_id));
vcpu = &vm->vcpu[vcpu_id];
@@ -304,7 +307,7 @@
{
struct vcpu *vcpu;
- if (cpuid < 0 || cpuid >= VM_MAXCPU)
+ if (cpuid < 0 || cpuid >= maxvcpus)
panic("vm_exitinfo: invalid cpuid %d", cpuid);
vcpu = &vm->vcpu[cpuid];
@@ -415,7 +418,7 @@
vm->suspend = 0;
CPU_ZERO(&vm->suspended_cpus);
- for (i = 0; i < VM_MAXCPU; i++)
+ for (i = 0; i < maxvcpus; i++)
vcpu_init(vm, i, create);
}
@@ -471,7 +474,7 @@
vatpic_cleanup(vm->vatpic);
vioapic_cleanup(vm->vioapic);
- for (i = 0; i < VM_MAXCPU; i++)
+ for (i = 0; i < maxvcpus; i++)
vcpu_cleanup(vm, i, destroy);
VMCLEANUP(vm->cookie);
@@ -906,9 +909,9 @@
* guaranteed if at least one vcpu is in the VCPU_FROZEN state.
*/
int state;
- KASSERT(vcpuid >= -1 && vcpuid < VM_MAXCPU, ("%s: invalid vcpuid %d",
+ KASSERT(vcpuid >= -1 && vcpuid < maxvcpus, ("%s: invalid vcpuid %d",
__func__, vcpuid));
- for (i = 0; i < VM_MAXCPU; i++) {
+ for (i = 0; i < maxvcpus; i++) {
if (vcpuid != -1 && vcpuid != i)
continue;
state = vcpu_get_state(vm, i, NULL);
@@ -954,7 +957,7 @@
vm_get_register(struct vm *vm, int vcpu, int reg, uint64_t *retval)
{
- if (vcpu < 0 || vcpu >= VM_MAXCPU)
+ if (vcpu < 0 || vcpu >= maxvcpus)
return (EINVAL);
if (reg >= VM_REG_LAST)
@@ -969,7 +972,7 @@
struct vcpu *vcpu;
int error;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
if (reg >= VM_REG_LAST)
@@ -1023,7 +1026,7 @@
struct seg_desc *desc)
{
- if (vcpu < 0 || vcpu >= VM_MAXCPU)
+ if (vcpu < 0 || vcpu >= maxvcpus)
return (EINVAL);
if (!is_segment_register(reg) && !is_descriptor_table(reg))
@@ -1036,7 +1039,7 @@
vm_set_seg_desc(struct vm *vm, int vcpu, int reg,
struct seg_desc *desc)
{
- if (vcpu < 0 || vcpu >= VM_MAXCPU)
+ if (vcpu < 0 || vcpu >= maxvcpus)
return (EINVAL);
if (!is_segment_register(reg) && !is_descriptor_table(reg))
@@ -1208,7 +1211,7 @@
vm_handle_rendezvous(struct vm *vm, int vcpuid)
{
- KASSERT(vcpuid == -1 || (vcpuid >= 0 && vcpuid < VM_MAXCPU),
+ KASSERT(vcpuid == -1 || (vcpuid >= 0 && vcpuid < maxvcpus),
("vm_handle_rendezvous: invalid vcpuid %d", vcpuid));
mtx_lock(&vm->rendezvous_mtx);
@@ -1484,7 +1487,7 @@
/*
* Wakeup the other sleeping vcpus and return to userspace.
*/
- for (i = 0; i < VM_MAXCPU; i++) {
+ for (i = 0; i < maxvcpus; i++) {
if (CPU_ISSET(i, &vm->suspended_cpus)) {
vcpu_notify_event(vm, i, false);
}
@@ -1526,7 +1529,7 @@
/*
* Notify all active vcpus that they are now suspended.
*/
- for (i = 0; i < VM_MAXCPU; i++) {
+ for (i = 0; i < maxvcpus; i++) {
if (CPU_ISSET(i, &vm->active_cpus))
vcpu_notify_event(vm, i, false);
}
@@ -1601,7 +1604,7 @@
vcpuid = vmrun->cpuid;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
if (!CPU_ISSET(vcpuid, &vm->active_cpus))
@@ -1701,7 +1704,7 @@
int error;
vm = arg;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
vcpu = &vm->vcpu[vcpuid];
@@ -1740,7 +1743,7 @@
struct vcpu *vcpu;
int type, vector;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
vcpu = &vm->vcpu[vcpuid];
@@ -1881,7 +1884,7 @@
uint64_t info1, info2;
int valid;
- KASSERT(vcpuid >= 0 && vcpuid < VM_MAXCPU, ("invalid vcpu %d", vcpuid));
+ KASSERT(vcpuid >= 0 && vcpuid < maxvcpus, ("invalid vcpu %d", vcpuid));
vcpu = &vm->vcpu[vcpuid];
@@ -1921,7 +1924,7 @@
{
struct vcpu *vcpu;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
vcpu = &vm->vcpu[vcpuid];
@@ -1938,7 +1941,7 @@
uint64_t regval;
int error;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
if (vector < 0 || vector >= 32)
@@ -2029,7 +2032,7 @@
{
struct vcpu *vcpu;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
vcpu = &vm->vcpu[vcpuid];
@@ -2044,7 +2047,7 @@
{
struct vcpu *vcpu;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
panic("vm_nmi_pending: invalid vcpuid %d", vcpuid);
vcpu = &vm->vcpu[vcpuid];
@@ -2057,7 +2060,7 @@
{
struct vcpu *vcpu;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
panic("vm_nmi_pending: invalid vcpuid %d", vcpuid);
vcpu = &vm->vcpu[vcpuid];
@@ -2076,7 +2079,7 @@
{
struct vcpu *vcpu;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
vcpu = &vm->vcpu[vcpuid];
@@ -2091,7 +2094,7 @@
{
struct vcpu *vcpu;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
panic("vm_extint_pending: invalid vcpuid %d", vcpuid);
vcpu = &vm->vcpu[vcpuid];
@@ -2104,7 +2107,7 @@
{
struct vcpu *vcpu;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
panic("vm_extint_pending: invalid vcpuid %d", vcpuid);
vcpu = &vm->vcpu[vcpuid];
@@ -2119,7 +2122,7 @@
int
vm_get_capability(struct vm *vm, int vcpu, int type, int *retval)
{
- if (vcpu < 0 || vcpu >= VM_MAXCPU)
+ if (vcpu < 0 || vcpu >= maxvcpus)
return (EINVAL);
if (type < 0 || type >= VM_CAP_MAX)
@@ -2131,7 +2134,7 @@
int
vm_set_capability(struct vm *vm, int vcpu, int type, int val)
{
- if (vcpu < 0 || vcpu >= VM_MAXCPU)
+ if (vcpu < 0 || vcpu >= maxvcpus)
return (EINVAL);
if (type < 0 || type >= VM_CAP_MAX)
@@ -2216,7 +2219,7 @@
int error;
struct vcpu *vcpu;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
panic("vm_set_run_state: invalid vcpuid %d", vcpuid);
vcpu = &vm->vcpu[vcpuid];
@@ -2234,7 +2237,7 @@
struct vcpu *vcpu;
enum vcpu_state state;
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
panic("vm_get_run_state: invalid vcpuid %d", vcpuid);
vcpu = &vm->vcpu[vcpuid];
@@ -2252,7 +2255,7 @@
vm_activate_cpu(struct vm *vm, int vcpuid)
{
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
if (CPU_ISSET(vcpuid, &vm->active_cpus))
@@ -2287,7 +2290,7 @@
int
vm_get_x2apic_state(struct vm *vm, int vcpuid, enum x2apic_state *state)
{
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
*state = vm->vcpu[vcpuid].x2apic_state;
@@ -2298,7 +2301,7 @@
int
vm_set_x2apic_state(struct vm *vm, int vcpuid, enum x2apic_state state)
{
- if (vcpuid < 0 || vcpuid >= VM_MAXCPU)
+ if (vcpuid < 0 || vcpuid >= maxvcpus)
return (EINVAL);
if (state >= X2APIC_STATE_LAST)
@@ -2385,7 +2388,7 @@
* Enforce that this function is called without any locks
*/
WITNESS_WARN(WARN_PANIC, NULL, "vm_smp_rendezvous");
- KASSERT(vcpuid == -1 || (vcpuid >= 0 && vcpuid < VM_MAXCPU),
+ KASSERT(vcpuid == -1 || (vcpuid >= 0 && vcpuid < maxvcpus),
("vm_smp_rendezvous: invalid vcpuid %d", vcpuid));
restart:
@@ -2415,7 +2418,7 @@
* Wake up any sleeping vcpus and trigger a VM-exit in any running
* vcpus so they handle the rendezvous as soon as possible.
*/
- for (i = 0; i < VM_MAXCPU; i++) {
+ for (i = 0; i < maxvcpus; i++) {
if (CPU_ISSET(i, &dest))
vcpu_notify_event(vm, i, false);
}
Index: sys/amd64/vmm/vmm_dev.c
===================================================================
--- sys/amd64/vmm/vmm_dev.c
+++ sys/amd64/vmm/vmm_dev.c
@@ -89,12 +89,14 @@
static int devmem_create_cdev(const char *vmname, int id, char *devmem);
static void devmem_destroy(void *arg);
+extern u_int maxvcpus;
+
static int
vcpu_lock_one(struct vmmdev_softc *sc, int vcpu)
{
int error;
- if (vcpu < 0 || vcpu >= VM_MAXCPU)
+ if (vcpu < 0 || vcpu >= maxvcpus)
return (EINVAL);
error = vcpu_set_state(sc->vm, vcpu, VCPU_FROZEN, true);
@@ -120,7 +122,7 @@
{
int error, vcpu;
- for (vcpu = 0; vcpu < VM_MAXCPU; vcpu++) {
+ for (vcpu = 0; vcpu < maxvcpus; vcpu++) {
error = vcpu_lock_one(sc, vcpu);
if (error)
break;
@@ -139,7 +141,7 @@
{
int vcpu;
- for (vcpu = 0; vcpu < VM_MAXCPU; vcpu++)
+ for (vcpu = 0; vcpu < maxvcpus; vcpu++)
vcpu_unlock_one(sc, vcpu);
}
@@ -182,7 +184,7 @@
/*
* Get a read lock on the guest memory map by freezing any vcpu.
*/
- error = vcpu_lock_one(sc, VM_MAXCPU - 1);
+ error = vcpu_lock_one(sc, maxvcpus - 1);
if (error)
return (error);
@@ -200,7 +202,7 @@
* Since this device does not support lseek(2), dd(1) will
* read(2) blocks of data to simulate the lseek(2).
*/
- hpa = vm_gpa_hold(sc->vm, VM_MAXCPU - 1, gpa, c, prot, &cookie);
+ hpa = vm_gpa_hold(sc->vm, maxvcpus - 1, gpa, c, prot, &cookie);
if (hpa == NULL) {
if (uio->uio_rw == UIO_READ)
error = uiomove(__DECONST(void *, zero_region),
@@ -212,7 +214,7 @@
vm_gpa_release(cookie);
}
}
- vcpu_unlock_one(sc, VM_MAXCPU - 1);
+ vcpu_unlock_one(sc, maxvcpus - 1);
return (error);
}
@@ -375,7 +377,7 @@
* Lock a vcpu to make sure that the memory map cannot be
* modified while it is being inspected.
*/
- vcpu = VM_MAXCPU - 1;
+ vcpu = maxvcpus - 1;
error = vcpu_lock_one(sc, vcpu);
if (error)
goto done;
@@ -681,7 +683,7 @@
/*
* Get a read lock on the guest memory map by freezing any vcpu.
*/
- error = vcpu_lock_one(sc, VM_MAXCPU - 1);
+ error = vcpu_lock_one(sc, maxvcpus - 1);
if (error)
return (error);
@@ -710,7 +712,7 @@
error = EINVAL;
}
}
- vcpu_unlock_one(sc, VM_MAXCPU - 1);
+ vcpu_unlock_one(sc, maxvcpus - 1);
return (error);
}
@@ -910,7 +912,7 @@
if ((nprot & PROT_EXEC) || first < 0 || first >= last)
return (EINVAL);
- error = vcpu_lock_one(dsc->sc, VM_MAXCPU - 1);
+ error = vcpu_lock_one(dsc->sc, maxvcpus - 1);
if (error)
return (error);
@@ -918,7 +920,7 @@
KASSERT(error == 0 && !sysmem && *objp != NULL,
("%s: invalid devmem segment %d", __func__, dsc->segid));
- vcpu_unlock_one(dsc->sc, VM_MAXCPU - 1);
+ vcpu_unlock_one(dsc->sc, maxvcpus - 1);
if (seglen >= last) {
vm_object_reference(*objp);
Index: sys/amd64/vmm/vmm_lapic.c
===================================================================
--- sys/amd64/vmm/vmm_lapic.c
+++ sys/amd64/vmm/vmm_lapic.c
@@ -49,12 +49,14 @@
#define MSI_X86_ADDR_RH 0x00000008 /* Redirection Hint */
#define MSI_X86_ADDR_LOG 0x00000004 /* Destination Mode */
+extern u_int maxvcpus;
+
int
lapic_set_intr(struct vm *vm, int cpu, int vector, bool level)
{
struct vlapic *vlapic;
- if (cpu < 0 || cpu >= VM_MAXCPU)
+ if (cpu < 0 || cpu >= maxvcpus)
return (EINVAL);
/*
@@ -77,7 +79,7 @@
cpuset_t dmask;
int error;
- if (cpu < -1 || cpu >= VM_MAXCPU)
+ if (cpu < -1 || cpu >= maxvcpus)
return (EINVAL);
if (cpu == -1)
Index: sys/amd64/vmm/vmm_stat.c
===================================================================
--- sys/amd64/vmm/vmm_stat.c
+++ sys/amd64/vmm/vmm_stat.c
@@ -49,6 +49,8 @@
static int vst_num_elems, vst_num_types;
static struct vmm_stat_type *vsttab[MAX_VMM_STAT_ELEMS];
+extern u_int maxvcpus;
+
static MALLOC_DEFINE(M_VMM_STAT, "vmm stat", "vmm stat");
#define vst_size ((size_t)vst_num_elems * sizeof(uint64_t))
@@ -86,7 +88,7 @@
uint64_t *stats;
int i;
- if (vcpu < 0 || vcpu >= VM_MAXCPU)
+ if (vcpu < 0 || vcpu >= maxvcpus)
return (EINVAL);
/* Let stats functions update their counters */
Index: sys/amd64/vmm/x86.c
===================================================================
--- sys/amd64/vmm/x86.c
+++ sys/amd64/vmm/x86.c
@@ -59,6 +59,21 @@
"Number of times an unknown cpuid leaf was accessed");
/*
+ * FIXME: This should be a RDTUN, but it's a RWTUN for debugging purposes at
+ * the moment.
+ *
+ * One idea to start with is to make this a SYSCTL_PROC and add some code to
+ * limit maxvcpus to 21 until FADT_OFFSET, HPET_OFFSET, MCFG_OFFSET,
+ * FACS_OFFSET and DSDT_OFFSET are dynamically calculated.
+ *
+ * There's a discussion about this at
+ * lists.freebsd.org/pipermail/freebsd-virtualization/2016-September/004724.html
+ */
+u_int maxvcpus = VM_MAXCPU;
+SYSCTL_UINT(_hw_vmm, OID_AUTO, maxvcpus, CTLFLAG_RWTUN, &maxvcpus,
+ VM_MAXCPU, "Maximum number of virtual CPUs");
+
+/*
* The default CPU topology is a single thread per package.
*/
static u_int threads_per_core = 1;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Sep 28, 5:30 PM (12 h, 14 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
13050269
Default Alt Text
D10070.diff (19 KB)
Attached To
Mode
D10070: vmm.ko: retire compile time VM_MAXCPU, replace with per VM topology maxcpus
Attached
Detach File
Event Timeline
Log In to Comment