int rte_kni_release(struct rte_kni *kni) { struct rte_kni_device_info dev_info; uint32_t slot_id; if (!kni || !kni->in_use) return -1; snprintf(dev_info.name, sizeof(dev_info.name), "%s", kni->name); if (ioctl(kni_fd, RTE_KNI_IOCTL_RELEASE, &dev_info) < 0) { RTE_LOG(ERR, KNI, "Fail to release kni device\n"); return -1; } /* mbufs in all fifo should be released, except request/response */ kni_free_fifo(kni->tx_q); kni_free_fifo(kni->rx_q); kni_free_fifo(kni->alloc_q); kni_free_fifo(kni->free_q); slot_id = kni->slot_id; /* Memset the KNI struct */ memset(kni, 0, sizeof(struct rte_kni)); /* Release memzone */ if (slot_id > kni_memzone_pool.max_ifaces) { rte_panic("KNI pool: corrupted slot ID: %d, max: %d\n", slot_id, kni_memzone_pool.max_ifaces); } kni_memzone_pool_release(&kni_memzone_pool.slots[slot_id]); return 0; }
int rte_kni_release(struct rte_kni *kni) { struct rte_kni_device_info dev_info; if (!kni || !kni->in_use) return -1; rte_snprintf(dev_info.name, sizeof(dev_info.name), kni->name); if (ioctl(kni_fd, RTE_KNI_IOCTL_RELEASE, &dev_info) < 0) { RTE_LOG(ERR, KNI, "Fail to release kni device\n"); return -1; } /* mbufs in all fifo should be released, except request/response */ kni_free_fifo(kni->tx_q); kni_free_fifo(kni->rx_q); kni_free_fifo(kni->alloc_q); kni_free_fifo(kni->free_q); memset(kni, 0, sizeof(struct rte_kni)); return 0; }