Lines Matching refs:dma_map
300 struct xsk_dma_map *dma_map;
302 list_for_each_entry(dma_map, &pool->umem->xsk_dma_list, list) {
303 if (dma_map->netdev == pool->netdev)
304 return dma_map;
313 struct xsk_dma_map *dma_map;
315 dma_map = kzalloc(sizeof(*dma_map), GFP_KERNEL);
316 if (!dma_map)
319 dma_map->dma_pages = kvcalloc(nr_pages, sizeof(*dma_map->dma_pages), GFP_KERNEL);
320 if (!dma_map->dma_pages) {
321 kfree(dma_map);
325 dma_map->netdev = netdev;
326 dma_map->dev = dev;
327 dma_map->dma_need_sync = false;
328 dma_map->dma_pages_cnt = nr_pages;
329 refcount_set(&dma_map->users, 1);
330 list_add(&dma_map->list, &umem->xsk_dma_list);
331 return dma_map;
334 static void xp_destroy_dma_map(struct xsk_dma_map *dma_map)
336 list_del(&dma_map->list);
337 kvfree(dma_map->dma_pages);
338 kfree(dma_map);
341 static void __xp_dma_unmap(struct xsk_dma_map *dma_map, unsigned long attrs)
346 for (i = 0; i < dma_map->dma_pages_cnt; i++) {
347 dma = &dma_map->dma_pages[i];
350 dma_unmap_page_attrs(dma_map->dev, *dma, PAGE_SIZE,
356 xp_destroy_dma_map(dma_map);
361 struct xsk_dma_map *dma_map;
366 dma_map = xp_find_dma_map(pool);
367 if (!dma_map) {
368 WARN(1, "Could not find dma_map for device");
372 if (!refcount_dec_and_test(&dma_map->users))
375 __xp_dma_unmap(dma_map, attrs);
383 static void xp_check_dma_contiguity(struct xsk_dma_map *dma_map)
387 for (i = 0; i < dma_map->dma_pages_cnt - 1; i++) {
388 if (dma_map->dma_pages[i] + PAGE_SIZE == dma_map->dma_pages[i + 1])
389 dma_map->dma_pages[i] |= XSK_NEXT_PG_CONTIG_MASK;
391 dma_map->dma_pages[i] &= ~XSK_NEXT_PG_CONTIG_MASK;
395 static int xp_init_dma_info(struct xsk_buff_pool *pool, struct xsk_dma_map *dma_map)
403 xp_init_xskb_dma(xskb, pool, dma_map->dma_pages, xskb->orig_addr);
407 pool->dma_pages = kvcalloc(dma_map->dma_pages_cnt, sizeof(*pool->dma_pages), GFP_KERNEL);
411 pool->dev = dma_map->dev;
412 pool->dma_pages_cnt = dma_map->dma_pages_cnt;
413 pool->dma_need_sync = dma_map->dma_need_sync;
414 memcpy(pool->dma_pages, dma_map->dma_pages,
423 struct xsk_dma_map *dma_map;
428 dma_map = xp_find_dma_map(pool);
429 if (dma_map) {
430 err = xp_init_dma_info(pool, dma_map);
434 refcount_inc(&dma_map->users);
438 dma_map = xp_create_dma_map(dev, pool->netdev, nr_pages, pool->umem);
439 if (!dma_map)
442 for (i = 0; i < dma_map->dma_pages_cnt; i++) {
446 __xp_dma_unmap(dma_map, attrs);
450 dma_map->dma_need_sync = true;
451 dma_map->dma_pages[i] = dma;
455 xp_check_dma_contiguity(dma_map);
457 err = xp_init_dma_info(pool, dma_map);
459 __xp_dma_unmap(dma_map, attrs);