DPDKIfaceConfig *iconf = (DPDKIfaceConfig *)conf;
if (SC_ATOMIC_SUB(iconf->ref, 1) == 1) {
- DPDKDeviceResourcesDeinit(iconf->pkt_mempools);
+ DPDKDeviceResourcesDeinit(&iconf->pkt_mempools);
SCFree(iconf);
}
SCReturn;
if (retval < 0) {
SCLogError("%s: failed to setup TX queue %u: %s", iconf->iface, queue_id,
rte_strerror(-retval));
+ retval = -1; // the error code explained, informing about failure
goto cleanup;
}
}
SCReturnInt(0);
cleanup:
- DPDKDeviceResourcesDeinit(iconf->pkt_mempools);
+ DPDKDeviceResourcesDeinit(&iconf->pkt_mempools);
SCReturnInt(retval);
}
SCReturnInt(0);
}
-void DPDKDeviceResourcesDeinit(DPDKDeviceResources *dpdk_vars)
+void DPDKDeviceResourcesDeinit(DPDKDeviceResources **dpdk_vars)
{
- if (dpdk_vars != NULL) {
- if (dpdk_vars->pkt_mp != NULL) {
- for (int j = 0; j < dpdk_vars->pkt_mp_capa; j++) {
- if (dpdk_vars->pkt_mp[j] != NULL) {
- rte_mempool_free(dpdk_vars->pkt_mp[j]);
+ if ((*dpdk_vars) != NULL) {
+ if ((*dpdk_vars)->pkt_mp != NULL) {
+ for (int j = 0; j < (*dpdk_vars)->pkt_mp_capa; j++) {
+ if ((*dpdk_vars)->pkt_mp[j] != NULL) {
+ rte_mempool_free((*dpdk_vars)->pkt_mp[j]);
}
}
- SCFree(dpdk_vars->pkt_mp);
- dpdk_vars->pkt_mp_capa = 0;
- dpdk_vars->pkt_mp_cnt = 0;
- dpdk_vars->pkt_mp = NULL;
+ SCFree((*dpdk_vars)->pkt_mp);
+ (*dpdk_vars)->pkt_mp_capa = 0;
+ (*dpdk_vars)->pkt_mp_cnt = 0;
+ (*dpdk_vars)->pkt_mp = NULL;
}
- SCFree(dpdk_vars);
+ SCFree(*dpdk_vars);
+ *dpdk_vars = NULL;
}
}
} DPDKDeviceResources;
int DPDKDeviceResourcesInit(DPDKDeviceResources **dpdk_vars, uint16_t mp_cnt);
-void DPDKDeviceResourcesDeinit(DPDKDeviceResources *dpdk_vars);
+void DPDKDeviceResourcesDeinit(DPDKDeviceResources **dpdk_vars);
#endif /* HAVE_DPDK */
#ifdef HAVE_DPDK
if (SCRunmodeGet() == RUNMODE_DPDK) {
SCLogDebug("%s: releasing packet mempools", ldev->dev);
- DPDKDeviceResourcesDeinit(ldev->dpdk_vars);
+ DPDKDeviceResourcesDeinit(&ldev->dpdk_vars);
}
#endif
}