Page MenuHomeFreeBSD

D39638.id127166.diff
No OneTemporary

D39638.id127166.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
@@ -471,6 +471,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
@@ -510,9 +510,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
@@ -160,6 +160,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[] = {
@@ -178,6 +181,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
};
@@ -1923,6 +1929,20 @@
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;
+
+ if (ef->vnet_base != 0) {
+ size = (uintptr_t)ef->vnet_stop - (uintptr_t)ef->vnet_start;
+ 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
@@ -150,6 +150,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 *);
@@ -170,6 +173,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
};
@@ -1848,7 +1854,7 @@
return (0);
return (ef->ddbsymcnt);
}
-
+
static long
link_elf_strtab_get(linker_file_t lf, caddr_t *strtab)
{
@@ -1859,3 +1865,25 @@
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;
+
+ 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);
+ break;
+ }
+ }
+ }
+}
+#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
@@ -154,3 +154,12 @@
METHOD int link_preload_finish {
linker_file_t file;
};
+
+#ifdef VIMAGE
+#
+# Propagate system tunable values to all vnets.
+#
+METHOD void propagate_vnets {
+ linker_file_t file;
+};
+#endif

File Metadata

Mime Type
text/plain
Expires
Tue, Jan 20, 7:05 AM (2 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27760410
Default Alt Text
D39638.id127166.diff (3 KB)

Event Timeline