* Callback to DMA unmap external memory to a device. * * @param rte_dev * Pointer to the generic device. * @param addr * Starting virtual address of memory to be unmapped. * @param iova * Starting IOVA address of memory to be unmapped. * @param len * Length of memory segment being unmapped. * * @return * 0 on success, negative value on error. */
| 1159 | * 0 on success, negative value on error. |
| 1160 | */ |
| 1161 | int |
| 1162 | mlx5_common_dev_dma_unmap(struct rte_device *rte_dev, void *addr, |
| 1163 | uint64_t iova __rte_unused, size_t len __rte_unused) |
| 1164 | { |
| 1165 | struct mlx5_common_device *dev; |
| 1166 | struct mr_cache_entry entry; |
| 1167 | struct mlx5_mr *mr; |
| 1168 | |
| 1169 | dev = to_mlx5_device(rte_dev); |
| 1170 | if (!dev) { |
| 1171 | DRV_LOG(WARNING, |
| 1172 | "Unable to find matching mlx5 device to device %s.", |
| 1173 | rte_dev->name); |
| 1174 | rte_errno = ENODEV; |
| 1175 | return -1; |
| 1176 | } |
| 1177 | rte_rwlock_read_lock(&dev->mr_scache.rwlock); |
| 1178 | mr = mlx5_mr_lookup_list(&dev->mr_scache, &entry, (uintptr_t)addr); |
| 1179 | if (!mr) { |
| 1180 | rte_rwlock_read_unlock(&dev->mr_scache.rwlock); |
| 1181 | DRV_LOG(WARNING, |
| 1182 | "Address 0x%" PRIxPTR " wasn't registered to device %s", |
| 1183 | (uintptr_t)addr, rte_dev->name); |
| 1184 | rte_errno = EINVAL; |
| 1185 | return -1; |
| 1186 | } |
| 1187 | LIST_REMOVE(mr, mr); |
| 1188 | DRV_LOG(DEBUG, "MR(%p) is removed from list.", (void *)mr); |
| 1189 | mlx5_mr_free(mr, dev->mr_scache.dereg_mr_cb); |
| 1190 | mlx5_mr_rebuild_cache(&dev->mr_scache); |
| 1191 | /* |
| 1192 | * No explicit wmb is needed after updating dev_gen due to |
| 1193 | * store-release ordering in unlock that provides the |
| 1194 | * implicit barrier at the software visible level. |
| 1195 | */ |
| 1196 | ++dev->mr_scache.dev_gen; |
| 1197 | DRV_LOG(DEBUG, "Broadcasting local cache flush, gen=%d.", |
| 1198 | dev->mr_scache.dev_gen); |
| 1199 | rte_rwlock_read_unlock(&dev->mr_scache.rwlock); |
| 1200 | return 0; |
| 1201 | } |
| 1202 | |
| 1203 | void |
| 1204 | mlx5_class_driver_register(struct mlx5_class_driver *driver) |
no test coverage detected