Commit 90cee729 authored by Antoine Kaufmann's avatar Antoine Kaufmann Committed by Antoine Kaufmann
Browse files

images/farmem: add driver for adding memory region to kernel


Co-authored-by: default avatarJonas Kaufmann <jokau03@gmail.com>
parent 91e20bb7
......@@ -23,6 +23,9 @@ sims/net/menshen/obj_dir
sims/net/tofino/tofino
doc/doxygen
doc/_build
images/farmem/Module.symvers
images/farmem/modules.order
images/farmem/farmem.mod*
images/kernel/kheaders/
images/mqnic/Module.symvers
images/mqnic/modules.order
......
obj-m += farmem.o
farmem-objs += farmem_main.o
#include <linux/kernel.h>
#include <linux/memory_hotplug.h>
#include <linux/module.h>
#include <linux/pfn_t.h>
#include <linux/vmalloc.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Antoine Kaufmann");
MODULE_DESCRIPTION(
"Manually exposes specified memory region in the specified "
"numa node.");
MODULE_VERSION("0.1");
static unsigned long base_addr = 0;
static unsigned long size = 0;
static int nnid = 1;
static bool drain_node = false;
module_param(base_addr, ulong, 0);
module_param(size, ulong, 0);
module_param(nnid, int, 0);
module_param(drain_node, bool, 0);
/**
* drains all available memory from the specified numa node by allocating (and
* leaking) it
*/
static void do_drain_node(int nid) {
unsigned long eaten;
struct page *p;
printk(KERN_INFO "draining node %d\n", nid);
if (nid == 0) {
printk(KERN_ALERT "draining node 0 is probably a bad idea\n");
}
/* start with large chunks and move to smaller ones */
eaten = 0;
do {
p = alloc_pages_node(
nid,
GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY | GFP_NOWAIT | __GFP_THISNODE,
0);
if (p)
eaten += PAGE_SIZE;
}
/* Local memory is drained before farmem, therefore the following works.
Tested on kernel 5.15.69.*/
while (p && pfn_t_to_phys(page_to_pfn_t(p)) < base_addr);
printk(KERN_INFO "drained %lu bytes\n", eaten);
}
static int __init farmem_mod_init(void) {
int rc;
printk(KERN_ALERT "Loading farmem driver\n");
if (!base_addr || !size) {
panic("base address and length must be set");
}
if (!node_possible(nnid)) {
panic("invalid numa node spcified");
}
if (drain_node)
do_drain_node(nnid);
rc = add_memory_driver_managed(nnid, base_addr, size, "System RAM (farmem)",
MHP_NONE);
if (rc) {
printk(KERN_ALERT "adding memory failed: %d\n", rc);
}
node_set_online(nnid);
/* Some local memory still remains usable, drain again to get it all. */
if (drain_node)
do_drain_node(nnid);
return 0;
}
static void __exit farmem_mod_exit(void) {
printk(KERN_ALERT "Unloading farmem driver, this is broken\n");
}
module_init(farmem_mod_init);
module_exit(farmem_mod_exit);
......@@ -50,13 +50,16 @@ kheader_dir := $(d)kernel/kheaders
kheader_tar := $(d)kheaders.tar.bz2
mqnic_dir := $(d)mqnic
mqnic_mod := $(mqnic_dir)/mqnic.ko
farmem_dir := $(d)farmem
farmem_mod := $(farmem_dir)/farmem.ko
m5_bin := $(d)m5
guest_init := $(d)/scripts/guestinit.sh
build-images: $(IMAGES) $(RAW_IMAGES) $(vmlinux) $(bz_image) $(mqnic_mod)
build-images: $(IMAGES) $(RAW_IMAGES) $(vmlinux) $(bz_image) $(mqnic_mod) \
$(farmem_mod)
build-images-min: $(IMAGES_MIN) $(RAW_IMAGES_MIN) $(vmlinux) $(bz_image) \
$(mqnic_mod)
$(mqnic_mod) $(farmem_mod)
# only converts existing images to raw
convert-images-raw:
......@@ -180,10 +183,17 @@ $(mqnic_mod): $(vmlinux)
$(MAKE) -C $(kernel_dir) M=$(abspath $(mqnic_dir)) modules
touch $@
################################################
# farmem kernel module
CLEAN := $(addprefix $(d), mqnic/mqnic.ko mqnic/*.o mqnic/.*.cmd mqnic/*.mod \
mqnic/mqnic.mod.c mqnic/Module.symvers mqnic/modules.order)
$(farmem_mod): $(vmlinux)
$(MAKE) -C $(kernel_dir) M=$(abspath $(farmem_dir)) modules
touch $@
CLEAN := $(addprefix $(d), mqnic/mqnic.ko mqnic/*.o mqnic/.*.cmd mqnic/*.mod \
mqnic/mqnic.mod.c mqnic/Module.symvers mqnic/modules.order \
farmem/farmem.ko farmem/*.o farmem/.*.cmd farmem/*.mod \
farmem/farmem.mod.c farmem/Module.symvers farmem/modules.order)
DISTCLEAN := $(kernel_dir) $(packer) $(bz_image) $(vmlinux) $(kheader_dir) \
$(foreach i,$(IMAGES),$(dir $(i)) $(subst output-,input-,$(dir $(i)))) \
$(d)packer_cache $(d)kheaders.tar.bz2
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment