From: Nigel Cunningham <nigel@tuxonice.net>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Linux PM <linux-pm@lists.linux-foundation.org>,
LKML <linux-kernel@vger.kernel.org>,
TuxOnIce-devel <tuxonice-devel@tuxonice.net>
Subject: Re: [PATCH 05/22] Hibernation: Switch to preallocating swap.
Date: Sun, 26 Sep 2010 07:32:37 +1000 [thread overview]
Message-ID: <4C9E6A75.8090702@tuxonice.net> (raw)
In-Reply-To: <201009252324.39445.rjw@sisk.pl>
Morning.
On 26/09/10 07:24, Rafael J. Wysocki wrote:
> On Saturday, September 25, 2010, Nigel Cunningham wrote:
>> Switch from allocating swap as the image is written to allocating
>> storage prior to writing the image.
>
> Hmm, I think I know what the patch does, but I don't really understand the
> changelog. Care to explain/fix?
Sure. I was a little terse, wasn't I? :)
Prior to this patch, we allocated swap as we were writing the image.
This patch changes things so that we instead allocate all the swap we'll
need prior to starting to write the image. It lays groundwork for later
patches that switch from doing I/O in batches.
Regards,
Nigel
> Thanks,
> Rafael
>
>
>> Signed-off-by: Nigel Cunningham<nigel@tuxonice.net>
>> ---
>> kernel/power/swap.c | 62 ++++++++++++++++++++++++++++++--------------------
>> 1 files changed, 37 insertions(+), 25 deletions(-)
>>
>> diff --git a/kernel/power/swap.c b/kernel/power/swap.c
>> index cebf91c..bebd2cf 100644
>> --- a/kernel/power/swap.c
>> +++ b/kernel/power/swap.c
>> @@ -202,6 +202,33 @@ int alloc_swapdev_blocks(int needed)
>> }
>>
>> /**
>> + * allocate_swap - Allocate enough swap to save the image.
>> + *
>> + * Calculates the number of swap pages actually needed and seeks
>> + * to allocate that many from the resume partition. Returns TRUE
>> + * or FALSE to indicate whether we got enough storage.
>> + */
>> +
>> +static int allocate_swap(unsigned int nr_pages)
>> +{
>> + unsigned int free_swap = count_swap_pages(root_swap, 1);
>> +
>> + nr_pages += DIV_ROUND_UP(nr_pages, MAP_PAGE_ENTRIES);
>> +
>> + pr_debug("PM: Free swap pages: %u\n", free_swap);
>> + if (free_swap< nr_pages)
>> + return 0;
>> +
>> + if (alloc_swapdev_blocks(nr_pages)< nr_pages) {
>> + free_all_swap_pages(root_swap);
>> + return 0;
>> + }
>> +
>> + reset_storage_pos();
>> + return 1;
>> +}
>> +
>> +/**
>> * free_all_swap_pages - free swap pages allocated for saving image data.
>> * It also frees the extents used to register which swap entries had been
>> * allocated.
>> @@ -324,7 +351,7 @@ static void release_swap_writer(struct swap_map_handle *handle)
>> handle->cur = NULL;
>> }
>>
>> -static int get_swap_writer(struct swap_map_handle *handle)
>> +static int get_swap_writer(struct swap_map_handle *handle, unsigned long pages)
>> {
>> int ret;
>>
>> @@ -340,7 +367,12 @@ static int get_swap_writer(struct swap_map_handle *handle)
>> ret = -ENOMEM;
>> goto err_close;
>> }
>> - handle->cur_swap = alloc_swapdev_block(root_swap);
>> + if (!allocate_swap(pages)) {
>> + printk(KERN_ERR "PM: Not enough free swap\n");
>> + ret = -ENOSPC;
>> + goto err_close;
>> + }
>> + handle->cur_swap = next_swapdev_block();
>> if (!handle->cur_swap) {
>> ret = -ENOSPC;
>> goto err_rel;
>> @@ -363,7 +395,7 @@ static int swap_write_page(struct swap_map_handle *handle, void *buf,
>>
>> if (!handle->cur)
>> return -EINVAL;
>> - offset = alloc_swapdev_block(root_swap);
>> + offset = next_swapdev_block();
>> error = write_page(buf, offset, bio_chain);
>> if (error)
>> return error;
>> @@ -372,7 +404,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 = alloc_swapdev_block(root_swap);
>> + offset = next_swapdev_block();
>> if (!offset)
>> return -ENOSPC;
>> handle->cur->next_swap = offset;
>> @@ -463,21 +495,6 @@ static int save_image(struct swap_map_handle *handle,
>> }
>>
>> /**
>> - * enough_swap - Make sure we have enough swap to save the image.
>> - *
>> - * Returns TRUE or FALSE after checking the total amount of swap
>> - * space avaiable from the resume partition.
>> - */
>> -
>> -static int enough_swap(unsigned int nr_pages)
>> -{
>> - unsigned int free_swap = count_swap_pages(root_swap, 1);
>> -
>> - pr_debug("PM: Free swap pages: %u\n", free_swap);
>> - return free_swap> nr_pages + PAGES_FOR_IO;
>> -}
>> -
>> -/**
>> * swsusp_write - Write entire image and metadata.
>> * @flags: flags to pass to the "boot" kernel in the image header
>> *
>> @@ -496,16 +513,11 @@ int swsusp_write(unsigned int flags)
>> int error;
>>
>> pages = snapshot_get_image_size();
>> - error = get_swap_writer(&handle);
>> + error = get_swap_writer(&handle, pages);
>> if (error) {
>> printk(KERN_ERR "PM: Cannot get swap writer\n");
>> return error;
>> }
>> - if (!enough_swap(pages)) {
>> - printk(KERN_ERR "PM: Not enough free swap\n");
>> - error = -ENOSPC;
>> - goto out_finish;
>> - }
>> memset(&snapshot, 0, sizeof(struct snapshot_handle));
>> error = snapshot_read_next(&snapshot);
>> if (error< PAGE_SIZE) {
>>
>
>
next prev parent reply other threads:[~2010-09-25 21:32 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 [this message]
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 ` [PATCH 08/22] Hibernation: Iterate over sectors not swap entries Nigel Cunningham
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=4C9E6A75.8090702@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).