struct shmem_inode_info *info = SHMEM_I(inode);
        int nr_pages = 1 << order;
        struct folio *new;
+       gfp_t alloc_gfp;
        void *shadow;
 
        /*
         * limit chance of success with further cpuset and node constraints.
         */
        gfp &= ~GFP_CONSTRAINT_MASK;
+       alloc_gfp = gfp;
        if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) {
                if (WARN_ON_ONCE(order))
                        return ERR_PTR(-EINVAL);
                if ((vma && unlikely(userfaultfd_armed(vma))) ||
                     !zswap_never_enabled() ||
                     non_swapcache_batch(entry, nr_pages) != nr_pages)
-                       return ERR_PTR(-EINVAL);
+                       goto fallback;
 
-               gfp = limit_gfp_mask(vma_thp_gfp_mask(vma), gfp);
+               alloc_gfp = limit_gfp_mask(vma_thp_gfp_mask(vma), gfp);
+       }
+retry:
+       new = shmem_alloc_folio(alloc_gfp, order, info, index);
+       if (!new) {
+               new = ERR_PTR(-ENOMEM);
+               goto fallback;
        }
-
-       new = shmem_alloc_folio(gfp, order, info, index);
-       if (!new)
-               return ERR_PTR(-ENOMEM);
 
        if (mem_cgroup_swapin_charge_folio(new, vma ? vma->vm_mm : NULL,
-                                          gfp, entry)) {
+                                          alloc_gfp, entry)) {
                folio_put(new);
-               return ERR_PTR(-ENOMEM);
+               new = ERR_PTR(-ENOMEM);
+               goto fallback;
        }
 
        /*
         */
        if (swapcache_prepare(entry, nr_pages)) {
                folio_put(new);
-               return ERR_PTR(-EEXIST);
+               new = ERR_PTR(-EEXIST);
+               /* Try smaller folio to avoid cache conflict */
+               goto fallback;
        }
 
        __folio_set_locked(new);
        folio_add_lru(new);
        swap_read_folio(new, NULL);
        return new;
+fallback:
+       /* Order 0 swapin failed, nothing to fallback to, abort */
+       if (!order)
+               return new;
+       entry.val += index - round_down(index, nr_pages);
+       alloc_gfp = gfp;
+       nr_pages = 1;
+       order = 0;
+       goto retry;
 }
 
 /*
                        }
 
                        /*
-                        * Fallback to swapin order-0 folio unless the swap entry
-                        * already exists.
+                        * Direct swapin handled order 0 fallback already,
+                        * if it failed, abort.
                         */
                        error = PTR_ERR(folio);
                        folio = NULL;
-                       if (error == -EEXIST)
-                               goto failed;
+                       goto failed;
                }
 
                /*