Page MenuHomeFreeBSD

D23097.diff
No OneTemporary

D23097.diff

Index: head/UPDATING
===================================================================
--- head/UPDATING
+++ head/UPDATING
@@ -26,6 +26,11 @@
disable the most expensive debugging functionality run
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
+20200217:
+ The size of struct vnet and the magic cookie have changed.
+ Users need to recompile libkvm and all modules using VIMAGE
+ together with their new kernel.
+
20200212:
Defining the long deprecated NO_CTF, NO_DEBUG_FILES, NO_INSTALLLIB,
NO_MAN, NO_PROFILE, and NO_WARNS variables is now an error. Update
Index: head/lib/libkvm/kvm.c
===================================================================
--- head/lib/libkvm/kvm.c
+++ head/lib/libkvm/kvm.c
@@ -49,6 +49,7 @@
#include <sys/sysctl.h>
#include <sys/mman.h>
+#include <stdbool.h>
#include <net/vnet.h>
#include <fcntl.h>
Index: head/lib/libkvm/kvm_private.c
===================================================================
--- head/lib/libkvm/kvm_private.c
+++ head/lib/libkvm/kvm_private.c
@@ -45,6 +45,7 @@
#include <sys/stat.h>
#include <sys/mman.h>
+#include <stdbool.h>
#include <net/vnet.h>
#include <assert.h>
Index: head/lib/libkvm/kvm_vnet.c
===================================================================
--- head/lib/libkvm/kvm_vnet.c
+++ head/lib/libkvm/kvm_vnet.c
@@ -43,6 +43,7 @@
#include <sys/proc.h>
#include <sys/types.h>
+#include <stdbool.h>
#include <net/vnet.h>
#include <kvm.h>
Index: head/sys/net/if.c
===================================================================
--- head/sys/net/if.c
+++ head/sys/net/if.c
@@ -322,6 +322,11 @@
*/
#define IFNET_HOLD (void *)(uintptr_t)(-1)
+#ifdef VIMAGE
+#define VNET_IS_SHUTTING_DOWN(_vnet) \
+ ((_vnet)->vnet_shutdown && (_vnet)->vnet_state < SI_SUB_VNET_DONE)
+#endif
+
static if_com_alloc_t *if_com_alloc[256];
static if_com_free_t *if_com_free[256];
@@ -1080,7 +1085,7 @@
#ifdef VIMAGE
bool shutdown;
- shutdown = ifp->if_vnet->vnet_shutdown;
+ shutdown = VNET_IS_SHUTTING_DOWN(ifp->if_vnet);
#endif
IFNET_WLOCK();
CK_STAILQ_FOREACH(iter, &V_ifnet, if_link)
@@ -1339,6 +1344,7 @@
struct prison *pr;
struct ifnet *difp;
int error;
+ bool shutdown;
/* Try to find the prison within our visibility. */
sx_slock(&allprison_lock);
@@ -1366,7 +1372,8 @@
}
/* Make sure the VNET is stable. */
- if (ifp->if_vnet->vnet_shutdown) {
+ shutdown = VNET_IS_SHUTTING_DOWN(ifp->if_vnet);
+ if (shutdown) {
CURVNET_RESTORE();
prison_free(pr);
return (EBUSY);
@@ -1391,6 +1398,7 @@
struct vnet *vnet_dst;
struct ifnet *ifp;
int error;
+ bool shutdown;
/* Try to find the prison within our visibility. */
sx_slock(&allprison_lock);
@@ -1419,7 +1427,8 @@
}
/* Make sure the VNET is stable. */
- if (ifp->if_vnet->vnet_shutdown) {
+ shutdown = VNET_IS_SHUTTING_DOWN(ifp->if_vnet);
+ if (shutdown) {
CURVNET_RESTORE();
prison_free(pr);
return (EBUSY);
@@ -2950,11 +2959,15 @@
struct ifreq *ifr;
int error;
int oif_flags;
+#ifdef VIMAGE
+ bool shutdown;
+#endif
CURVNET_SET(so->so_vnet);
#ifdef VIMAGE
/* Make sure the VNET is stable. */
- if (so->so_vnet->vnet_shutdown) {
+ shutdown = VNET_IS_SHUTTING_DOWN(so->so_vnet);
+ if (shutdown) {
CURVNET_RESTORE();
return (EBUSY);
}
Index: head/sys/net/vnet.h
===================================================================
--- head/sys/net/vnet.h
+++ head/sys/net/vnet.h
@@ -72,11 +72,12 @@
u_int vnet_magic_n;
u_int vnet_ifcnt;
u_int vnet_sockcnt;
- u_int vnet_shutdown; /* Shutdown in progress. */
+ u_int vnet_state; /* SI_SUB_* */
void *vnet_data_mem;
uintptr_t vnet_data_base;
-};
-#define VNET_MAGIC_N 0x3e0d8f29
+ bool vnet_shutdown; /* Shutdown in progress. */
+} __aligned(CACHE_LINE_SIZE);
+#define VNET_MAGIC_N 0x5e4a6f28
/*
* These two virtual network stack allocator definitions are also required
Index: head/sys/net/vnet.c
===================================================================
--- head/sys/net/vnet.c
+++ head/sys/net/vnet.c
@@ -279,6 +279,9 @@
LIST_REMOVE(vnet, vnet_le);
VNET_LIST_WUNLOCK();
+ /* Signal that VNET is being shutdown. */
+ vnet->vnet_shutdown = true;
+
CURVNET_SET_QUIET(vnet);
vnet_sysuninit();
CURVNET_RESTORE();
@@ -350,15 +353,15 @@
}
SYSINIT(vnet_data, SI_SUB_KLD, SI_ORDER_FIRST, vnet_data_startup, NULL);
+/* Dummy VNET_SYSINIT to make sure we always reach the final end state. */
static void
-vnet_sysuninit_shutdown(void *unused __unused)
+vnet_sysinit_done(void *unused __unused)
{
- /* Signal that VNET is being shutdown. */
- curvnet->vnet_shutdown = 1;
+ return;
}
-VNET_SYSUNINIT(vnet_sysuninit_shutdown, SI_SUB_VNET_DONE, SI_ORDER_FIRST,
- vnet_sysuninit_shutdown, NULL);
+VNET_SYSINIT(vnet_sysinit_done, SI_SUB_VNET_DONE, SI_ORDER_ANY,
+ vnet_sysinit_done, NULL);
/*
* When a module is loaded and requires storage for a virtualized global
@@ -572,8 +575,10 @@
struct vnet_sysinit *vs;
VNET_SYSINIT_RLOCK();
- TAILQ_FOREACH(vs, &vnet_constructors, link)
+ TAILQ_FOREACH(vs, &vnet_constructors, link) {
+ curvnet->vnet_state = vs->subsystem;
vs->func(vs->arg);
+ }
VNET_SYSINIT_RUNLOCK();
}
@@ -589,8 +594,10 @@
VNET_SYSINIT_RLOCK();
TAILQ_FOREACH_REVERSE(vs, &vnet_destructors, vnet_sysuninit_head,
- link)
+ link) {
+ curvnet->vnet_state = vs->subsystem;
vs->func(vs->arg);
+ }
VNET_SYSINIT_RUNLOCK();
}
@@ -704,7 +711,8 @@
db_printf(" vnet_data_mem = %p\n", vnet->vnet_data_mem);
db_printf(" vnet_data_base = %#jx\n",
(uintmax_t)vnet->vnet_data_base);
- db_printf(" vnet_shutdown = %#08x\n", vnet->vnet_shutdown);
+ db_printf(" vnet_state = %#08x\n", vnet->vnet_state);
+ db_printf(" vnet_shutdown = %#03x\n", vnet->vnet_shutdown);
db_printf("\n");
}
Index: head/sys/sys/param.h
===================================================================
--- head/sys/sys/param.h
+++ head/sys/sys/param.h
@@ -60,7 +60,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1300077 /* Master, propagated to newvers */
+#define __FreeBSD_version 1300078 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 25, 10:46 AM (54 m, 4 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32121630
Default Alt Text
D23097.diff (6 KB)

Event Timeline