Lines Matching refs:dma_map
273 struct xsk_dma_map *dma_map;
275 list_for_each_entry(dma_map, &pool->umem->xsk_dma_list, list) {
276 if (dma_map->netdev == pool->netdev)
277 return dma_map;
286 struct xsk_dma_map *dma_map;
288 dma_map = kzalloc(sizeof(*dma_map), GFP_KERNEL);
289 if (!dma_map)
292 dma_map->dma_pages = kvcalloc(nr_pages, sizeof(*dma_map->dma_pages), GFP_KERNEL);
293 if (!dma_map->dma_pages) {
294 kfree(dma_map);
298 dma_map->netdev = netdev;
299 dma_map->dev = dev;
300 dma_map->dma_need_sync = false;
301 dma_map->dma_pages_cnt = nr_pages;
302 refcount_set(&dma_map->users, 1);
303 list_add(&dma_map->list, &umem->xsk_dma_list);
304 return dma_map;
307 static void xp_destroy_dma_map(struct xsk_dma_map *dma_map)
309 list_del(&dma_map->list);
310 kvfree(dma_map->dma_pages);
311 kfree(dma_map);
314 static void __xp_dma_unmap(struct xsk_dma_map *dma_map, unsigned long attrs)
319 for (i = 0; i < dma_map->dma_pages_cnt; i++) {
320 dma = &dma_map->dma_pages[i];
323 dma_unmap_page_attrs(dma_map->dev, *dma, PAGE_SIZE,
329 xp_destroy_dma_map(dma_map);
334 struct xsk_dma_map *dma_map;
339 dma_map = xp_find_dma_map(pool);
340 if (!dma_map) {
341 WARN(1, "Could not find dma_map for device");
345 if (!refcount_dec_and_test(&dma_map->users))
348 __xp_dma_unmap(dma_map, attrs);
355 static void xp_check_dma_contiguity(struct xsk_dma_map *dma_map)
359 for (i = 0; i < dma_map->dma_pages_cnt - 1; i++) {
360 if (dma_map->dma_pages[i] + PAGE_SIZE == dma_map->dma_pages[i + 1])
361 dma_map->dma_pages[i] |= XSK_NEXT_PG_CONTIG_MASK;
363 dma_map->dma_pages[i] &= ~XSK_NEXT_PG_CONTIG_MASK;
367 static int xp_init_dma_info(struct xsk_buff_pool *pool, struct xsk_dma_map *dma_map)
369 pool->dma_pages = kvcalloc(dma_map->dma_pages_cnt, sizeof(*pool->dma_pages), GFP_KERNEL);
373 pool->dev = dma_map->dev;
374 pool->dma_pages_cnt = dma_map->dma_pages_cnt;
375 pool->dma_need_sync = dma_map->dma_need_sync;
376 memcpy(pool->dma_pages, dma_map->dma_pages,
385 struct xsk_dma_map *dma_map;
390 dma_map = xp_find_dma_map(pool);
391 if (dma_map) {
392 err = xp_init_dma_info(pool, dma_map);
396 refcount_inc(&dma_map->users);
400 dma_map = xp_create_dma_map(dev, pool->netdev, nr_pages, pool->umem);
401 if (!dma_map)
404 for (i = 0; i < dma_map->dma_pages_cnt; i++) {
408 __xp_dma_unmap(dma_map, attrs);
412 dma_map->dma_need_sync = true;
413 dma_map->dma_pages[i] = dma;
417 xp_check_dma_contiguity(dma_map);
419 err = xp_init_dma_info(pool, dma_map);
421 __xp_dma_unmap(dma_map, attrs);