vimage and curvnet.
Marko Zec
zec at freebsd.org
Fri Sep 19 18:44:18 UTC 2008
On Friday 19 September 2008 19:55:04 Julian Elischer wrote:
> Marko Zec wrote:
> > http://perforce.freebsd.org/chv.cgi?CH=150125
> >
> > Change 150125 by zec at zec_tpx32 on 2008/09/19 17:43:14
> >
> > curvnet is never set on entry to sysctl handlers, thus
> > set the vnet context via TD_TO_VNET(curthread), because
> > all threads must have a cred->vimage->vnet context set.
>
> it seems to me that vnet is an important enough variable that we
^^^^
I guess you meant curvnet?
> could put it in the pcpu structure and have the scheduler set it up
> on context switches when vimage is compiled in.
Right now curvnet is defined in vimage.h as
#define curvnet curthread->td_vnet
Note that there's also a helper field in struct thread called
td_vnet_lpush aimed at tracing CURVNET_SET() stacking as well as
finding places when CURVNET_RESTORE() is not called after
CURVNET_SET(). Both td_vnet and td_vnet_lpush _must_ be stored with
each thread anyhow, given that threads can migrate practically at any
time.
So, if pcpu shadowing of curthread->td_vnet could yield performace
improvements than this would make sense, but we would still need to
keep td_vnet as a field in struct thread, and have CURVNET_SET() and
CURVNET_RESTORE() macros atomically update both the td_ field and its
pcpu shadow, which would require each CURVNET_XXX() macro to include
critical_enter() / _exit() invocations...
> thus it would always be directly available.
> i.e. %gs:CURVNET_OFFSET or whatever the syntax is on x86
> and the equivalent on other architectures.
>
> > Affected files ...
> >
> > .. //depot/projects/vimage-commit2/src/sys/netinet/tcp_subr.c#14
> > edit
> >
> > Differences ...
> >
> > ==== //depot/projects/vimage-commit2/src/sys/netinet/tcp_subr.c#14
> > (text+ko) ====
> >
> > @@ -119,7 +119,7 @@
> > static int
> > sysctl_net_inet_tcp_mss_check(SYSCTL_HANDLER_ARGS)
> > {
> > - INIT_VNET_INET(curvnet);
> > + INIT_VNET_INET(TD_TO_VNET(curthread));
> > int error, new;
> >
> > new = V_tcp_mssdflt;
> > @@ -141,7 +141,7 @@
> > static int
> > sysctl_net_inet_tcp_mss_v6_check(SYSCTL_HANDLER_ARGS)
> > {
> > - INIT_VNET_INET6(curvnet);
> > + INIT_VNET_INET6(TD_TO_VNET(curthread));
> > int error, new;
> >
> > new = V_tcp_v6mssdflt;
More information about the freebsd-virtualization
mailing list