* Release all the created MRs and resources. Remove device from memory callback * list. * * @param dev * Pointer to Ethernet device. */
| 1425 | * Pointer to Ethernet device. |
| 1426 | */ |
| 1427 | void |
| 1428 | mlx4_mr_release(struct rte_eth_dev *dev) |
| 1429 | { |
| 1430 | struct mlx4_priv *priv = dev->data->dev_private; |
| 1431 | struct mlx4_mr *mr_next; |
| 1432 | |
| 1433 | /* Remove from memory callback device list. */ |
| 1434 | rte_rwlock_write_lock(&mlx4_shared_data->mem_event_rwlock); |
| 1435 | LIST_REMOVE(priv, mem_event_cb); |
| 1436 | rte_rwlock_write_unlock(&mlx4_shared_data->mem_event_rwlock); |
| 1437 | #ifdef RTE_LIBRTE_MLX4_DEBUG |
| 1438 | mlx4_mr_dump_dev(dev); |
| 1439 | #endif |
| 1440 | rte_rwlock_write_lock(&priv->mr.rwlock); |
| 1441 | /* Detach from MR list and move to free list. */ |
| 1442 | mr_next = LIST_FIRST(&priv->mr.mr_list); |
| 1443 | while (mr_next != NULL) { |
| 1444 | struct mlx4_mr *mr = mr_next; |
| 1445 | |
| 1446 | mr_next = LIST_NEXT(mr, mr); |
| 1447 | LIST_REMOVE(mr, mr); |
| 1448 | LIST_INSERT_HEAD(&priv->mr.mr_free_list, mr, mr); |
| 1449 | } |
| 1450 | LIST_INIT(&priv->mr.mr_list); |
| 1451 | /* Free global cache. */ |
| 1452 | mlx4_mr_btree_free(&priv->mr.cache); |
| 1453 | rte_rwlock_write_unlock(&priv->mr.rwlock); |
| 1454 | /* Free all remaining MRs. */ |
| 1455 | mlx4_mr_garbage_collect(dev); |
| 1456 | } |
no test coverage detected