unsigned long last_pfn = 0;     /* suppress gcc warning */
        unsigned int max_segment = i915_sg_segment_size();
        unsigned int sg_page_sizes;
-       struct pagevec pvec;
        gfp_t noreclaim;
        int ret;
 
        sg_mark_end(sg);
 err_pages:
        mapping_clear_unevictable(mapping);
-       pagevec_init(&pvec);
-       for_each_sgt_page(page, sgt_iter, st) {
-               if (!pagevec_add(&pvec, page))
+       if (sg != st->sgl) {
+               struct pagevec pvec;
+
+               pagevec_init(&pvec);
+               for_each_sgt_page(page, sgt_iter, st) {
+                       if (!pagevec_add(&pvec, page))
+                               check_release_pagevec(&pvec);
+               }
+               if (pagevec_count(&pvec))
                        check_release_pagevec(&pvec);
        }
-       if (pagevec_count(&pvec))
-               check_release_pagevec(&pvec);
        sg_free_table(st);
        kfree(st);