void efrm_resources_fini(void) { int i; for (i = EFRM_RESOURCE_NUM - 1; i >= 0; --i) if (efrm_rm_table[i]) { efrm_resource_manager_dtor(efrm_rm_table[i]); efrm_rm_table[i] = NULL; } }
int efrm_create_filter_resource_manager(struct efrm_resource_manager **rm_out) { int rc; EFRM_ASSERT(rm_out); efrm_filter_manager = kmalloc(sizeof(struct filter_resource_manager), GFP_KERNEL); if (efrm_filter_manager == 0) return -ENOMEM; memset(efrm_filter_manager, 0, sizeof(*efrm_filter_manager)); rc = efrm_resource_manager_ctor(&efrm_filter_manager->rm, filter_rm_dtor, "FILTER", EFRM_RESOURCE_FILTER); if (rc < 0) goto fail1; /* Create a pool of free instances */ rc = efrm_kfifo_id_ctor(&efrm_filter_manager->free_ids, 0, EFHW_IP_FILTER_NUM, &efrm_filter_manager->rm.rm_lock); if (rc != 0) goto fail2; *rm_out = &efrm_filter_manager->rm; EFRM_TRACE("%s: filter resources created - %d IDs", __func__, kfifo_len(efrm_filter_manager->free_ids)); return 0; fail2: efrm_resource_manager_dtor(&efrm_filter_manager->rm); fail1: memset(efrm_filter_manager, 0, sizeof(*efrm_filter_manager)); kfree(efrm_filter_manager); return rc; }