]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/infiniband/ulp/iser/iser_memory.c
Merge branch 'irq-fix' of git://www.modarm9.com/gitsrc/pub/people/ukleinek/linux...
[linux-2.6-omap-h63xx.git] / drivers / infiniband / ulp / iser / iser_memory.c
index f3529b6f0a337261e3eb275f5b0c48693a747054..cac50c4dc159df8c1202640d6bc0ab13e6b8cc22 100644 (file)
@@ -131,7 +131,7 @@ static int iser_start_rdma_unaligned_sg(struct iscsi_iser_cmd_task *iser_ctask,
 
                p = mem;
                for_each_sg(sgl, sg, data->size, i) {
-                       from = kmap_atomic(sg->page, KM_USER0);
+                       from = kmap_atomic(sg_page(sg), KM_USER0);
                        memcpy(p,
                               from + sg->offset,
                               sg->length);
@@ -191,7 +191,7 @@ void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_cmd_task *iser_ctask,
 
                p = mem;
                for_each_sg(sgl, sg, sg_size, i) {
-                       to = kmap_atomic(sg->page, KM_SOFTIRQ0);
+                       to = kmap_atomic(sg_page(sg), KM_SOFTIRQ0);
                        memcpy(to + sg->offset,
                               p,
                               sg->length);
@@ -300,7 +300,7 @@ static unsigned int iser_data_buf_aligned_len(struct iser_data_buf *data,
        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->page),
+                  (unsigned long)sg_phys(sg),
                   (unsigned long)sg->offset,
                   (unsigned long)sg->length); */
                end_addr = ib_sg_dma_address(ibdev, sg) +
@@ -310,13 +310,15 @@ static unsigned int iser_data_buf_aligned_len(struct iser_data_buf *data,
                if (i + 1 < data->dma_nents) {
                        next_addr = ib_sg_dma_address(ibdev, sg_next(sg));
                        /* are i, i+1 fragments of the same page? */
-                       if (end_addr == next_addr)
+                       if (end_addr == next_addr) {
+                               cnt++;
                                continue;
-                       else if (!IS_4K_ALIGNED(end_addr)) {
+                       else if (!IS_4K_ALIGNED(end_addr)) {
                                ret_len = cnt + 1;
                                break;
                        }
                }
+               cnt++;
        }
        if (i == data->dma_nents)
                ret_len = cnt;  /* loop ended */
@@ -332,11 +334,14 @@ static void iser_data_buf_dump(struct iser_data_buf *data,
        struct scatterlist *sg;
        int i;
 
+       if (iser_debug_level == 0)
+               return;
+
        for_each_sg(sgl, sg, data->dma_nents, i)
-               iser_err("sg[%d] dma_addr:0x%lX page:0x%p "
+               iser_warn("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),
-                        sg->page, sg->offset,
+                        sg_page(sg), sg->offset,
                         sg->length, ib_sg_dma_len(ibdev, sg));
 }
 
@@ -418,6 +423,7 @@ void iser_dma_unmap_task_data(struct iscsi_iser_cmd_task *iser_ctask)
 int iser_reg_rdma_mem(struct iscsi_iser_cmd_task *iser_ctask,
                      enum   iser_data_dir        cmd_dir)
 {
+       struct iscsi_conn    *iscsi_conn = iser_ctask->iser_conn->iscsi_conn;
        struct iser_conn     *ib_conn = iser_ctask->iser_conn->ib_conn;
        struct iser_device   *device = ib_conn->device;
        struct ib_device     *ibdev = device->ib_device;
@@ -432,7 +438,8 @@ int iser_reg_rdma_mem(struct iscsi_iser_cmd_task *iser_ctask,
 
        aligned_len = iser_data_buf_aligned_len(mem, ibdev);
        if (aligned_len != mem->dma_nents) {
-               iser_err("rdma alignment violation %d/%d aligned\n",
+               iscsi_conn->fmr_unalign_cnt++;
+               iser_warn("rdma alignment violation %d/%d aligned\n",
                         aligned_len, mem->size);
                iser_data_buf_dump(mem, ibdev);