diff --git a/include/spdk_internal/event.h b/include/spdk_internal/event.h index 8014f991e..643a44b9f 100644 --- a/include/spdk_internal/event.h +++ b/include/spdk_internal/event.h @@ -66,7 +66,6 @@ extern struct spdk_subsystem_list g_subsystems; struct spdk_subsystem_depend { const char *name; const char *depends_on; - struct spdk_subsystem *depends_on_subsystem; TAILQ_ENTRY(spdk_subsystem_depend) tailq; }; @@ -88,27 +87,19 @@ void spdk_rpc_finish(void); /** * \brief Register a new subsystem */ -#define SPDK_SUBSYSTEM_REGISTER(_name, _init, _fini, _config) \ - struct spdk_subsystem __spdk_subsystem_ ## _name = { \ - .name = #_name, \ - .init = _init, \ - .fini = _fini, \ - .config = _config, \ - }; \ +#define SPDK_SUBSYSTEM_REGISTER(_name) \ __attribute__((constructor)) static void _name ## _register(void) \ { \ - spdk_add_subsystem(&__spdk_subsystem_ ## _name); \ + spdk_add_subsystem(&_name); \ } /** * \brief Declare that a subsystem depends on another subsystem. */ #define SPDK_SUBSYSTEM_DEPEND(_name, _depends_on) \ - extern struct spdk_subsystem __spdk_subsystem_ ## _depends_on; \ static struct spdk_subsystem_depend __subsystem_ ## _name ## _depend_on ## _depends_on = { \ .name = #_name, \ .depends_on = #_depends_on, \ - .depends_on_subsystem = &__spdk_subsystem_ ## _depends_on, \ }; \ __attribute__((constructor)) static void _name ## _depend_on ## _depends_on(void) \ { \ diff --git a/lib/event/subsystems/bdev/bdev.c b/lib/event/subsystems/bdev/bdev.c index 18ede849b..d71fd97ed 100644 --- a/lib/event/subsystems/bdev/bdev.c +++ b/lib/event/subsystems/bdev/bdev.c @@ -64,6 +64,12 @@ spdk_bdev_subsystem_finish(void) spdk_bdev_finish(spdk_bdev_subsystem_finish_done, NULL); } -SPDK_SUBSYSTEM_REGISTER(bdev, spdk_bdev_subsystem_initialize, - spdk_bdev_subsystem_finish, spdk_bdev_config_text) +static struct spdk_subsystem g_spdk_subsystem_bdev = { + .name = "bdev", + .init = spdk_bdev_subsystem_initialize, + .fini = spdk_bdev_subsystem_finish, + .config = spdk_bdev_config_text, +}; + +SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_bdev); SPDK_SUBSYSTEM_DEPEND(bdev, copy) diff --git a/lib/event/subsystems/copy/copy.c b/lib/event/subsystems/copy/copy.c index 3883ab099..810d848b5 100644 --- a/lib/event/subsystems/copy/copy.c +++ b/lib/event/subsystems/copy/copy.c @@ -60,5 +60,11 @@ spdk_copy_engine_subsystem_finish(void) spdk_copy_engine_finish(spdk_copy_engine_subsystem_finish_done, NULL); } -SPDK_SUBSYSTEM_REGISTER(copy, spdk_copy_engine_subsystem_initialize, - spdk_copy_engine_subsystem_finish, NULL) +static struct spdk_subsystem g_spdk_subsystem_copy = { + .name = "copy", + .init = spdk_copy_engine_subsystem_initialize, + .fini = spdk_copy_engine_subsystem_finish, + .config = NULL, +}; + +SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_copy); diff --git a/lib/event/subsystems/iscsi/iscsi.c b/lib/event/subsystems/iscsi/iscsi.c index fb2d63105..642622509 100644 --- a/lib/event/subsystems/iscsi/iscsi.c +++ b/lib/event/subsystems/iscsi/iscsi.c @@ -61,6 +61,12 @@ spdk_iscsi_subsystem_fini(void) spdk_iscsi_fini(spdk_iscsi_subsystem_fini_done, NULL); } -SPDK_SUBSYSTEM_REGISTER(iscsi, spdk_iscsi_subsystem_init, spdk_iscsi_subsystem_fini, - spdk_iscsi_config_text) +static struct spdk_subsystem g_spdk_subsystem_iscsi = { + .name = "iscsi", + .init = spdk_iscsi_subsystem_init, + .fini = spdk_iscsi_subsystem_fini, + .config = spdk_iscsi_config_text, +}; + +SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_iscsi); SPDK_SUBSYSTEM_DEPEND(iscsi, scsi) diff --git a/lib/event/subsystems/nbd/nbd.c b/lib/event/subsystems/nbd/nbd.c index d7820550f..b82ae4f89 100644 --- a/lib/event/subsystems/nbd/nbd.c +++ b/lib/event/subsystems/nbd/nbd.c @@ -54,5 +54,12 @@ spdk_nbd_subsystem_fini(void) spdk_subsystem_fini_next(); } -SPDK_SUBSYSTEM_REGISTER(nbd, spdk_nbd_subsystem_init, spdk_nbd_subsystem_fini, NULL) +static struct spdk_subsystem g_spdk_subsystem_nbd = { + .name = "nbd", + .init = spdk_nbd_subsystem_init, + .fini = spdk_nbd_subsystem_fini, + .config = NULL, +}; + +SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_nbd); SPDK_SUBSYSTEM_DEPEND(nbd, bdev) diff --git a/lib/event/subsystems/net/net.c b/lib/event/subsystems/net/net.c index a28b0dfae..9355514f2 100644 --- a/lib/event/subsystems/net/net.c +++ b/lib/event/subsystems/net/net.c @@ -54,8 +54,14 @@ spdk_interface_subsystem_destroy(void) spdk_subsystem_fini_next(); } -SPDK_SUBSYSTEM_REGISTER(interface, spdk_interface_subsystem_init, - spdk_interface_subsystem_destroy, NULL) +static struct spdk_subsystem g_spdk_subsystem_interface = { + .name = "interface", + .init = spdk_interface_subsystem_init, + .fini = spdk_interface_subsystem_destroy, + .config = NULL, +}; + +SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_interface); static void spdk_net_subsystem_start(void) @@ -74,6 +80,12 @@ spdk_net_subsystem_fini(void) spdk_subsystem_fini_next(); } -SPDK_SUBSYSTEM_REGISTER(net_framework, spdk_net_subsystem_start, - spdk_net_subsystem_fini, NULL) +static struct spdk_subsystem g_spdk_subsystem_net_framework = { + .name = "net_framework", + .init = spdk_net_subsystem_start, + .fini = spdk_net_subsystem_fini, + .config = NULL, +}; + +SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_net_framework); SPDK_SUBSYSTEM_DEPEND(net_framework, interface) diff --git a/lib/event/subsystems/scsi/scsi.c b/lib/event/subsystems/scsi/scsi.c index 97ae3a3c0..a37ebf61e 100644 --- a/lib/event/subsystems/scsi/scsi.c +++ b/lib/event/subsystems/scsi/scsi.c @@ -54,5 +54,12 @@ spdk_scsi_subsystem_fini(void) spdk_subsystem_fini_next(); } -SPDK_SUBSYSTEM_REGISTER(scsi, spdk_scsi_subsystem_init, spdk_scsi_subsystem_fini, NULL) +static struct spdk_subsystem g_spdk_subsystem_scsi = { + .name = "scsi", + .init = spdk_scsi_subsystem_init, + .fini = spdk_scsi_subsystem_fini, + .config = NULL, +}; + +SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_scsi); SPDK_SUBSYSTEM_DEPEND(scsi, bdev) diff --git a/lib/event/subsystems/vhost/vhost.c b/lib/event/subsystems/vhost/vhost.c index 192ae8c03..078c3664a 100644 --- a/lib/event/subsystems/vhost/vhost.c +++ b/lib/event/subsystems/vhost/vhost.c @@ -59,5 +59,12 @@ spdk_vhost_subsystem_fini(void) spdk_vhost_fini(spdk_vhost_subsystem_fini_done); } -SPDK_SUBSYSTEM_REGISTER(vhost, spdk_vhost_subsystem_init, spdk_vhost_subsystem_fini, NULL) +static struct spdk_subsystem g_spdk_subsystem_vhost = { + .name = "vhost", + .init = spdk_vhost_subsystem_init, + .fini = spdk_vhost_subsystem_fini, + .config = NULL, +}; + +SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_vhost); SPDK_SUBSYSTEM_DEPEND(vhost, scsi) diff --git a/test/unit/lib/event/subsystem.c/subsystem_ut.c b/test/unit/lib/event/subsystem.c/subsystem_ut.c index 77a731812..44bceee63 100644 --- a/test/unit/lib/event/subsystem.c/subsystem_ut.c +++ b/test/unit/lib/event/subsystem.c/subsystem_ut.c @@ -202,10 +202,26 @@ subsystem_sort_test_depends_on_multiple(void) TAILQ_REMOVE(&g_subsystems, subsystem, tailq); } -SPDK_SUBSYSTEM_REGISTER(subsystem1, NULL, NULL, NULL) -SPDK_SUBSYSTEM_REGISTER(subsystem2, NULL, NULL, NULL) -SPDK_SUBSYSTEM_REGISTER(subsystem3, NULL, NULL, NULL) -SPDK_SUBSYSTEM_REGISTER(subsystem4, NULL, NULL, NULL) +struct spdk_subsystem subsystem1 = { + .name = "subsystem1", +}; + +struct spdk_subsystem subsystem2 = { + .name = "subsystem2", +}; +struct spdk_subsystem subsystem3 = { + .name = "subsystem3", +}; + +struct spdk_subsystem subsystem4 = { + .name = "subsystem4", +}; + +SPDK_SUBSYSTEM_REGISTER(subsystem1); +SPDK_SUBSYSTEM_REGISTER(subsystem2); +SPDK_SUBSYSTEM_REGISTER(subsystem3); +SPDK_SUBSYSTEM_REGISTER(subsystem4); + SPDK_SUBSYSTEM_DEPEND(subsystem1, subsystem2) SPDK_SUBSYSTEM_DEPEND(subsystem2, subsystem3) SPDK_SUBSYSTEM_DEPEND(subsystem3, subsystem4)