#ifndef _NET_NF_TABLES_CORE_H
 #define _NET_NF_TABLES_CORE_H
 
+extern struct nft_expr_type nft_imm_type;
+extern struct nft_expr_type nft_cmp_type;
+extern struct nft_expr_type nft_lookup_type;
+extern struct nft_expr_type nft_bitwise_type;
+extern struct nft_expr_type nft_byteorder_type;
+extern struct nft_expr_type nft_payload_type;
+extern struct nft_expr_type nft_dynset_type;
+extern struct nft_expr_type nft_range_type;
+
 int nf_tables_core_module_init(void);
 void nf_tables_core_module_exit(void);
 
-int nft_immediate_module_init(void);
-void nft_immediate_module_exit(void);
-
 struct nft_cmp_fast_expr {
        u32                     data;
        enum nft_registers      sreg:8;
 
 extern const struct nft_expr_ops nft_cmp_fast_ops;
 
-int nft_cmp_module_init(void);
-void nft_cmp_module_exit(void);
-
-int nft_range_module_init(void);
-void nft_range_module_exit(void);
-
-int nft_lookup_module_init(void);
-void nft_lookup_module_exit(void);
-
-int nft_dynset_module_init(void);
-void nft_dynset_module_exit(void);
-
-int nft_bitwise_module_init(void);
-void nft_bitwise_module_exit(void);
-
-int nft_byteorder_module_init(void);
-void nft_byteorder_module_exit(void);
-
 struct nft_payload {
        enum nft_payload_bases  base:8;
        u8                      offset;
 extern const struct nft_expr_ops nft_payload_fast_ops;
 extern struct static_key_false nft_trace_enabled;
 
-int nft_payload_module_init(void);
-void nft_payload_module_exit(void);
-
 #endif /* _NET_NF_TABLES_CORE_H */
 
 }
 EXPORT_SYMBOL_GPL(nft_do_chain);
 
+static struct nft_expr_type *nft_basic_types[] = {
+       &nft_imm_type,
+       &nft_cmp_type,
+       &nft_lookup_type,
+       &nft_bitwise_type,
+       &nft_byteorder_type,
+       &nft_payload_type,
+       &nft_dynset_type,
+       &nft_range_type,
+};
+
 int __init nf_tables_core_module_init(void)
 {
-       int err;
-
-       err = nft_immediate_module_init();
-       if (err < 0)
-               goto err1;
-
-       err = nft_cmp_module_init();
-       if (err < 0)
-               goto err2;
-
-       err = nft_lookup_module_init();
-       if (err < 0)
-               goto err3;
-
-       err = nft_bitwise_module_init();
-       if (err < 0)
-               goto err4;
+       int err, i;
 
-       err = nft_byteorder_module_init();
-       if (err < 0)
-               goto err5;
-
-       err = nft_payload_module_init();
-       if (err < 0)
-               goto err6;
-
-       err = nft_dynset_module_init();
-       if (err < 0)
-               goto err7;
-
-       err = nft_range_module_init();
-       if (err < 0)
-               goto err8;
+       for (i = 0; i < ARRAY_SIZE(nft_basic_types); i++) {
+               err = nft_register_expr(nft_basic_types[i]);
+               if (err)
+                       goto err;
+       }
 
        return 0;
-err8:
-       nft_dynset_module_exit();
-err7:
-       nft_payload_module_exit();
-err6:
-       nft_byteorder_module_exit();
-err5:
-       nft_bitwise_module_exit();
-err4:
-       nft_lookup_module_exit();
-err3:
-       nft_cmp_module_exit();
-err2:
-       nft_immediate_module_exit();
-err1:
+
+err:
+       while (i-- > 0)
+               nft_unregister_expr(nft_basic_types[i]);
        return err;
 }
 
 void nf_tables_core_module_exit(void)
 {
-       nft_dynset_module_exit();
-       nft_payload_module_exit();
-       nft_byteorder_module_exit();
-       nft_bitwise_module_exit();
-       nft_lookup_module_exit();
-       nft_cmp_module_exit();
-       nft_immediate_module_exit();
+       int i;
+
+       i = ARRAY_SIZE(nft_basic_types);
+       while (i-- > 0)
+               nft_unregister_expr(nft_basic_types[i]);
 }
 
        return -1;
 }
 
-static struct nft_expr_type nft_bitwise_type;
 static const struct nft_expr_ops nft_bitwise_ops = {
        .type           = &nft_bitwise_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_bitwise)),
        .dump           = nft_bitwise_dump,
 };
 
-static struct nft_expr_type nft_bitwise_type __read_mostly = {
+struct nft_expr_type nft_bitwise_type __read_mostly = {
        .name           = "bitwise",
        .ops            = &nft_bitwise_ops,
        .policy         = nft_bitwise_policy,
        .maxattr        = NFTA_BITWISE_MAX,
        .owner          = THIS_MODULE,
 };
-
-int __init nft_bitwise_module_init(void)
-{
-       return nft_register_expr(&nft_bitwise_type);
-}
-
-void nft_bitwise_module_exit(void)
-{
-       nft_unregister_expr(&nft_bitwise_type);
-}
 
        return -1;
 }
 
-static struct nft_expr_type nft_byteorder_type;
 static const struct nft_expr_ops nft_byteorder_ops = {
        .type           = &nft_byteorder_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_byteorder)),
        .dump           = nft_byteorder_dump,
 };
 
