scatterwalk_start(&walk, sg_src);
 
        while (assoclen) {
-               unsigned int len_this_page = scatterwalk_clamp(&walk, assoclen);
-               void *mapped = scatterwalk_map(&walk);
-               const void *src = mapped;
+               unsigned int orig_len_this_step;
+               const u8 *orig_src = scatterwalk_next(&walk, assoclen,
+                                                     &orig_len_this_step);
+               unsigned int len_this_step = orig_len_this_step;
                unsigned int len;
+               const u8 *src = orig_src;
 
-               assoclen -= len_this_page;
-               scatterwalk_advance(&walk, len_this_page);
                if (unlikely(pos)) {
-                       len = min(len_this_page, 16 - pos);
+                       len = min(len_this_step, 16 - pos);
                        memcpy(&buf[pos], src, len);
                        pos += len;
                        src += len;
-                       len_this_page -= len;
+                       len_this_step -= len;
                        if (pos < 16)
                                goto next;
                        aes_gcm_aad_update(key, ghash_acc, buf, 16, flags);
                        pos = 0;
                }
-               len = len_this_page;
+               len = len_this_step;
                if (unlikely(assoclen)) /* Not the last segment yet? */
                        len = round_down(len, 16);
                aes_gcm_aad_update(key, ghash_acc, src, len, flags);
                src += len;
-               len_this_page -= len;
-               if (unlikely(len_this_page)) {
-                       memcpy(buf, src, len_this_page);
-                       pos = len_this_page;
+               len_this_step -= len;
+               if (unlikely(len_this_step)) {
+                       memcpy(buf, src, len_this_step);
+                       pos = len_this_step;
                }
 next:
-               scatterwalk_unmap(mapped);
-               scatterwalk_pagedone(&walk, 0, assoclen);
+               scatterwalk_done_src(&walk, orig_src, orig_len_this_step);
                if (need_resched()) {
                        kernel_fpu_end();
                        kernel_fpu_begin();
                }
+               assoclen -= orig_len_this_step;
        }
        if (unlikely(pos))
                aes_gcm_aad_update(key, ghash_acc, buf, pos, flags);