On Sat, Feb 22, 2025 at 3:12 PM Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx> wrote:
>
> Before alloc from a cluster, we will aqcuire cluster's lock and make
> sure it is usable by cluster_is_usable(), so there is no need to
> set SWAP_MAP_BAD for cluster to be discarded.
>
> Signed-off-by: Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx>
> ---
> mm/swapfile.c | 11 -----------
> 1 file changed, 11 deletions(-)
>
> diff --git a/mm/swapfile.c b/mm/swapfile.c
> index fc45b9d56639..c640f77a464a 100644
> --- a/mm/swapfile.c
> +++ b/mm/swapfile.c
> @@ -479,15 +479,6 @@ static void move_cluster(struct swap_info_struct *si,
> static void swap_cluster_schedule_discard(struct swap_info_struct *si,
> struct swap_cluster_info *ci)
> {
> - unsigned int idx = cluster_index(si, ci);
> - /*
> - * If scan_swap_map_slots() can't find a free cluster, it will check
> - * si->swap_map directly. To make sure the discarding cluster isn't
> - * taken by scan_swap_map_slots(), mark the swap entries bad (occupied).
> - * It will be cleared after discard
> - */
> - memset(si->swap_map + idx * SWAPFILE_CLUSTER,
> - SWAP_MAP_BAD, SWAPFILE_CLUSTER);
> VM_BUG_ON(ci->flags == CLUSTER_FLAG_FREE);
> move_cluster(si, ci, &si->discard_clusters, CLUSTER_FLAG_DISCARD);
> schedule_work(&si->discard_work);
> @@ -571,8 +562,6 @@ static bool swap_do_scheduled_discard(struct swap_info_struct *si)
> * return the cluster to allocation list.
> */
> ci->flags = CLUSTER_FLAG_NONE;
> - memset(si->swap_map + idx * SWAPFILE_CLUSTER,
> - 0, SWAPFILE_CLUSTER);
> __free_cluster(si, ci);
> spin_unlock(&ci->lock);
> ret = true;
Good, I wanted to do this some time ago, but forgot about this while busy with other things.
Reviewed-by: Kairui Song <kasong@xxxxxxxxxxx>
>
> Before alloc from a cluster, we will aqcuire cluster's lock and make
> sure it is usable by cluster_is_usable(), so there is no need to
> set SWAP_MAP_BAD for cluster to be discarded.
>
> Signed-off-by: Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx>
> ---
> mm/swapfile.c | 11 -----------
> 1 file changed, 11 deletions(-)
>
> diff --git a/mm/swapfile.c b/mm/swapfile.c
> index fc45b9d56639..c640f77a464a 100644
> --- a/mm/swapfile.c
> +++ b/mm/swapfile.c
> @@ -479,15 +479,6 @@ static void move_cluster(struct swap_info_struct *si,
> static void swap_cluster_schedule_discard(struct swap_info_struct *si,
> struct swap_cluster_info *ci)
> {
> - unsigned int idx = cluster_index(si, ci);
> - /*
> - * If scan_swap_map_slots() can't find a free cluster, it will check
> - * si->swap_map directly. To make sure the discarding cluster isn't
> - * taken by scan_swap_map_slots(), mark the swap entries bad (occupied).
> - * It will be cleared after discard
> - */
> - memset(si->swap_map + idx * SWAPFILE_CLUSTER,
> - SWAP_MAP_BAD, SWAPFILE_CLUSTER);
> VM_BUG_ON(ci->flags == CLUSTER_FLAG_FREE);
> move_cluster(si, ci, &si->discard_clusters, CLUSTER_FLAG_DISCARD);
> schedule_work(&si->discard_work);
> @@ -571,8 +562,6 @@ static bool swap_do_scheduled_discard(struct swap_info_struct *si)
> * return the cluster to allocation list.
> */
> ci->flags = CLUSTER_FLAG_NONE;
> - memset(si->swap_map + idx * SWAPFILE_CLUSTER,
> - 0, SWAPFILE_CLUSTER);
> __free_cluster(si, ci);
> spin_unlock(&ci->lock);
> ret = true;
Good, I wanted to do this some time ago, but forgot about this while busy with other things.
Reviewed-by: Kairui Song <kasong@xxxxxxxxxxx>