200808 DevSummit Cambridge

The 4 and a bit steps of vimage integration

General comments

Timeline

The 4.5 steps

1. [DONE] Apply the V_ macro prefix:

1.5. [DONE] Further style changes (NOP) bringing in more infrastructure:

  1. [DONE] Resolve file local statics with conflicting names.
  2. [DONE] Import INIT_VNET_* as NOPs along with net/vnet.h, netinet/vinet.h, netinet6/vinet6.h, netgraph/vnetgraph.h, ...,
    • move #defins from vimage.h to those header files, make the macros NOPs in vimage.h. Put things into present header files.
  3. [DONE]Import "V_SYSCTLs", make them behave SYSCTLs w/o vimage for the moment. update man pages.

2.[DONE] Move the globals into a struct (g.v):

3. Apply virtualization (g->v):

4. Finish more subsystems

Progress report Jan 31 09

I (julian) have been testing going backwards and forwards using the VIMAGE_GLOBALS option and have see no significant performance changes between the original code and the same code compiled with a set of global structures. Looking at the generated code I can see that the compiler is resolving the locations of each field in the structures and the resulting instructions are almost identical with only the addesses being differnet. This gives me confidence that when VIMAGE is compiled out the performance numbers are in practice, as we had postulated, identical to teh original numbers. This makes VIMAGE a much more attractive feature if those who do need the performance and don't need multiple contexts can be confident we will not be hurting them.

HOWTO identify file static global variables with colliding names

You can use nm(1) on your kernel/object files. Use something like:

HOWTO verify that the pure style changes are all right, aka. The MD5 Dance

  1. Turn off INVARIANTS/INVARIANT_SUPPORT (since this records line numbers everywhere).
    •     cd /sys/<arch>/conf
          make LINT
      Generate a VIMAGE_LINT (or an equivalent for GENERIC):
          include         LINT
          ident           VIMAGE-LINT
          nooptions       INVARIANTS
          nooptions       INVARIANT_SUPPORT
  2. Bump __FreeBSD_version in unpatched tree (to match the patched tree) if needed.

  3. __LINE__ appears in some .o files via macros, so whitespace needs to be added to unpatched files that are modified by e.g. addition of #include <sys/vimage.h>.

    • Prepending blank lines to the top of the file should be good enough at least for most of them. If it is not, for example at a later stage, you need to prepare a 'counterpatch' that adds the same whitespace to the plain kernel as the vimage diff adds new lines to its tree. You may also need to add some temporary whitespace to the vimage tree in case you remove lines and do not add new ones back. To avoid to much empty line shuffling you may want to change the lock line number to a static like:
      • --- sys/sys/lock.h.orig      2008-09-25 22:21:06.000000000 +0000
        +++ sys/sys/lock.h   2008-09-25 22:21:49.000000000 +0000
        @@ -132,4 +132,4 @@ struct lock_class {
         #if LOCK_DEBUG > 0
         #define        LOCK_FILE       __FILE__
        -#define        LOCK_LINE       __LINE__
        +#define        LOCK_LINE       0xc0defeed
         #else
  4. Build kernel once with the whitespace and once with the real patch.
    •     config VIMAGE_LINT
          cd ../compile/VIMAGE_LINT
          make -s cleandepend __MAKE_CONF=/dev/null SRCCONF=/dev/null
          make -s depend __MAKE_CONF=/dev/null SRCCONF=/dev/null
          make -s __MAKE_CONF=/dev/null SRCCONF=/dev/null
      or run following from src/
          make buildkernel KERNCONF=VIMAGE_LINT __MAKE_CONF=/dev/null SRCCONF=/dev/null
  5. Strip the *.o files in sys/<arch>/compile/VIMAGE_LINT or obj/sys/VIMAGE_LINT (subsitute the . argument to find in that case):

    •     find . -type f -name "*.o" -print | xargs -n 1 strip
  6. Run md5 on each .o file and save the output depending on the tree.
    •     find . -type f -name "*.o" -print | xargs md5 | sort > /tmp/VIMAGE_LINT.{plain,vimage}
  7. Comparing the md5 output of both runs, checksums of *.o should only differ in vers.o, which records the timestamp of the kernel build.
    •     diff -u /tmp/VIMAGE_LINT.plain /tmp/VIMAGE_LINT.vimage

Unvirtualized (or not finished) parts of the network stack

General virtual talk on Sunday

Reference

http://people.freebsd.org/~bz/200805DevSummit/#vimageII

VIMAGE/Notes200808DevSummit (last edited 2014-10-12T22:42:46+0000 by CraigRodrigues)