From: Jens Axboe <[EMAIL PROTECTED]>
Subject: [PATCH 29/33] infiniband: sg chaining support
Date: Mon, 16 Jul 2007 11:47:43 +0200

> @@ -226,7 +228,8 @@ static int iser_sg_to_page_vec(struct iser_data_buf *data,
>                              struct iser_page_vec *page_vec,
>                              struct ib_device *ibdev)
>  {
> -     struct scatterlist *sg = (struct scatterlist *)data->buf;
> +     struct scatterlist *sgl = (struct scatterlist *)data->buf;
> +     struct scatterlist *sg;
>       u64 first_addr, last_addr, page;
>       int end_aligned;
>       unsigned int cur_page = 0;
> @@ -234,14 +237,14 @@ static int iser_sg_to_page_vec(struct iser_data_buf 
> *data,
>       int i;
>  
>       /* compute the offset of first element */
> -     page_vec->offset = (u64) sg[0].offset & ~MASK_4K;
> +     page_vec->offset = (u64) sgl[0].offset & ~MASK_4K;
>  
> -     for (i = 0; i < data->dma_nents; i++) {
> -             unsigned int dma_len = ib_sg_dma_len(ibdev, &sg[i]);
> +     for_each_sg(sgl, sg, data->dma_nents, i) {
> +             unsigned int dma_len = ib_sg_dma_len(ibdev, sg);
>  
>               total_sz += dma_len;
>  
> -             first_addr = ib_sg_dma_address(ibdev, &sg[i]);
> +             first_addr = ib_sg_dma_address(ibdev, sg);
>               last_addr  = first_addr + dma_len;
>  
>               end_aligned   = !(last_addr  & ~MASK_4K);
> @@ -249,9 +252,9 @@ static int iser_sg_to_page_vec(struct iser_data_buf *data,
>               /* continue to collect page fragments till aligned or SG ends */
>               while (!end_aligned && (i + 1 < data->dma_nents)) {
>                       i++;

Do we need to replace i++ with sg = sg_next(sg) here?


> -                     dma_len = ib_sg_dma_len(ibdev, &sg[i]);
> +                     dma_len = ib_sg_dma_len(ibdev, sg);
>                       total_sz += dma_len;
> -                     last_addr = ib_sg_dma_address(ibdev, &sg[i]) + dma_len;
> +                     last_addr = ib_sg_dma_address(ibdev, sg) + dma_len;
>                       end_aligned = !(last_addr  & ~MASK_4K);
>               }
>  
> @@ -286,25 +289,26 @@ static int iser_sg_to_page_vec(struct iser_data_buf 
> *data,
>  static unsigned int iser_data_buf_aligned_len(struct iser_data_buf *data,
>                                             struct ib_device *ibdev)
>  {
> -     struct scatterlist *sg;
> +     struct scatterlist *sgl, *sg;
>       u64 end_addr, next_addr;
>       int i, cnt;
>       unsigned int ret_len = 0;
>  
> -     sg = (struct scatterlist *)data->buf;
> +     sgl = (struct scatterlist *)data->buf;
>  
> -     for (cnt = 0, i = 0; i < data->dma_nents; i++, cnt++) {
> +     cnt = 0;
> +     for_each_sg(sgl, sg, data->dma_nents, i) {
>               /* iser_dbg("Checking sg iobuf [%d]: phys=0x%08lX "
>                  "offset: %ld sz: %ld\n", i,
> -                (unsigned long)page_to_phys(sg[i].page),
> -                (unsigned long)sg[i].offset,
> -                (unsigned long)sg[i].length); */
> -             end_addr = ib_sg_dma_address(ibdev, &sg[i]) +
> -                        ib_sg_dma_len(ibdev, &sg[i]);
> +                (unsigned long)page_to_phys(sg->page),
> +                (unsigned long)sg->offset,
> +                (unsigned long)sg->length); */
> +             end_addr = ib_sg_dma_address(ibdev, sg) +
> +                        ib_sg_dma_len(ibdev, sg);
>               /* iser_dbg("Checking sg iobuf end address "
>                      "0x%08lX\n", end_addr); */
>               if (i + 1 < data->dma_nents) {
> -                     next_addr = ib_sg_dma_address(ibdev, &sg[i+1]);
> +                     next_addr = ib_sg_dma_address(ibdev, sg_next(sg));
>                       /* are i, i+1 fragments of the same page? */
>                       if (end_addr == next_addr)
>                               continue;
> @@ -324,15 +328,16 @@ static unsigned int iser_data_buf_aligned_len(struct 
> iser_data_buf *data,
>  static void iser_data_buf_dump(struct iser_data_buf *data,
>                              struct ib_device *ibdev)
>  {
> -     struct scatterlist *sg = (struct scatterlist *)data->buf;
> +     struct scatterlist *sgl = (struct scatterlist *)data->buf;
> +     struct scatterlist *sg;
>       int i;
>  
> -     for (i = 0; i < data->dma_nents; i++)
> +     for_each_sg(sgl, sg, data->dma_nents, i)
>               iser_err("sg[%d] dma_addr:0x%lX page:0x%p "
>                        "off:0x%x sz:0x%x dma_len:0x%x\n",
> -                      i, (unsigned long)ib_sg_dma_address(ibdev, &sg[i]),
> -                      sg[i].page, sg[i].offset,
> -                      sg[i].length, ib_sg_dma_len(ibdev, &sg[i]));
> +                      i, (unsigned long)ib_sg_dma_address(ibdev, sg),
> +                      sg->page, sg->offset,
> +                      sg->length, ib_sg_dma_len(ibdev, sg));
>  }
>  
>  static void iser_dump_page_vec(struct iser_page_vec *page_vec)
> -- 
> 1.5.3.rc0.90.gbaa79
> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to