[ewg] Re: [PATCH v1] mlx4_ib: Optimize hugetlab pages support

Roland Dreier rdreier at cisco.com
Thu Jan 22 21:07:41 PST 2009


OK, looks better.  However the patch had a bunch of whitespace problems
(run checkpatch.pl to see them).  Also:

 > +static int handle_hugetlb_user_mr(struct ib_pd *pd, struct mlx4_ib_mr *mr,
 > +				  u64 virt_addr, int access_flags)
 > +{
 > +#ifdef CONFIG_HUGETLB_PAGE
 > +	struct mlx4_ib_dev *dev = to_mdev(pd->device);
 > +	struct ib_umem_chunk *chunk;
 > +	unsigned dsize;
 > +	dma_addr_t daddr;
 > +	unsigned uninitialized_var(cur_size);
 > +	dma_addr_t uninitialized_var(cur_addr);
 > +	int restart;
 > +	int n;
 > +	struct ib_umem	*umem = mr->umem;
 > +	u64 *arr;
 > +	int err = 0;
 > +	int i;
 > +	int j = 0;
 > +
 > +        n = PAGE_ALIGN(umem->length + umem->offset) >> HPAGE_SHIFT;

seems this might underestimate by 1 if the region doesn't start/end on a
huge-page aligned boundary (but we would still want to use big pages to
register it).

 > +	arr = kmalloc(n * sizeof *arr, GFP_KERNEL);
 > +	if (!arr)
 > +		return -ENOMEM;
 > +
 > +	restart = 1;
 > +	list_for_each_entry(chunk, &umem->chunk_list, list)
 > +		for (i = 0; i < chunk->nmap; ++i) {
 > +			daddr = sg_dma_address(&chunk->page_list[i]);
 > +			dsize = sg_dma_len(&chunk->page_list[i]);
 > +			if (restart) {
 > +				cur_addr = daddr;
 > +				cur_size = dsize;
 > +				restart = 0;
 > +			} else if (cur_addr + cur_size != daddr) {
 > +				err = -EINVAL;
 > +				goto out;
 > +			} else
 > +                                cur_size += dsize;
 > +
 > +			if (cur_size > HPAGE_SIZE) {
 > +				err = -EINVAL;
 > +				goto out;
 > +			} else if (cur_size == HPAGE_SIZE) {
 > +				restart = 1;
 > +				arr[j++] = cur_addr;
 > +			}
 > +		}

I think we could avoid the uninitialized_var() stuff and having restart
at all by just doing cur_size = 0 at the start of the loop, and then
instead of if (restart) just test if cur_size is 0.

 - R.



More information about the ewg mailing list