From: Nigel Cunningham <nigel@tuxonice.net>
To: "Rafael J. Wysocki" <rjw@sisk.pl>,
Linux PM <linux-pm@lists.linux-foundation.org>,
LKML <linux-kernel@vger.kernel.org>,
TuxOnIce-devel <tuxonice-devel@tuxonice.net>
Subject: [PATCH 08/22] Hibernation: Iterate over sectors not swap entries.
Date: Sat, 25 Sep 2010 14:16:50 +1000 [thread overview]
Message-ID: <1285388224-10012-9-git-send-email-nigel@tuxonice.net> (raw)
In-Reply-To: <1285388224-10012-1-git-send-email-nigel@tuxonice.net>
Record sectors in extents when allocating storage, and use the
sector numbers instead of swap offsets as we write the image. If
we then store these sector extents at the start of the image (as
following patches will do), we can drop the index pages that are
interspersed with the image, do fully asynchronous I/O (which
should give a speed boost) and perhaps also remove some of the
duplication in the paths for reading and writing pages.
Signed-off-by: Nigel Cunningham <nigel@tuxonice.net>
---
kernel/power/swap.c | 25 ++++++++++---------------
1 files changed, 10 insertions(+), 15 deletions(-)
diff --git a/kernel/power/swap.c b/kernel/power/swap.c
index da2439d..0c87522 100644
--- a/kernel/power/swap.c
+++ b/kernel/power/swap.c
@@ -77,14 +77,7 @@ struct swsusp_header {
static struct swsusp_header *swsusp_header;
static struct hib_extent_state swap_extents;
-
-static sector_t next_swapdev_block(void)
-{
- unsigned long res = hib_extent_next(&swap_extents);
- if (res)
- res = swapdev_block(root_swap, res);
- return res;
-}
+static struct hib_extent_state sector_extents;
/**
* alloc_swapdev_block - allocate a swap page and register that it has
@@ -93,14 +86,16 @@ static sector_t next_swapdev_block(void)
sector_t alloc_swapdev_block(int swap)
{
- unsigned long offset;
+ unsigned long offset, sector;
offset = swp_offset(get_swap_page_of_type(swap));
if (offset) {
- if (hib_extents_insert(&swap_extents, offset))
+ sector = swapdev_block(swap, offset);
+ if (hib_extents_insert(&swap_extents, offset) ||
+ hib_extents_insert(§or_extents, sector))
swap_free(swp_entry(swap, offset));
else
- return swapdev_block(swap, offset);
+ return sector;
}
return 0;
}
@@ -141,7 +136,7 @@ static int allocate_swap(unsigned int nr_pages)
return 0;
}
- hib_reset_extent_pos(&swap_extents);
+ hib_reset_extent_pos(§or_extents);
return 1;
}
@@ -283,7 +278,7 @@ static int get_swap_writer(struct swap_map_handle *handle, unsigned long pages)
ret = -ENOSPC;
goto err_close;
}
- handle->cur_swap = next_swapdev_block();
+ handle->cur_swap = hib_extent_next(§or_extents);
if (!handle->cur_swap) {
ret = -ENOSPC;
goto err_rel;
@@ -306,7 +301,7 @@ static int swap_write_page(struct swap_map_handle *handle, void *buf,
if (!handle->cur)
return -EINVAL;
- offset = next_swapdev_block();
+ offset = hib_extent_next(§or_extents);
error = write_page(buf, offset, bio_chain);
if (error)
return error;
@@ -315,7 +310,7 @@ static int swap_write_page(struct swap_map_handle *handle, void *buf,
error = hib_wait_on_bio_chain(bio_chain);
if (error)
goto out;
- offset = next_swapdev_block();
+ offset = hib_extent_next(§or_extents);
if (!offset)
return -ENOSPC;
handle->cur->next_swap = offset;
--
1.7.0.4
next prev parent reply other threads:[~2010-09-25 4:20 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-25 4:16 Nigel's current for-rafael queue Nigel Cunningham
2010-09-25 4:16 ` [PATCH 01/22] Record & display i/o speed post resume Nigel Cunningham
2010-09-25 4:16 ` [PATCH 02/22] Hibernation: Swap iteration functions Nigel Cunningham
2010-09-25 4:16 ` [PATCH 03/22] Hibernation: Move root_swap declaration Nigel Cunningham
2010-09-25 4:16 ` [PATCH 04/22] Hibernation: Add mass swap allocation routine Nigel Cunningham
2010-09-25 4:16 ` [PATCH 05/22] Hibernation: Switch to preallocating swap Nigel Cunningham
2010-09-25 21:24 ` Rafael J. Wysocki
2010-09-25 21:32 ` Nigel Cunningham
2010-09-25 22:22 ` Rafael J. Wysocki
2010-09-25 4:16 ` [PATCH 06/22] Hiberation: Fix speed display Nigel Cunningham
2010-09-25 4:16 ` [PATCH 07/22] Hibernation: Generic extents support Nigel Cunningham
2010-09-25 4:16 ` Nigel Cunningham [this message]
2010-09-25 4:16 ` [PATCH 09/22] Hibernation: Stop passing swap_map_handle struct Nigel Cunningham
2010-09-25 4:16 ` [PATCH 10/22] Hibernation: Stop passing bio_chain around Nigel Cunningham
2010-09-25 4:16 ` [PATCH 11/22] Hibernation: Move block i/o fns to block_io.c Nigel Cunningham
2010-09-25 4:16 ` [PATCH 12/22] Hibernation: Partial page I/O support Nigel Cunningham
2010-09-25 4:16 ` [PATCH 13/22] Hibernation: Extent save/load routines Nigel Cunningham
2010-09-25 22:12 ` Rafael J. Wysocki
2010-09-25 4:16 ` [PATCH 14/22] Hibernation: Store block extents at start of image Nigel Cunningham
2010-09-25 4:16 ` [PATCH 15/22] Hibernation: Use block extents for reading image Nigel Cunningham
2010-09-25 4:16 ` [PATCH 16/22] Remove first_sector from swap_map_handle Nigel Cunningham
2010-09-25 4:16 ` [PATCH 17/22] Hibernation: Replace bio chain Nigel Cunningham
2010-09-25 4:17 ` [PATCH 18/22] Hibernation: Remove swap_map_pages Nigel Cunningham
2010-09-25 4:17 ` [PATCH 19/22] Hibernation: Remove wait_on_bio_chain result Nigel Cunningham
2010-09-25 4:17 ` [PATCH 20/22] Hibernation: Prepare for handle.cur removal Nigel Cunningham
2010-09-25 4:17 ` [PATCH 21/22] Hibernation: Remove swap_map structure Nigel Cunningham
2010-09-25 4:17 ` [PATCH 22/22] Hibernation: Remove now-empty routines Nigel Cunningham
2010-09-25 15:04 ` [linux-pm] Nigel's current for-rafael queue Martin Steigerwald
2010-09-25 21:21 ` Nigel Cunningham
2010-09-25 22:19 ` Rafael J. Wysocki
2010-09-25 22:33 ` Nigel Cunningham
2010-09-25 22:36 ` Rafael J. Wysocki
2010-09-28 10:34 ` [TuxOnIce-devel] " Martin Steigerwald
2010-09-30 7:52 ` unable to handle paging request at resume (was: Re: [TuxOnIce-devel] Nigel's current for-rafael queue) Martin Steigerwald
2010-10-02 16:51 ` [linux-pm] " Martin Steigerwald
2010-09-28 19:45 ` [TuxOnIce-devel] Nigel's current for-rafael queue Martin Steigerwald
2010-09-28 21:25 ` Nigel Cunningham
2010-09-30 7:56 ` Martin Steigerwald
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1285388224-10012-9-git-send-email-nigel@tuxonice.net \
--to=nigel@tuxonice.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@lists.linux-foundation.org \
--cc=rjw@sisk.pl \
--cc=tuxonice-devel@tuxonice.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).