From nobody Sat Jul 25 20:04:11 2026 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 39D653EDE43 for ; Tue, 14 Jul 2026 07:26:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784013996; cv=none; b=TuIwS9S8+RlaAC8oXYfAOYfz7Sv8Tc5qDD3YzEH6QmiToB1t1W81sZJYScCVxwbeTc9+5QRnmhAhzrcayFJ6YgMPXuXElnayn6lTMK2jypIxBefzlFfeymByJ07OjJJhE94cRHosBbTMOLfWbsNi9yXApOdRYJ2hOaT+I0wayeQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784013996; c=relaxed/simple; bh=gqgxlL1wcIWRjiux7JiXsDXzrjtgh8gyXp/zU0l3m8g=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=rckDrcSwAVMnCShsLW0EWeT1+TZ5EeUslGeItCmhwVTP+jKczdFoE/Y/z+ch0ORgfQkzgAHLC9Ao1TVGxGM8QQrpbCDu1Mzhi38WyBFFLsBJR1BYD53g5SZ/jtuu+n89gamAKS0XhykH4LnL5e2ygAOSe4SrV7X6n/c7DA4KWgk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=faOnuevi; arc=none smtp.client-ip=209.85.216.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="faOnuevi" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-38df94d4dd8so464074a91.2 for ; Tue, 14 Jul 2026 00:26:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784013994; x=1784618794; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=uWrGC49VmtfhMBZgg//gtgGRJAMo+Z0lMImYE7VXdcY=; b=faOnueviJbhndehZnf4qH+wWVWlVvyP0JQVfjbHFQFWQhY2/HtnRtdKMsCg4mbIVvj a1pHXpQyqnNLdt3vEWa5EsSuPhGlq4LIy+ryawUEnNKlYGSpu2MW1pHhBsg4iX4KaIzA hwYGpzBE3bwB2vzDkyfSQXD/XabJ4F5dxsjLySPagn3umkSezGFUMuG+iQLUk6Oflye8 kSCKUUzEbwC9+rAIbKo8Z5Grl8yo3yjY7SIiPNfQD9e2DuBYY8eAVld11mKfgC9MWiD4 Yrv2VS7FV8lA1RORkZHc1LXesK7BfP9s7MIjMNZcpp7I/MOpjpbMwtZxL1GIebLqpfeA Mkrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784013994; x=1784618794; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=uWrGC49VmtfhMBZgg//gtgGRJAMo+Z0lMImYE7VXdcY=; b=lnTIwFdihlKFM9f+SWvbbqMQOFTMiF1K9cmud4z3wxw8WX9J1LDVtMfqLc6+Kz5mJD Fl3ksuKauKFMkhennXjZvZ+EdADZrgABydWp+ByYTpPSYrjtYKMf9/PXysv04KTfH/S+ xLyJYYQaA/Az7POgYrblWLwX+95Ft2AsO0aPW3OCiHA4KNikkiHBsm/4PO5GmmjWDzsv Zg27IA9TyATY7h++Z1Hf70QwyGHrUiouZUCs+vYixctGSxF5n7A8hSoF+M3rcOJCprj+ Y5OnkrG0WvtZt9/hI8ANnGkih2ZtE+uk4j5mDWNMXE4tvydBfWfYols8TjQ6w0+kQdrl vLHg== X-Forwarded-Encrypted: i=1; AHgh+RpWsDg2ZeYgu2sbX2Gw1BXseiGxBXBcXHW8cnW7QTk+uiN0bjLwTaUaWXkoenFdlh0FOiDGrRH+1qbmukI=@vger.kernel.org X-Gm-Message-State: AOJu0YycyqvWc9r2UiYtZA/F9AYk7sSMAV8LFkrqAMahJNxQQJZGE5Sv q2WDK/OEyjnNSvD1v+YEfx2sM5383zxM/3KDDr2oqOcr/bXgGC4pxdsOxQXJ3w== X-Gm-Gg: AfdE7ckqXRGZ5fQQbw7LEZQPmlvkss+HdDo17rgPqAJOKZ5wnHMKcQSVQJEWR2EXzVb Qa70BBlAEwI7DB1iZ8K8MoGv0pkyFdpYmgP1BgxmMizKaPt6odANeeGTdPTTXHXt+SCC0dkBjFk sQQ+4slTAlbFitoHV1vbuDsmqAHYY/GUXhJ0qAvZ1dO+KeonsVleZPGwm3k8fHIyuT+Lk3vT1/G CPhYgVgGgI2zhz5ZqwRnS4Uoe753yxnYoAv0C2Ly/W0f5jrK/JyOuAMqddMx8h5w8GlyAj7JT9F jLF9RmrA1mbGtywtJ5f1FU00Fl6DXEmpfLy1S0Tu0v5y3dhddbkZWIjFtg4eGsqalarD2tpjqOf qFchx0Ho6vP2hEBIXcNhkNc/XlW3I81VdJQmzr4cUOIjDLI1oFdzh3dwj54qUIg75+pXKT4YPi6 353X1Qn2Jw7WjZys3ETZZCVp+MGxjy7Zime6jIdmXFC07LaoLuL1g= X-Received: by 2002:a17:90b:4a0c:b0:37f:ec5e:12d9 with SMTP id 98e67ed59e1d1-38dc75f6500mr11902857a91.16.1784013994502; Tue, 14 Jul 2026 00:26:34 -0700 (PDT) Received: from matthiaskim-HP-Z8-G4-Workstation.. ([27.122.242.71]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38e172fd17asm1041271a91.12.2026.07.14.00.26.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2026 00:26:34 -0700 (PDT) From: Haesung Kim To: "Rafael J . Wysocki" , Pavel Machek Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, matia.kim@lge.com, gunho.lee@lge.com Subject: [PATCH] PM: hibernate: swap: defer linking the next map page Date: Tue, 14 Jul 2026 16:26:27 +0900 Message-Id: <20260714072627.3165744-1-mattkim513@gmail.com> X-Mailer: git-send-email 2.34.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Delay allocating and linking the next swap_map_page until another image page actually needs to be recorded. The previous code linked and wrote a new swap map page as soon as the current one became full. When the image size was an exact multiple of MAP_PAGE_ENTRIES, that left an empty final map page that existed only to terminate the on-disk chain. Instead, keep a full map page in memory and only allocate the next map page when the next image page arrives. This preserves the resume chain while avoiding an unnecessary swap slot allocation and write for the empty swap map page. Signed-off-by: Haesung Kim --- kernel/power/swap.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/kernel/power/swap.c b/kernel/power/swap.c index c626e9dc3c1c..e5cffb399e3a 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -430,19 +430,22 @@ static int swap_write_page(struct swap_map_handle *ha= ndle, void *buf, =20 if (!handle->cur) return -EINVAL; - offset =3D alloc_swapdev_block(root_swap); - error =3D write_page(buf, offset, hb); - if (error) - return error; - handle->cur->entries[handle->k++] =3D offset; + + /* + * If the current map page is full, allocate and link next one first. + * Delaying this until here avoids writing an empty swap map page when + * the image size is an exact MAP_PAGE_ENTRIES multiple. + */ if (handle->k >=3D MAP_PAGE_ENTRIES) { offset =3D alloc_swapdev_block(root_swap); if (!offset) return -ENOSPC; + handle->cur->next_swap =3D offset; error =3D write_page(handle->cur, handle->cur_swap, hb); if (error) - goto out; + return error; + clear_page(handle->cur); handle->cur_swap =3D offset; handle->k =3D 0; @@ -450,7 +453,7 @@ static int swap_write_page(struct swap_map_handle *hand= le, void *buf, if (hb && low_free_pages() <=3D handle->reqd_free_pages) { error =3D hib_wait_io(hb); if (error) - goto out; + return error; /* * Recalculate the number of required free pages, to * make sure we never take more than half. @@ -458,14 +461,21 @@ static int swap_write_page(struct swap_map_handle *ha= ndle, void *buf, handle->reqd_free_pages =3D reqd_free_pages(); } } - out: - return error; + + offset =3D alloc_swapdev_block(root_swap); + error =3D write_page(buf, offset, hb); + if (error) + return error; + handle->cur->entries[handle->k++] =3D offset; + return 0; } =20 static int flush_swap_writer(struct swap_map_handle *handle) { - if (handle->cur && handle->cur_swap) + if (handle->cur && handle->cur_swap && handle->k) return write_page(handle->cur, handle->cur_swap, NULL); + else if (handle->cur && handle->cur_swap) + return 0; else return -EINVAL; } --=20 2.34.1