PERFORCE change 161682 for review
Marko Zec
zec at FreeBSD.org
Wed May 6 21:30:42 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=161682
Change 161682 by zec at zec_tpx32 on 2009/05/06 21:30:14
Integrate vc -> vc2
Affected files ...
.. //depot/projects/vimage-commit2/src/sys/i386/ibcs2/ibcs2_socksys.c#8 integrate
.. //depot/projects/vimage-commit2/src/sys/kern/init_main.c#8 integrate
.. //depot/projects/vimage-commit2/src/sys/kern/kern_mib.c#14 integrate
.. //depot/projects/vimage-commit2/src/sys/kern/kern_vimage.c#26 integrate
.. //depot/projects/vimage-commit2/src/sys/nlm/nlm_advlock.c#4 integrate
.. //depot/projects/vimage-commit2/src/sys/sys/kernel.h#9 integrate
.. //depot/projects/vimage-commit2/src/sys/sys/ucred.h#5 integrate
.. //depot/projects/vimage-commit2/src/sys/sys/vimage.h#50 integrate
Differences ...
==== //depot/projects/vimage-commit2/src/sys/i386/ibcs2/ibcs2_socksys.c#8 (text+ko) ====
@@ -174,6 +174,7 @@
struct thread *td;
struct setipdomainname_args *uap;
{
+ INIT_VPROCG(TD_TO_VPROCG(td));
char hname[MAXHOSTNAMELEN], *ptr;
int error, sctl[2], hlen;
==== //depot/projects/vimage-commit2/src/sys/kern/init_main.c#8 (text+ko) ====
@@ -454,7 +454,7 @@
p->p_ucred->cr_ruidinfo = uifind(0);
p->p_ucred->cr_prison = NULL; /* Don't jail it. */
#ifdef VIMAGE
- p->p_ucred->cr_vnet = LIST_FIRST(&vnet_head);
+ p->p_ucred->cr_vimage = LIST_FIRST(&vimage_head);
#endif
#ifdef AUDIT
audit_cred_kproc0(p->p_ucred);
==== //depot/projects/vimage-commit2/src/sys/kern/kern_mib.c#14 (text+ko) ====
@@ -208,8 +208,9 @@
SYSCTL_STRING(_hw, HW_MACHINE_ARCH, machine_arch, CTLFLAG_RD,
machine_arch, 0, "System architecture");
-/* should become #ifndef VIMAGE */
+#ifdef VIMAGE_GLOBALS
char hostname[MAXHOSTNAMELEN];
+#endif
/*
* This mutex is used to protect the hostname and domainname variables, and
@@ -348,12 +349,14 @@
0, 0, sysctl_kern_config, "", "Kernel configuration file");
#endif
-/* should become #ifndef VIMAGE */
+#ifdef VIMAGE_GLOBALS
char domainname[MAXHOSTNAMELEN]; /* Protected by hostname_mtx. */
+#endif
static int
sysctl_domainname(SYSCTL_HANDLER_ARGS)
{
+ INIT_VPROCG(TD_TO_VPROCG(req->td));
char tmpdomainname[MAXHOSTNAMELEN];
int error;
==== //depot/projects/vimage-commit2/src/sys/kern/kern_vimage.c#26 (text+ko) ====
@@ -56,7 +56,9 @@
static int vnet_mod_destructor(struct vnet_modlink *);
#ifdef VIMAGE
+struct vimage_list_head vimage_head;
struct vnet_list_head vnet_head;
+struct vprocg_list_head vprocg_head;
#endif
void
==== //depot/projects/vimage-commit2/src/sys/nlm/nlm_advlock.c#4 (text+ko) ====
@@ -41,6 +41,7 @@
#include <sys/syslog.h>
#include <sys/systm.h>
#include <sys/unistd.h>
+#include <sys/vimage.h>
#include <sys/vnode.h>
#include <rpc/rpcclnt.h>
@@ -1222,12 +1223,12 @@
}
mtx_lock(&hostname_mtx);
- snprintf(oh_space, 32, "%d@%s", svid, hostname);
+ snprintf(oh_space, 32, "%d@%s", svid, G_hostname);
mtx_unlock(&hostname_mtx);
oh_len = strlen(oh_space);
memset(lock, 0, sizeof(*lock));
- lock->caller_name = hostname;
+ lock->caller_name = G_hostname;
lock->fh.n_len = fhlen;
lock->fh.n_bytes = fh;
lock->oh.n_len = oh_len;
==== //depot/projects/vimage-commit2/src/sys/sys/kernel.h#9 (text+ko) ====
@@ -58,8 +58,10 @@
extern struct mtx hostname_mtx;
extern unsigned long hostid;
extern char hostuuid[64];
+#ifdef VIMAGE_GLOBALS
extern char hostname[MAXHOSTNAMELEN];
extern char domainname[MAXHOSTNAMELEN];
+#endif
extern char kernelname[MAXPATHLEN];
extern int tick; /* usec per tick (1000000 / hz) */
==== //depot/projects/vimage-commit2/src/sys/sys/ucred.h#5 (text+ko) ====
@@ -55,7 +55,7 @@
struct uidinfo *cr_uidinfo; /* per euid resource consumption */
struct uidinfo *cr_ruidinfo; /* per ruid resource consumption */
struct prison *cr_prison; /* jail(2) */
- struct vnet *cr_vnet; /* vimage / vnet */
+ struct vimage *cr_vimage; /* vimage */
void *cr_pspare[2]; /* general use 2 */
#define cr_endcopy cr_label
struct label *cr_label; /* MAC label */
==== //depot/projects/vimage-commit2/src/sys/sys/vimage.h#50 (text+ko) ====
@@ -44,6 +44,13 @@
#define VNET_DEBUG
#endif
+struct vimage;
+struct vprocg;
+struct vnet;
+struct vi_req;
+struct kld_sym_lookup;
+struct ifnet;
+
typedef int vnet_attach_fn(const void *);
typedef int vnet_detach_fn(const void *);
@@ -111,6 +118,7 @@
/* Major module IDs for vimage sysctl virtualization. */
#define V_GLOBAL 0 /* global variable - no indirection */
#define V_NET 1
+#define V_PROCG 2
/* Name mappings for minor module IDs in vimage sysctl virtualization. */
#define V_MOD_vnet_net VNET_MOD_NET
@@ -121,6 +129,8 @@
#define V_MOD_vnet_pf VNET_MOD_PF
#define V_MOD_vnet_gif VNET_MOD_GIF
#define V_MOD_vnet_ipsec VNET_MOD_IPSEC
+
+#define V_MOD_vprocg 0 /* no minor module ids like in vnet */
int vi_symlookup(struct kld_sym_lookup *, char *);
void vnet_mod_register(const struct vnet_modinfo *);
@@ -128,6 +138,15 @@
void vnet_mod_deregister(const struct vnet_modinfo *);
void vnet_mod_deregister_multi(const struct vnet_modinfo *, void *, char *);
+int vi_td_ioctl(u_long, struct vi_req *, struct thread *);
+int vi_if_move(struct vi_req *, struct ifnet *, struct vimage *);
+void if_reassign_common(struct ifnet *, struct vnet *, const char *);
+
+struct vimage *vnet2vimage(struct vnet *);
+struct vimage *vimage_by_name(struct vimage *, char *);
+char *vnet_name(struct vnet *);
+int vi_child_of(struct vimage *, struct vimage *);
+
#endif /* !VIMAGE_GLOBALS */
#ifdef VIMAGE_GLOBALS
@@ -157,65 +176,90 @@
#define VNET_SYMMAP_END { NULL, 0 }
#endif /* !VIMAGE_GLOBALS */
-#ifdef VIMAGE
+struct vimage {
+ LIST_ENTRY(vimage) vi_le; /* all vimage list */
+ LIST_ENTRY(vimage) vi_sibling; /* vimages with same parent */
+ LIST_HEAD(, vimage) vi_child_head; /* direct offspring list */
+ struct vimage *vi_parent; /* ptr to parent vimage */
+ u_int vi_id; /* ID num */
+ u_int vi_ucredrefc; /* # of ucreds pointing to us */
+ char vi_name[MAXHOSTNAMELEN];
+ struct vnet *v_net;
+ struct vprocg *v_procg;
+};
+
struct vnet {
void *mod_data[VNET_MOD_MAX];
LIST_ENTRY(vnet) vnet_le; /* all vnets list */
u_int vnet_magic_n;
+ u_int vnet_id;
u_int ifccnt;
u_int sockcnt;
};
-#endif
+
+struct vprocg {
+ LIST_ENTRY(vprocg) vprocg_le;
+ u_int vprocg_ref; /* reference count */
+ u_int vprocg_id; /* ID num */
+ u_int nprocs;
+ char _hostname[MAXHOSTNAMELEN];
+ char _domainname[MAXHOSTNAMELEN];
+};
+#ifndef VIMAGE_GLOBALS
#ifdef VIMAGE
-#define curvnet curthread->td_vnet
+LIST_HEAD(vimage_list_head, vimage);
+extern struct vimage_list_head vimage_head;
#else
-#define curvnet NULL
+extern struct vprocg vprocg_0;
+#endif
#endif
-#define VNET_MAGIC_N 0x3e0d8f29
+#define curvnet curthread->td_vnet
+
+#define VNET_MAGIC_N 0x3e0d8f29
#ifdef VIMAGE
#ifdef VNET_DEBUG
-#define VNET_ASSERT(condition) \
+#define VNET_ASSERT(condition) \
if (!(condition)) { \
printf("VNET_ASSERT @ %s:%d %s():\n", \
__FILE__, __LINE__, __FUNCTION__); \
panic(#condition); \
}
-#define CURVNET_SET_QUIET(arg) \
+#define CURVNET_SET_QUIET(arg) \
VNET_ASSERT((arg)->vnet_magic_n == VNET_MAGIC_N); \
struct vnet *saved_vnet = curvnet; \
const char *saved_vnet_lpush = curthread->td_vnet_lpush; \
curvnet = arg; \
curthread->td_vnet_lpush = __FUNCTION__;
-#define CURVNET_SET_VERBOSE(arg) \
+#define CURVNET_SET_VERBOSE(arg) \
CURVNET_SET_QUIET(arg) \
if (saved_vnet) \
- printf("curvnet_set(%p) in %s() on cpu %d, prev %p in %s()\n", curvnet, \
- curthread->td_vnet_lpush, curcpu, \
+ printf("curvnet_set(%p) in %s() on cpu %d, prev %p in %s()\n",\
+ curvnet, curthread->td_vnet_lpush, curcpu, \
saved_vnet, saved_vnet_lpush);
-#define CURVNET_SET(arg) CURVNET_SET_VERBOSE(arg)
+#define CURVNET_SET(arg) CURVNET_SET_VERBOSE(arg)
-#define CURVNET_RESTORE() \
+#define CURVNET_RESTORE() \
VNET_ASSERT(saved_vnet == NULL || \
saved_vnet->vnet_magic_n == VNET_MAGIC_N); \
curvnet = saved_vnet; \
curthread->td_vnet_lpush = saved_vnet_lpush;
#else /* !VNET_DEBUG */
-#define VNET_ASSERT(condition)
+#define VNET_ASSERT(condition)
-#define CURVNET_SET(arg) \
+#define CURVNET_SET(arg) \
struct vnet *saved_vnet = curvnet; \
curvnet = arg;
-#define CURVNET_SET_VERBOSE(arg) CURVNET_SET(arg)
-#define CURVNET_SET_QUIET(arg) CURVNET_SET(arg)
+#define CURVNET_SET_VERBOSE(arg) CURVNET_SET(arg)
+#define CURVNET_SET_QUIET(arg) CURVNET_SET(arg)
-#define CURVNET_RESTORE() \
+#define CURVNET_RESTORE() \
curvnet = saved_vnet;
#endif /* !VNET_DEBUG */
#else /* !VIMAGE */
@@ -251,29 +295,73 @@
#define VNET_FOREACH(arg)
#endif
-#define TD_TO_VNET(td) (td)->td_ucred->cr_vnet
+#ifdef VIMAGE
+LIST_HEAD(vprocg_list_head, vprocg);
+extern struct vprocg_list_head vprocg_head;
+#define INIT_VPROCG(arg) struct vprocg *vprocg = (arg);
+#define VPROCG_ITERLOOP_BEGIN() \
+ struct vprocg *vprocg_iter; \
+ LIST_FOREACH(vprocg_iter, &vprocg_head, vprocg_le) {
+
+#define VPROCG_ITERLOOP_END() \
+ }
+#else
+#define INIT_VPROCG(arg)
+#define VPROCG_ITERLOOP_BEGIN()
+#define VPROCG_ITERLOOP_END()
+#endif
+
+#ifdef VIMAGE
+#define IS_DEFAULT_VIMAGE(arg) ((arg)->vi_id == 0)
+#define IS_DEFAULT_VNET(arg) ((arg)->vnet_id == 0)
+#else
+#define IS_DEFAULT_VIMAGE(arg) 1
+#define IS_DEFAULT_VNET(arg) 1
+#endif
+
+#define TD_TO_VIMAGE(td) (td)->td_ucred->cr_vimage
+#define TD_TO_VNET(td) (td)->td_ucred->cr_vimage->v_net
+#define TD_TO_VPROCG(td) (td)->td_ucred->cr_vimage->v_procg
+#define P_TO_VIMAGE(p) (p)->p_ucred->cr_vimage
+#define P_TO_VNET(p) (p)->p_ucred->cr_vimage->v_net
+#define P_TO_VPROCG(p) (p)->p_ucred->cr_vimage->v_procg
/* Non-VIMAGE null-macros */
-#define IS_DEFAULT_VNET(arg) 1
#define VNET_LIST_RLOCK()
#define VNET_LIST_RUNLOCK()
-#define INIT_VPROCG(arg)
-#define INIT_VCPU(arg)
-#define TD_TO_VIMAGE(td)
-#define TD_TO_VPROCG(td)
-#define TD_TO_VCPU(td)
-#define P_TO_VIMAGE(p)
-#define P_TO_VNET(p)
-#define P_TO_VPROCG(p)
-#define P_TO_VCPU(p)
/* XXX those defines bellow should probably go into vprocg.h and vcpu.h */
-#define VPROCG(sym) (sym)
-#define VCPU(sym) (sym)
+#define VPROCG(sym) VSYM(vprocg, sym)
+
+#ifdef VIMAGE
+#define G_hostname thread0.td_ucred->cr_vimage->v_procg->_hostname
+#else
+#define G_hostname VPROCG(hostname)
+#endif
#define V_hostname VPROCG(hostname)
-#define G_hostname VPROCG(hostname) /* global hostname */
#define V_domainname VPROCG(domainname)
+#define V_morphing_symlinks VPROCG(morphing_symlinks)
+
+struct vi_req {
+ int req_action; /* What to do with this reqest? */
+ u_short vi_proc_count; /* current number of processes */
+ u_short vi_child_count; /* current number of child vnets */
+ int vi_if_count; /* current number network interfaces */
+ int vi_sock_count;
+ char vi_name[MAXPATHLEN];
+ char vi_if_xname[MAXPATHLEN]; /* XXX should be IFNAMSIZ */
+};
+
+#define VI_CREATE 0x00000001
+#define VI_DESTROY 0x00000002
+#define VI_MODIFY 0x00000004
+#define VI_SWITCHTO 0x00000008
+#define VI_IFACE 0x00000010
+
+#define VI_GET 0x00000100
+#define VI_GETNEXT 0x00000200
+#define VI_GETNEXT_RECURSE 0x00000300
/*
* Size-guards for the vimage structures.
More information about the p4-projects
mailing list