int efrm_create_vf_resource_manager(struct efrm_resource_manager **rm_out) { int rc; int nic_index; EFRM_ASSERT(rm_out); efrm_vf_manager = kzalloc(sizeof(*efrm_vf_manager), GFP_KERNEL); if (efrm_vf_manager == NULL) return -ENOMEM; for (nic_index = 0; nic_index < EFHW_MAX_NR_DEVS; ++nic_index) INIT_LIST_HEAD(&efrm_vf_manager->nic[nic_index].free_list); rc = efrm_resource_manager_ctor(&efrm_vf_manager->rm, efrm_vf_rm_dtor, "VF", EFRM_RESOURCE_VF); if (rc < 0) goto fail1; *rm_out = &efrm_vf_manager->rm; return 0; fail1: EFRM_DO_DEBUG(memset(efrm_vf_manager, 0, sizeof(*efrm_vf_manager))); kfree(efrm_vf_manager); return rc; }
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; }