| 1116 | } |
| 1117 | |
| 1118 | static int |
| 1119 | tap_dev_close(struct rte_eth_dev *dev) |
| 1120 | { |
| 1121 | int i; |
| 1122 | struct pmd_internals *internals = dev->data->dev_private; |
| 1123 | struct pmd_process_private *process_private = dev->process_private; |
| 1124 | struct rx_queue *rxq; |
| 1125 | |
| 1126 | if (rte_eal_process_type() != RTE_PROC_PRIMARY) { |
| 1127 | rte_free(dev->process_private); |
| 1128 | if (tap_devices_count == 1) |
| 1129 | rte_mp_action_unregister(TAP_MP_REQ_START_RXTX); |
| 1130 | tap_devices_count--; |
| 1131 | return 0; |
| 1132 | } |
| 1133 | |
| 1134 | if (!internals->persist) |
| 1135 | tap_link_set_down(dev); |
| 1136 | if (internals->nlsk_fd != -1) { |
| 1137 | tap_flow_flush(dev, NULL); |
| 1138 | tap_flow_implicit_flush(internals, NULL); |
| 1139 | tap_nl_final(internals->nlsk_fd); |
| 1140 | internals->nlsk_fd = -1; |
| 1141 | } |
| 1142 | |
| 1143 | for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) { |
| 1144 | if (process_private->rxq_fds[i] != -1) { |
| 1145 | rxq = &internals->rxq[i]; |
| 1146 | close(process_private->rxq_fds[i]); |
| 1147 | process_private->rxq_fds[i] = -1; |
| 1148 | tap_rxq_pool_free(rxq->pool); |
| 1149 | rte_free(rxq->iovecs); |
| 1150 | rxq->pool = NULL; |
| 1151 | rxq->iovecs = NULL; |
| 1152 | } |
| 1153 | if (process_private->txq_fds[i] != -1) { |
| 1154 | close(process_private->txq_fds[i]); |
| 1155 | process_private->txq_fds[i] = -1; |
| 1156 | } |
| 1157 | } |
| 1158 | |
| 1159 | if (internals->remote_if_index) { |
| 1160 | /* Restore initial remote state */ |
| 1161 | int ret = ioctl(internals->ioctl_sock, SIOCSIFFLAGS, |
| 1162 | &internals->remote_initial_flags); |
| 1163 | if (ret) |
| 1164 | TAP_LOG(ERR, "restore remote state failed: %d", ret); |
| 1165 | |
| 1166 | } |
| 1167 | |
| 1168 | rte_mempool_free(internals->gso_ctx_mp); |
| 1169 | internals->gso_ctx_mp = NULL; |
| 1170 | |
| 1171 | if (internals->ka_fd != -1) { |
| 1172 | close(internals->ka_fd); |
| 1173 | internals->ka_fd = -1; |
| 1174 | } |
| 1175 |
no test coverage detected