Page MenuHomeFreeBSD

D39638.id120533.diff
No OneTemporary

D39638.id120533.diff

diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -473,6 +473,9 @@
}
modules = !TAILQ_EMPTY(&lf->modules);
linker_file_register_sysctls(lf, false);
+#ifdef VIMAGE
+ LINKER_PROPAGATE_VNETS(lf);
+#endif
linker_file_sysinit(lf);
lf->flags |= LINKER_FILE_LINKED;
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -512,9 +512,6 @@
RB_INSERT(sysctl_oid_list, parent, oidp);
if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE &&
-#ifdef VIMAGE
- (oidp->oid_kind & CTLFLAG_VNET) == 0 &&
-#endif
(oidp->oid_kind & CTLFLAG_TUN) != 0 &&
(oidp->oid_kind & CTLFLAG_NOFETCH) == 0) {
/* only fetch value once */
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -161,6 +161,9 @@
static void link_elf_reloc_local(linker_file_t);
static long link_elf_symtab_get(linker_file_t, const Elf_Sym **);
static long link_elf_strtab_get(linker_file_t, caddr_t *);
+#ifdef VIMAGE
+static void link_elf_propagate_vnets(linker_file_t);
+#endif
static int elf_lookup(linker_file_t, Elf_Size, int, Elf_Addr *);
static kobj_method_t link_elf_methods[] = {
@@ -179,6 +182,9 @@
KOBJMETHOD(linker_ctf_get, link_elf_ctf_get),
KOBJMETHOD(linker_symtab_get, link_elf_symtab_get),
KOBJMETHOD(linker_strtab_get, link_elf_strtab_get),
+#ifdef VIMAGE
+ KOBJMETHOD(linker_propagate_vnets, link_elf_propagate_vnets),
+#endif
KOBJMETHOD_END
};
@@ -1920,6 +1926,26 @@
return (ef->ddbstrcnt);
}
+#ifdef VIMAGE
+static void
+link_elf_propagate_vnets(linker_file_t lf)
+{
+ elf_file_t ef = (elf_file_t)lf;
+ int size;
+
+ size = (uintptr_t)ef->vnet_stop - (uintptr_t)ef->vnet_start;
+ /* Empty set? */
+ if (size < 1)
+ return;
+#if defined(__i386__)
+ KASSERT(size >= 4, ("vnet module data size too short"));
+ if (size == 4)
+ return;
+#endif
+ vnet_data_copy((void *)ef->vnet_base, size);
+}
+#endif
+
#if defined(__i386__) || defined(__amd64__) || defined(__aarch64__) || defined(__powerpc__)
/*
* Use this lookup routine when performing relocations early during boot.
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -152,6 +152,9 @@
static int link_elf_reloc_local(linker_file_t, bool);
static long link_elf_symtab_get(linker_file_t, const Elf_Sym **);
static long link_elf_strtab_get(linker_file_t, caddr_t *);
+#ifdef VIMAGE
+static void link_elf_propagate_vnets(linker_file_t);
+#endif
static int elf_obj_lookup(linker_file_t lf, Elf_Size symidx, int deps,
Elf_Addr *);
@@ -172,6 +175,9 @@
KOBJMETHOD(linker_ctf_get, link_elf_ctf_get),
KOBJMETHOD(linker_symtab_get, link_elf_symtab_get),
KOBJMETHOD(linker_strtab_get, link_elf_strtab_get),
+#ifdef VIMAGE
+ KOBJMETHOD(linker_propagate_vnets, link_elf_propagate_vnets),
+#endif
KOBJMETHOD_END
};
@@ -1861,3 +1867,24 @@
return (0);
return (ef->ddbstrcnt);
}
+
+#ifdef VIMAGE
+static void
+link_elf_propagate_vnets(linker_file_t lf)
+{
+ elf_file_t ef = (elf_file_t) lf;
+
+ /* Propagate system tunable values to all vnet */
+ if (ef->progtab) {
+ for (int i = 0; i < ef->nprogtab; i++) {
+ if (ef->progtab[i].size == 0)
+ continue;
+ if (ef->progtab[i].name == NULL)
+ continue;
+ if (strcmp(ef->progtab[i].name, VNET_SETNAME) == 0)
+ vnet_data_copy(ef->progtab[i].addr,
+ ef->progtab[i].size);
+ }
+ }
+}
+#endif
diff --git a/sys/kern/linker_if.m b/sys/kern/linker_if.m
--- a/sys/kern/linker_if.m
+++ b/sys/kern/linker_if.m
@@ -155,3 +155,12 @@
METHOD int link_preload_finish {
linker_file_t file;
};
+
+#ifdef VIMAGE
+#
+# Propagate system tunable values to all vnet.
+#
+METHOD void propagate_vnets {
+ linker_file_t file;
+};
+#endif

File Metadata

Mime Type
text/plain
Expires
Wed, Jan 21, 8:20 PM (10 h, 34 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27818642
Default Alt Text
D39638.id120533.diff (3 KB)

Event Timeline