mmap对get_free_pages 等的不同做法

int vrdma_mmap(struct ib_ucontext *ctx, struct vm_area_struct *vma) { struct vrdma_ucontext *uctx = to_vucontext(ctx); size_t size = vma->vm_end - vma->vm_start; struct rdma_user_mmap_entry *rdma_entry; struct vrdma_user_mmap_entry *entry; int rc = -EINVAL; if (vma->vm_start & (PAGE_SIZE - 1)) { pr_warn("mmap not page aligned\n"); return -EINVAL; } rdma_entry = rdma_user_mmap_entry_get(&uctx->ibucontext, vma); if (!rdma_entry) { pr_err("mmap lookup failed: %lu, %#zx\n", vma->vm_pgoff, size); return -EINVAL; } entry = to_ventry(rdma_entry); if (entry->mmap_type == VRDMA_MMAP_CQ) { uint64_t vq_size = PAGE_ALIGN(vring_size(virtqueue_get_vring_size(entry->vq), SMP_CACHE_BYTES)); WARN_ON(vq_size + entry->ubuf_size != vma->vm_end - vma->vm_start); // vring rc = remap_pfn_range(vma, vma->vm_start, page_to_pfn(virt_to_page(virtqueue_get_vring(entry->vq)->desc)), vq_size, vma->vm_page_prot); // user buffer sprintf(entry->ubuf, "WW"); rc = remap_pfn_range(vma, vma->vm_start + vq_size, page_to_pfn(virt_to_page(entry->ubuf)), entry->ubuf_size, vma->vm_page_prot); if (rc) { pr_warn("remap_pfn_range failed: %lu, %zu\n", vma->vm_pgoff, size); goto out; } } else if (entry->mmap_type == VRDMA_MMAP_QP) { uint64_t vq_size = PAGE_ALIGN(vring_size(virtqueue_get_vring_size(entry->vq), SMP_CACHE_BYTES)); uint64_t total_size = vq_size + entry->ubuf_size; if (uctx->dev->fast_doorbell) total_size += PAGE_SIZE; WARN_ON(total_size != vma->vm_end - vma->vm_start); // vring rc = remap_pfn_range(vma, vma->vm_start, page_to_pfn(virt_to_page((virtqueue_get_vring(entry->vq)->desc))), vq_size, vma->vm_page_prot); // user buffer sprintf(entry->user_buf, "WW"); rc = remap_pfn_range(vma, vma->vm_start + vq_size, page_to_pfn(virt_to_page(entry->user_buf)), entry->ubuf_size, vma->vm_page_prot); // doorbell if (uctx->dev->fast_doorbell) { rc = io_remap_pfn_range(vma, vma->vm_start + vq_size + entry->ubuf_size, vmalloc_to_pfn(entry->queue->priv), PAGE_SIZE, vma->vm_page_prot); } if (rc) { pr_warn("remap_pfn_range failed: %lu, %zu\n", vma->vm_pgoff, size); goto out; } } else { pr_err("Invalid type"); } out: rdma_user_mmap_entry_put(rdma_entry); return rc; }
最新发布
09-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值