Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147508593
D44565.id157460.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D44565.id157460.diff
View Options
diff --git a/sys/amd64/include/vmm.h b/sys/amd64/include/vmm.h
--- a/sys/amd64/include/vmm.h
+++ b/sys/amd64/include/vmm.h
@@ -30,6 +30,7 @@
#define _VMM_H_
#include <sys/cpuset.h>
+#include <sys/domainset.h>
#include <sys/sdt.h>
#include <x86/segments.h>
diff --git a/sys/amd64/include/vmm_dev.h b/sys/amd64/include/vmm_dev.h
--- a/sys/amd64/include/vmm_dev.h
+++ b/sys/amd64/include/vmm_dev.h
@@ -29,6 +29,8 @@
#ifndef _VMM_DEV_H_
#define _VMM_DEV_H_
+#include <sys/domainset.h>
+
#include <machine/vmm.h>
#include <machine/vmm_snapshot.h>
@@ -52,6 +54,9 @@
struct vm_memseg {
int segid;
size_t len;
+ domainset_t *ds_mask;
+ size_t ds_mask_size;
+ int ds_policy;
char name[VM_MAX_SUFFIXLEN + 1];
};
diff --git a/sys/arm64/include/vmm_dev.h b/sys/arm64/include/vmm_dev.h
--- a/sys/arm64/include/vmm_dev.h
+++ b/sys/arm64/include/vmm_dev.h
@@ -27,6 +27,8 @@
#ifndef _VMM_DEV_H_
#define _VMM_DEV_H_
+#include <sys/domainset.h>
+
#include <machine/vmm.h>
struct vm_memmap {
@@ -48,6 +50,9 @@
struct vm_memseg {
int segid;
size_t len;
+ domainset_t *ds_mask;
+ size_t ds_mask_size;
+ int ds_policy;
char name[VM_MAX_SUFFIXLEN + 1];
};
diff --git a/sys/dev/vmm/vmm_dev.c b/sys/dev/vmm/vmm_dev.c
--- a/sys/dev/vmm/vmm_dev.c
+++ b/sys/dev/vmm/vmm_dev.c
@@ -279,7 +279,8 @@
goto done;
}
- error = vm_alloc_memseg(sc->vm, mseg->segid, mseg->len, sysmem);
+ error = vm_alloc_memseg(sc->vm, mseg->segid, mseg->len, mseg->ds_policy,
+ mseg->ds_mask, mseg->ds_mask_size, sysmem);
if (error)
goto done;
diff --git a/sys/dev/vmm/vmm_mem.h b/sys/dev/vmm/vmm_mem.h
--- a/sys/dev/vmm/vmm_mem.h
+++ b/sys/dev/vmm/vmm_mem.h
@@ -8,6 +8,27 @@
#ifndef _DEV_VMM_MEM_H_
#define _DEV_VMM_MEM_H_
+/* Maximum number of NUMA domains in a guest. */
+#define VM_MAXMEMDOM 8
+#define VM_MAXSYSMEM VM_MAXMEMDOM
+
+/*
+ * Identifiers for memory segments.
+ * Each guest NUMA domain is represented by a single system
+ * memory segment from [VM_SYSMEM, VM_MAXSYSMEM).
+ * The remaining identifiers can be used to create devmem segments.
+ */
+enum {
+ VM_SYSMEM,
+ VM_BOOTROM = VM_MAXSYSMEM,
+ VM_FRAMEBUFFER,
+ VM_PCIROM,
+ VM_MEMSEG_END
+};
+
+#define VM_MAX_MEMSEGS VM_MEMSEG_END
+#define VM_MAX_MEMMAPS (VM_MAX_MEMSEGS * 2)
+
#ifdef _KERNEL
#include <sys/types.h>
@@ -31,9 +52,6 @@
int flags;
};
-#define VM_MAX_MEMSEGS 4
-#define VM_MAX_MEMMAPS 8
-
struct vm_mem {
struct vm_mem_map mem_maps[VM_MAX_MEMMAPS];
struct vm_mem_seg mem_segs[VM_MAX_MEMSEGS];
@@ -55,7 +73,8 @@
int vm_mmap_memseg(struct vm *vm, vm_paddr_t gpa, int segid, vm_ooffset_t off,
size_t len, int prot, int flags);
int vm_munmap_memseg(struct vm *vm, vm_paddr_t gpa, size_t len);
-int vm_alloc_memseg(struct vm *vm, int ident, size_t len, bool sysmem);
+int vm_alloc_memseg(struct vm *vm, int ident, size_t len, int ds_policy,
+ domainset_t *ds_mask, size_t mask_size, bool sysmem);
void vm_free_memseg(struct vm *vm, int ident);
/*
diff --git a/sys/dev/vmm/vmm_mem.c b/sys/dev/vmm/vmm_mem.c
--- a/sys/dev/vmm/vmm_mem.c
+++ b/sys/dev/vmm/vmm_mem.c
@@ -9,6 +9,7 @@
#include <sys/lock.h>
#include <sys/sx.h>
#include <sys/systm.h>
+#include <sys/malloc.h>
#include <machine/vmm.h>
@@ -156,11 +157,15 @@
}
int
-vm_alloc_memseg(struct vm *vm, int ident, size_t len, bool sysmem)
+vm_alloc_memseg(struct vm *vm, int ident, size_t len, int ds_policy,
+ domainset_t *ds_mask, size_t mask_size, bool sysmem)
{
+ struct domainset domain, *obj_domainset;
struct vm_mem *mem;
struct vm_mem_seg *seg;
+ domainset_t *mask;
vm_object_t obj;
+ int error;
mem = vm_mem(vm);
vm_assert_memseg_xlocked(vm);
@@ -179,14 +184,41 @@
return (EINVAL);
}
+ error = 0;
+ mask = NULL;
+ if (ds_policy != DOMAINSET_POLICY_INVALID) {
+ if (mask_size < sizeof(domainset_t) ||
+ mask_size > DOMAINSET_MAXSIZE / NBBY)
+ return (ERANGE);
+ memset(&domain, 0, sizeof(domain));
+ mask = malloc(mask_size, M_TEMP, M_WAITOK | M_ZERO);
+ error = copyin(ds_mask, mask, mask_size);
+ if (error)
+ goto out;
+ error = domainset_populate(&domain, mask, ds_policy, mask_size);
+ if (error) {
+ printf("%s: failed to process domain policy,"
+ "error: %d\n", __func__, error);
+ goto out;
+ }
+ obj_domainset = domainset_create(&domain);
+ if (obj_domainset == NULL) {
+ error = EINVAL;
+ goto out;
+ }
+ }
obj = vm_object_allocate(OBJT_SWAP, len >> PAGE_SHIFT);
if (obj == NULL)
return (ENOMEM);
seg->len = len;
seg->object = obj;
+ if (ds_policy != DOMAINSET_POLICY_INVALID)
+ seg->object->domain.dr_policy = obj_domainset;
seg->sysmem = sysmem;
- return (0);
+out:
+ free(mask, M_TEMP);
+ return (error);
}
int
diff --git a/sys/riscv/include/vmm_dev.h b/sys/riscv/include/vmm_dev.h
--- a/sys/riscv/include/vmm_dev.h
+++ b/sys/riscv/include/vmm_dev.h
@@ -34,6 +34,8 @@
#ifndef _VMM_DEV_H_
#define _VMM_DEV_H_
+#include <sys/domainset.h>
+
#include <machine/vmm.h>
struct vm_memmap {
@@ -55,6 +57,9 @@
struct vm_memseg {
int segid;
size_t len;
+ domainset_t *ds_mask;
+ size_t ds_mask_size;
+ int ds_policy;
char name[VM_MAX_SUFFIXLEN + 1];
};
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Mar 12, 12:51 PM (20 h, 48 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29583132
Default Alt Text
D44565.id157460.diff (5 KB)
Attached To
Mode
D44565: vmm: Add support for specifying NUMA configuration
Attached
Detach File
Event Timeline
Log In to Comment