The SWAP_MAP_SHMEM indicates last map from shmem.  Therefore we can drop
SWAP_MAP_SHMEM in batch in similar way to drop last ref count in batch.
Link: https://lkml.kernel.org/r/20250325162528.68385-6-shikemeng@huaweicloud.com
Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
Reviewed-by: Tim Chen <tim.c.chen@linux.intel.com>
Reviewed-by: Baoquan He <bhe@redhat.com>
Cc: Kairui Song <kasong@tencent.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
        unsigned char *map_end = map + nr_pages;
        unsigned char count = *map;
 
-       if (swap_count(count) != 1)
+       if (swap_count(count) != 1 && swap_count(count) != SWAP_MAP_SHMEM)
                return false;
 
        while (++map < map_end) {
        unsigned char count;
        int i;
 
-       if (nr <= 1 || swap_count(data_race(si->swap_map[offset])) != 1)
+       if (nr <= 1)
+               goto fallback;
+       count = swap_count(data_race(si->swap_map[offset]));
+       if (count != 1 && count != SWAP_MAP_SHMEM)
                goto fallback;
        /* cross into another cluster */
        if (nr > SWAPFILE_CLUSTER - offset % SWAPFILE_CLUSTER)