init / exit function ordering 23/19623/4
authorDave Barach <dave@barachs.net>
Tue, 14 May 2019 22:01:44 +0000 (18:01 -0400)
committerFlorin Coras <florin.coras@gmail.com>
Thu, 16 May 2019 16:11:23 +0000 (16:11 +0000)
commitf8d50682cd1245f6f5ce4c846ca6f1bdc11255a6
tree8ecc60e4715db88bdbc8ea6bd0170fbae6f645eb
parentc1f93067ed4b9954bbba82e2c9c104b22e2f7f33
init / exit function ordering

The vlib init function subsystem now supports a mix of procedural and
formally-specified ordering constraints. We should eliminate procedural
knowledge wherever possible.

The following schemes are *roughly* equivalent:

static clib_error_t *init_runs_first (vlib_main_t *vm)
{
   clib_error_t *error;

   ... do some stuff...

   if ((error = vlib_call_init_function (init_runs_next)))
     return error;
   ...
}
VLIB_INIT_FUNCTION (init_runs_first);

and

static clib_error_t *init_runs_first (vlib_main_t *vm)
{
   ... do some stuff...
}
VLIB_INIT_FUNCTION (init_runs_first) =
{
    .runs_before = VLIB_INITS("init_runs_next"),
};

The first form will [most likely] call "init_runs_next" on the
spot. The second form means that "init_runs_first" runs before
"init_runs_next," possibly much earlier in the sequence.

Please DO NOT construct sets of init functions where A before B
actually means A *right before* B. It's not necessary - simply combine
A and B - and it leads to hugely annoying debugging exercises when
trying to switch from ad-hoc procedural ordering constraints to formal
ordering constraints.

Change-Id: I5e4353503bf43b4acb11a45fb33c79a5ade8426c
Signed-off-by: Dave Barach <dave@barachs.net>
62 files changed:
src/examples/vlib/main_stub.c
src/plugins/abf/abf_itf_attach.c
src/plugins/avf/device.c
src/plugins/cdp/cdp_input.c
src/plugins/crypto_ia32/main.c
src/plugins/crypto_ipsecmb/ipsecmb.c
src/plugins/crypto_openssl/main.c
src/plugins/dpdk/api/dpdk_api.c
src/plugins/dpdk/device/cli.c
src/plugins/dpdk/device/dpdk.h
src/plugins/dpdk/device/init.c
src/plugins/dpdk/main.c
src/plugins/gbp/gbp_vxlan.c
src/plugins/igmp/igmp.c
src/plugins/igmp/igmp_input.c
src/plugins/igmp/igmp_ssm_range.c
src/plugins/ikev2/ikev2.c
src/plugins/ikev2/ikev2.h
src/plugins/ikev2/ikev2_cli.c
src/plugins/ioam/analyse/ioam_summary_export.c
src/plugins/ioam/encap/ip6_ioam_e2e.c
src/plugins/ioam/encap/ip6_ioam_pot.c
src/plugins/ioam/encap/ip6_ioam_trace.c
src/plugins/ioam/lib-vxlan-gpe/vxlan_gpe_ioam_trace.c
src/plugins/ioam/udp-ping/udp_ping_export.c
src/plugins/ioam/udp-ping/udp_ping_node.c
src/plugins/ixge/ixge.c
src/plugins/lacp/input.c
src/plugins/nsh/nsh-md2-ioam/nsh_md2_ioam_trace.c
src/plugins/tlsmbedtls/tls_mbedtls.c
src/plugins/tlsopenssl/tls_openssl.c
src/vlib/init.c
src/vlib/init.h
src/vlib/linux/pci.c
src/vlib/linux/vmbus.c
src/vlib/threads.c
src/vlib/unix/input.c
src/vlib/unix/main.c
src/vlib/vmbus/vmbus.c
src/vlibmemory/memory_api.c
src/vlibmemory/socket_api.c
src/vlibmemory/vlib_api.c
src/vnet/adj/adj_bfd.c
src/vnet/classify/in_out_acl.c
src/vnet/cop/cop.c
src/vnet/devices/virtio/vhost_user.c
src/vnet/dpo/dpo.c
src/vnet/ethernet/arp.c
src/vnet/ethernet/ethernet.h
src/vnet/ethernet/init.c
src/vnet/ethernet/node.c
src/vnet/fib/fib.c
src/vnet/fib/fib_bfd.c
src/vnet/ip/ip_init.c
src/vnet/ipfix-export/flow_report.c
src/vnet/lisp-gpe/lisp_gpe_adjacency.c
src/vnet/misc.c
src/vnet/mpls/mpls_input.c
src/vnet/udp/udp.c
src/vnet/unix/tuntap.c
src/vnet/vxlan-gbp/vxlan_gbp.c
src/vpp/stats/stat_segment.c