-static struct nft_expr_type nft_byteorder_type __read_mostly = {
+struct nft_expr_type nft_byteorder_type __read_mostly = {
        .name           = "byteorder",
        .ops            = &nft_byteorder_ops,
        .policy         = nft_byteorder_policy,
        .maxattr        = NFTA_BYTEORDER_MAX,
        .owner          = THIS_MODULE,
 };
-
-int __init nft_byteorder_module_init(void)
-{
-       return nft_register_expr(&nft_byteorder_type);
-}
-
-void nft_byteorder_module_exit(void)
-{
-       nft_unregister_expr(&nft_byteorder_type);
-}
 
        return -1;
 }
 
-static struct nft_expr_type nft_cmp_type;
 static const struct nft_expr_ops nft_cmp_ops = {
        .type           = &nft_cmp_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_cmp_expr)),
                return &nft_cmp_ops;
 }
 
-static struct nft_expr_type nft_cmp_type __read_mostly = {
+struct nft_expr_type nft_cmp_type __read_mostly = {
        .name           = "cmp",
        .select_ops     = nft_cmp_select_ops,
        .policy         = nft_cmp_policy,
        .maxattr        = NFTA_CMP_MAX,
        .owner          = THIS_MODULE,
 };
-
-int __init nft_cmp_module_init(void)
-{
-       return nft_register_expr(&nft_cmp_type);
-}
-
-void nft_cmp_module_exit(void)
-{
-       nft_unregister_expr(&nft_cmp_type);
-}
 
        return -1;
 }
 
-static struct nft_expr_type nft_dynset_type;
 static const struct nft_expr_ops nft_dynset_ops = {
        .type           = &nft_dynset_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_dynset)),
        .dump           = nft_dynset_dump,
 };
 
-static struct nft_expr_type nft_dynset_type __read_mostly = {
+struct nft_expr_type nft_dynset_type __read_mostly = {
        .name           = "dynset",
        .ops            = &nft_dynset_ops,
        .policy         = nft_dynset_policy,
        .maxattr        = NFTA_DYNSET_MAX,
        .owner          = THIS_MODULE,
 };
-
-int __init nft_dynset_module_init(void)
-{
-       return nft_register_expr(&nft_dynset_type);
-}
-
-void nft_dynset_module_exit(void)
-{
-       nft_unregister_expr(&nft_dynset_type);
-}
 
        return 0;
 }
 
-static struct nft_expr_type nft_imm_type;
 static const struct nft_expr_ops nft_imm_ops = {
        .type           = &nft_imm_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_immediate_expr)),
        .validate       = nft_immediate_validate,
 };
 
-static struct nft_expr_type nft_imm_type __read_mostly = {
+struct nft_expr_type nft_imm_type __read_mostly = {
        .name           = "immediate",
        .ops            = &nft_imm_ops,
        .policy         = nft_immediate_policy,
        .maxattr        = NFTA_IMMEDIATE_MAX,
        .owner          = THIS_MODULE,
 };
-
-int __init nft_immediate_module_init(void)
-{
-       return nft_register_expr(&nft_imm_type);
-}
-
-void nft_immediate_module_exit(void)
-{
-       nft_unregister_expr(&nft_imm_type);
-}
 
        return -1;
 }
 
-static struct nft_expr_type nft_lookup_type;
 static const struct nft_expr_ops nft_lookup_ops = {
        .type           = &nft_lookup_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_lookup)),
        .dump           = nft_lookup_dump,
 };
 
-static struct nft_expr_type nft_lookup_type __read_mostly = {
+struct nft_expr_type nft_lookup_type __read_mostly = {
        .name           = "lookup",
        .ops            = &nft_lookup_ops,
        .policy         = nft_lookup_policy,
        .maxattr        = NFTA_LOOKUP_MAX,
        .owner          = THIS_MODULE,
 };
-
-int __init nft_lookup_module_init(void)
-{
-       return nft_register_expr(&nft_lookup_type);
-}
-
-void nft_lookup_module_exit(void)
-{
-       nft_unregister_expr(&nft_lookup_type);
-}
 
        return -1;
 }
 
-static struct nft_expr_type nft_payload_type;
 static const struct nft_expr_ops nft_payload_ops = {
        .type           = &nft_payload_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_payload)),
                return &nft_payload_ops;
 }
 
-static struct nft_expr_type nft_payload_type __read_mostly = {
+struct nft_expr_type nft_payload_type __read_mostly = {
        .name           = "payload",
        .select_ops     = nft_payload_select_ops,
        .policy         = nft_payload_policy,
        .maxattr        = NFTA_PAYLOAD_MAX,
        .owner          = THIS_MODULE,
 };
-
-int __init nft_payload_module_init(void)
-{
-       return nft_register_expr(&nft_payload_type);
-}
-
-void nft_payload_module_exit(void)
-{
-       nft_unregister_expr(&nft_payload_type);
-}
 
        return -1;
 }
 
-static struct nft_expr_type nft_range_type;
 static const struct nft_expr_ops nft_range_ops = {
        .type           = &nft_range_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_range_expr)),
        .dump           = nft_range_dump,
 };
 
-static struct nft_expr_type nft_range_type __read_mostly = {
+struct nft_expr_type nft_range_type __read_mostly = {
        .name           = "range",
        .ops            = &nft_range_ops,
        .policy         = nft_range_policy,
        .maxattr        = NFTA_RANGE_MAX,
        .owner          = THIS_MODULE,
 };
-
-int __init nft_range_module_init(void)
-{
-       return nft_register_expr(&nft_range_type);
-}
-
-void nft_range_module_exit(void)
-{
-       nft_unregister_expr(&nft_range_type);
-}