Ejemplo n.º 1
0
/*
 #ifdef __linux__
 static ssize_t shared_mr_proc_read(struct file *file,
 char __user *buffer,
 size_t len,
 loff_t *offset)
 {

 return -ENOSYS;

 }

 static ssize_t shared_mr_proc_write(struct file *file,
 const char __user *buffer,
 size_t len,
 loff_t *offset)
 {

 return -ENOSYS;
 }

 static int shared_mr_mmap(struct file *filep, struct vm_area_struct *vma)
 {

 struct proc_dir_entry *pde = PDE(filep->f_path.dentry->d_inode);
 struct mlx4_shared_mr_info *smr_info =
 (struct mlx4_shared_mr_info *)pde->data;

 Prevent any mapping not on start of area
 if (vma->vm_pgoff != 0)
 return -EINVAL;

 return ib_umem_map_to_vma(smr_info->umem,
 vma);

 }

 static const struct file_operations shared_mr_proc_ops = {
 .owner	= THIS_MODULE,
 .read	= shared_mr_proc_read,
 .write	= shared_mr_proc_write,
 .mmap	= shared_mr_mmap
 };

 static mode_t convert_shared_access(int acc)
 {

 return (acc & IB_ACCESS_SHARED_MR_USER_READ ? S_IRUSR       : 0) |
 (acc & IB_ACCESS_SHARED_MR_USER_WRITE  ? S_IWUSR : 0) |
 (acc & IB_ACCESS_SHARED_MR_GROUP_READ   ? S_IRGRP  : 0) |
 (acc & IB_ACCESS_SHARED_MR_GROUP_WRITE   ? S_IWGRP  : 0) |
 (acc & IB_ACCESS_SHARED_MR_OTHER_READ   ? S_IROTH  : 0) |
 (acc & IB_ACCESS_SHARED_MR_OTHER_WRITE   ? S_IWOTH  : 0);

 }
 #endif
 */
struct ib_mr *mlx4_ib_get_dma_mr(struct ib_pd *pd, int acc) {
	struct mlx4_ib_mr *mr;
	int err;

	mr = calloc(1, sizeof *mr);
	if (!mr)
		return ERR_PTR(-ENOMEM);

	err = mlx4_mr_alloc(to_mdev(pd->device)->dev, to_mpd(pd)->pdn, 0, ~0ull,
			convert_access(acc), 0, 0, &mr->mmr);
	if (err)
		goto err_free;

	err = mlx4_mr_enable(to_mdev(pd->device)->dev, &mr->mmr);
	if (err)
		goto err_mr;

	mr->ibmr.rkey = mr->ibmr.lkey = mr->mmr.key;
	mr->umem = NULL;

	return &mr->ibmr;

	/*TODO*/
	err_mr: /*mlx4_mr_free(to_mdev(pd->device)->dev, &mr->mmr);*/

	err_free: free(mr);

	return ERR_PTR(err);
}
Ejemplo n.º 2
0
	fm::Result Buffer::mapData(void *&ptr,fm::Size beg,fm::Size len,BufferAccess access)
	{
		bind();

		ptr = glMapBufferRange(m_type,beg,len,convert_access(access));
		
		return glCheck((void)0);
	}