vaddr = kmap_atomic_px(i915_pt_entry(pd, act_pt));
        do {
-               GEM_BUG_ON(iter.sg->length < I915_GTT_PAGE_SIZE);
+               GEM_BUG_ON(sg_dma_len(iter.sg) < I915_GTT_PAGE_SIZE);
                vaddr[act_pte] = pte_encode | GEN6_PTE_ADDR_ENCODE(iter.dma);
 
                iter.dma += I915_GTT_PAGE_SIZE;
                if (iter.dma == iter.max) {
                        iter.sg = __sg_next(iter.sg);
-                       if (!iter.sg)
+                       if (!iter.sg || sg_dma_len(iter.sg) == 0)
                                break;
 
                        iter.dma = sg_dma_address(iter.sg);
-                       iter.max = iter.dma + iter.sg->length;
+                       iter.max = iter.dma + sg_dma_len(iter.sg);
                }
 
                if (++act_pte == GEN6_PTES) {
 
        pd = i915_pd_entry(pdp, gen8_pd_index(idx, 2));
        vaddr = kmap_atomic_px(i915_pt_entry(pd, gen8_pd_index(idx, 1)));
        do {
-               GEM_BUG_ON(iter->sg->length < I915_GTT_PAGE_SIZE);
+               GEM_BUG_ON(sg_dma_len(iter->sg) < I915_GTT_PAGE_SIZE);
                vaddr[gen8_pd_index(idx, 0)] = pte_encode | iter->dma;
 
                iter->dma += I915_GTT_PAGE_SIZE;
                if (iter->dma >= iter->max) {
                        iter->sg = __sg_next(iter->sg);
-                       if (!iter->sg) {
+                       if (!iter->sg || sg_dma_len(iter->sg) == 0) {
                                idx = 0;
                                break;
                        }
 
                        iter->dma = sg_dma_address(iter->sg);
-                       iter->max = iter->dma + iter->sg->length;
+                       iter->max = iter->dma + sg_dma_len(iter->sg);
                }
 
                if (gen8_pd_index(++idx, 0) == 0) {
                                   u32 flags)
 {
        const gen8_pte_t pte_encode = gen8_pte_encode(0, cache_level, flags);
+       unsigned int rem = sg_dma_len(iter->sg);
        u64 start = vma->node.start;
-       dma_addr_t rem = iter->sg->length;
 
        GEM_BUG_ON(!i915_vm_is_4lvl(vma->vm));
 
                }
 
                do {
-                       GEM_BUG_ON(iter->sg->length < page_size);
+                       GEM_BUG_ON(sg_dma_len(iter->sg) < page_size);
                        vaddr[index++] = encode | iter->dma;
 
                        start += page_size;
                                if (!iter->sg)
                                        break;
 
-                               rem = iter->sg->length;
+                               rem = sg_dma_len(iter->sg);
+                               if (!rem)
+                                       break;
+
                                iter->dma = sg_dma_address(iter->sg);
                                iter->max = iter->dma + rem;
 
                }
 
                vma->page_sizes.gtt |= page_size;
-       } while (iter->sg);
+       } while (iter->sg && sg_dma_len(iter->sg));
 }
 
 static void gen8_ppgtt_insert(struct i915_address_space *vm,
 
 } __sgt_iter(struct scatterlist *sgl, bool dma) {
        struct sgt_iter s = { .sgp = sgl };
 
-       if (s.sgp) {
+       if (dma && s.sgp && sg_dma_len(s.sgp) == 0) {
+               s.sgp = NULL;
+       } else if (s.sgp) {
                s.max = s.curr = s.sgp->offset;
-               s.max += s.sgp->length;
-               if (dma)
+               if (dma) {
                        s.dma = sg_dma_address(s.sgp);
-               else
+                       s.max += sg_dma_len(s.sgp);
+               } else {
                        s.pfn = page_to_pfn(sg_page(s.sgp));
+                       s.max += s.sgp->length;
+               }
        }
 
        return s;