int nfp_flower_metadata_init(struct nfp_app *app, u64 host_ctx_count, unsigned int host_num_mems) { struct nfp_flower_priv *priv = app->priv; int err, stats_size; hash_init(priv->mask_table); err = rhashtable_init(&priv->flow_table, &nfp_flower_table_params); if (err) return err; get_random_bytes(&priv->mask_id_seed, sizeof(priv->mask_id_seed)); /* Init ring buffer and unallocated mask_ids. */ priv->mask_ids.mask_id_free_list.buf = kmalloc_array(NFP_FLOWER_MASK_ENTRY_RS, NFP_FLOWER_MASK_ELEMENT_RS, GFP_KERNEL); if (!priv->mask_ids.mask_id_free_list.buf) goto err_free_flow_table; priv->mask_ids.init_unallocated = NFP_FLOWER_MASK_ENTRY_RS - 1; /* Init timestamps for mask id*/ priv->mask_ids.last_used = kmalloc_array(NFP_FLOWER_MASK_ENTRY_RS, sizeof(*priv->mask_ids.last_used), GFP_KERNEL); if (!priv->mask_ids.last_used) goto err_free_mask_id; /* Init ring buffer and unallocated stats_ids. */ priv->stats_ids.free_list.buf = vmalloc(array_size(NFP_FL_STATS_ELEM_RS, priv->stats_ring_size)); if (!priv->stats_ids.free_list.buf) goto err_free_last_used; priv->stats_ids.init_unalloc = div_u64(host_ctx_count, host_num_mems); stats_size = FIELD_PREP(NFP_FL_STAT_ID_STAT, host_ctx_count) | FIELD_PREP(NFP_FL_STAT_ID_MU_NUM, host_num_mems - 1); priv->stats = kvmalloc_array(stats_size, sizeof(struct nfp_fl_stats), GFP_KERNEL); if (!priv->stats) goto err_free_ring_buf; spin_lock_init(&priv->stats_lock); return 0; err_free_ring_buf: vfree(priv->stats_ids.free_list.buf); err_free_last_used: kfree(priv->mask_ids.last_used); err_free_mask_id: kfree(priv->mask_ids.mask_id_free_list.buf); err_free_flow_table: rhashtable_destroy(&priv->flow_table); return -ENOMEM; }
static int nfp_bpf_init(struct nfp_app *app) { struct nfp_app_bpf *bpf; int err; bpf = kzalloc(sizeof(*bpf), GFP_KERNEL); if (!bpf) return -ENOMEM; bpf->app = app; app->priv = bpf; INIT_LIST_HEAD(&bpf->map_list); err = nfp_ccm_init(&bpf->ccm, app); if (err) goto err_free_bpf; err = rhashtable_init(&bpf->maps_neutral, &nfp_bpf_maps_neutral_params); if (err) goto err_clean_ccm; nfp_bpf_init_capabilities(bpf); err = nfp_bpf_parse_capabilities(app); if (err) goto err_free_neutral_maps; if (bpf->abi_version < 3) { bpf->cmsg_key_sz = CMSG_MAP_KEY_LW * 4; bpf->cmsg_val_sz = CMSG_MAP_VALUE_LW * 4; } else { bpf->cmsg_key_sz = bpf->maps.max_key_sz; bpf->cmsg_val_sz = bpf->maps.max_val_sz; app->ctrl_mtu = nfp_bpf_ctrl_cmsg_mtu(bpf); } bpf->bpf_dev = bpf_offload_dev_create(&nfp_bpf_dev_ops, bpf); err = PTR_ERR_OR_ZERO(bpf->bpf_dev); if (err) goto err_free_neutral_maps; return 0; err_free_neutral_maps: rhashtable_destroy(&bpf->maps_neutral); err_clean_ccm: nfp_ccm_clean(&bpf->ccm); err_free_bpf: kfree(bpf); return err; }
static int __init nf_nat_init(void) { int ret; ret = rhashtable_init(&nf_nat_bysource_table, &nf_nat_bysource_params); if (ret) return ret; ret = nf_ct_extend_register(&nat_extend); if (ret < 0) { rhashtable_destroy(&nf_nat_bysource_table); printk(KERN_ERR "nf_nat_core: Unable to register extension\n"); return ret; } ret = register_pernet_subsys(&nf_nat_net_ops); if (ret < 0) goto cleanup_extend; nf_ct_helper_expectfn_register(&follow_master_nat); /* Initialize fake conntrack so that NAT will skip it */ nf_ct_untracked_status_or(IPS_NAT_DONE_MASK); BUG_ON(nfnetlink_parse_nat_setup_hook != NULL); RCU_INIT_POINTER(nfnetlink_parse_nat_setup_hook, nfnetlink_parse_nat_setup); #ifdef CONFIG_XFRM BUG_ON(nf_nat_decode_session_hook != NULL); RCU_INIT_POINTER(nf_nat_decode_session_hook, __nf_nat_decode_session); #endif return 0; cleanup_extend: rhashtable_destroy(&nf_nat_bysource_table); nf_ct_extend_unregister(&nat_extend); return ret; }
static void __exit nf_nat_cleanup(void) { unsigned int i; unregister_pernet_subsys(&nf_nat_net_ops); nf_ct_extend_unregister(&nat_extend); nf_ct_helper_expectfn_unregister(&follow_master_nat); RCU_INIT_POINTER(nfnetlink_parse_nat_setup_hook, NULL); #ifdef CONFIG_XFRM RCU_INIT_POINTER(nf_nat_decode_session_hook, NULL); #endif for (i = 0; i < NFPROTO_NUMPROTO; i++) kfree(nf_nat_l4protos[i]); rhashtable_destroy(&nf_nat_bysource_table); }
void rds_bind_lock_destroy(void) { rhashtable_destroy(&bind_hash_table); }