diff --git a/src/util-device.c b/src/util-device.c index cc38bbd76fe3..b624cf07342b 100644 --- a/src/util-device.c +++ b/src/util-device.c @@ -316,6 +316,10 @@ int LiveDeviceListClean(void) SCEnter(); LiveDevice *pd, *tpd; + /* dpdk: need to close all devices before freeing them. */ + TAILQ_FOREACH (pd, &live_devices, next) { + DPDKCloseDevice(pd); + } TAILQ_FOREACH_SAFE(pd, &live_devices, next, tpd) { if (live_devices_stats) { SCLogNotice("%s: packets: %" PRIu64 ", drops: %" PRIu64 @@ -328,7 +332,7 @@ int LiveDeviceListClean(void) } RestoreIfaceOffloading(pd); - DPDKCloseDevice(pd); + DPDKFreeDevice(pd); if (pd->dev) SCFree(pd->dev); diff --git a/src/util-dpdk.c b/src/util-dpdk.c index 462b4b8cb7d1..c9c1d73d0314 100644 --- a/src/util-dpdk.c +++ b/src/util-dpdk.c @@ -40,10 +40,9 @@ void DPDKCloseDevice(LiveDevice *ldev) { (void)ldev; // avoid warnings of unused variable #ifdef HAVE_DPDK - uint16_t port_id; - int retval; if (run_mode == RUNMODE_DPDK) { - retval = rte_eth_dev_get_port_by_name(ldev->dev, &port_id); + uint16_t port_id; + int retval = rte_eth_dev_get_port_by_name(ldev->dev, &port_id); if (retval < 0) { SCLogError("%s: failed get port id, error: %s", ldev->dev, rte_strerror(-retval)); return; @@ -51,7 +50,15 @@ void DPDKCloseDevice(LiveDevice *ldev) SCLogPerf("%s: closing device", ldev->dev); rte_eth_dev_close(port_id); + } +#endif +} +void DPDKFreeDevice(LiveDevice *ldev) +{ + (void)ldev; // avoid warnings of unused variable +#ifdef HAVE_DPDK + if (run_mode == RUNMODE_DPDK) { SCLogDebug("%s: releasing packet mempool", ldev->dev); rte_mempool_free(ldev->dpdk_vars.pkt_mp); } diff --git a/src/util-dpdk.h b/src/util-dpdk.h index f6a54a8323e4..1fb3532f5d4d 100644 --- a/src/util-dpdk.h +++ b/src/util-dpdk.h @@ -120,6 +120,7 @@ void DPDKCleanupEAL(void); void DPDKCloseDevice(LiveDevice *ldev); +void DPDKFreeDevice(LiveDevice *ldev); #ifdef HAVE_DPDK const char *DPDKGetPortNameByPortID(uint16_t pid);