forked from mirrors/linux
		
	IB/rdmavt: Add support for ib_map_mr_sg
This implements the device specific function needed by the verbs API function ib_map_mr_sg(). Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Jianxin Xiong <jianxin.xiong@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
		
							parent
							
								
									5fd2b562ed
								
							
						
					
					
						commit
						a41081aa59
					
				
					 3 changed files with 60 additions and 0 deletions
				
			
		| 
						 | 
					@ -479,6 +479,57 @@ struct ib_mr *rvt_alloc_mr(struct ib_pd *pd,
 | 
				
			||||||
	return &mr->ibmr;
 | 
						return &mr->ibmr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * rvt_set_page - page assignment function called by ib_sg_to_pages
 | 
				
			||||||
 | 
					 * @ibmr: memory region
 | 
				
			||||||
 | 
					 * @addr: dma address of mapped page
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Return: 0 on success
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static int rvt_set_page(struct ib_mr *ibmr, u64 addr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct rvt_mr *mr = to_imr(ibmr);
 | 
				
			||||||
 | 
						u32 ps = 1 << mr->mr.page_shift;
 | 
				
			||||||
 | 
						u32 mapped_segs = mr->mr.length >> mr->mr.page_shift;
 | 
				
			||||||
 | 
						int m, n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (unlikely(mapped_segs == mr->mr.max_segs))
 | 
				
			||||||
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (mr->mr.length == 0) {
 | 
				
			||||||
 | 
							mr->mr.user_base = addr;
 | 
				
			||||||
 | 
							mr->mr.iova = addr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m = mapped_segs / RVT_SEGSZ;
 | 
				
			||||||
 | 
						n = mapped_segs % RVT_SEGSZ;
 | 
				
			||||||
 | 
						mr->mr.map[m]->segs[n].vaddr = (void *)addr;
 | 
				
			||||||
 | 
						mr->mr.map[m]->segs[n].length = ps;
 | 
				
			||||||
 | 
						mr->mr.length += ps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * rvt_map_mr_sg - map sg list and set it the memory region
 | 
				
			||||||
 | 
					 * @ibmr: memory region
 | 
				
			||||||
 | 
					 * @sg: dma mapped scatterlist
 | 
				
			||||||
 | 
					 * @sg_nents: number of entries in sg
 | 
				
			||||||
 | 
					 * @sg_offset: offset in bytes into sg
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Return: number of sg elements mapped to the memory region
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int rvt_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
 | 
				
			||||||
 | 
							  int sg_nents, unsigned int *sg_offset)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct rvt_mr *mr = to_imr(ibmr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mr->mr.length = 0;
 | 
				
			||||||
 | 
						mr->mr.page_shift = PAGE_SHIFT;
 | 
				
			||||||
 | 
						return ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset,
 | 
				
			||||||
 | 
								      rvt_set_page);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * rvt_alloc_fmr - allocate a fast memory region
 | 
					 * rvt_alloc_fmr - allocate a fast memory region
 | 
				
			||||||
 * @pd: the protection domain for this memory region
 | 
					 * @pd: the protection domain for this memory region
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,6 +82,8 @@ int rvt_dereg_mr(struct ib_mr *ibmr);
 | 
				
			||||||
struct ib_mr *rvt_alloc_mr(struct ib_pd *pd,
 | 
					struct ib_mr *rvt_alloc_mr(struct ib_pd *pd,
 | 
				
			||||||
			   enum ib_mr_type mr_type,
 | 
								   enum ib_mr_type mr_type,
 | 
				
			||||||
			   u32 max_num_sg);
 | 
								   u32 max_num_sg);
 | 
				
			||||||
 | 
					int rvt_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
 | 
				
			||||||
 | 
							  int sg_nents, unsigned int *sg_offset);
 | 
				
			||||||
struct ib_fmr *rvt_alloc_fmr(struct ib_pd *pd, int mr_access_flags,
 | 
					struct ib_fmr *rvt_alloc_fmr(struct ib_pd *pd, int mr_access_flags,
 | 
				
			||||||
			     struct ib_fmr_attr *fmr_attr);
 | 
								     struct ib_fmr_attr *fmr_attr);
 | 
				
			||||||
int rvt_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list,
 | 
					int rvt_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -370,6 +370,7 @@ enum {
 | 
				
			||||||
	REG_USER_MR,
 | 
						REG_USER_MR,
 | 
				
			||||||
	DEREG_MR,
 | 
						DEREG_MR,
 | 
				
			||||||
	ALLOC_MR,
 | 
						ALLOC_MR,
 | 
				
			||||||
 | 
						MAP_MR_SG,
 | 
				
			||||||
	ALLOC_FMR,
 | 
						ALLOC_FMR,
 | 
				
			||||||
	MAP_PHYS_FMR,
 | 
						MAP_PHYS_FMR,
 | 
				
			||||||
	UNMAP_FMR,
 | 
						UNMAP_FMR,
 | 
				
			||||||
| 
						 | 
					@ -634,6 +635,12 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb)
 | 
				
			||||||
				      rvt_alloc_mr);
 | 
									      rvt_alloc_mr);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case MAP_MR_SG:
 | 
				
			||||||
 | 
							check_driver_override(rdi, offsetof(struct ib_device,
 | 
				
			||||||
 | 
											    map_mr_sg),
 | 
				
			||||||
 | 
									      rvt_map_mr_sg);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case MAP_PHYS_FMR:
 | 
						case MAP_PHYS_FMR:
 | 
				
			||||||
		check_driver_override(rdi, offsetof(struct ib_device,
 | 
							check_driver_override(rdi, offsetof(struct ib_device,
 | 
				
			||||||
						    map_phys_fmr),
 | 
											    map_phys_fmr),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue