mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Nigel Cunningham <nigel@suspend2.net>
To: linux-kernel@vger.kernel.org
Subject: [Suspend2][ 15/28] [Suspend2] Allocate swapwriter storage.
Date: Tue, 27 Jun 2006 08:41:57 +1000	[thread overview]
Message-ID: <20060626224155.4975.97208.stgit@nigel.suspend2.net> (raw)
In-Reply-To: <20060626224105.4975.90758.stgit@nigel.suspend2.net>

Allocate swap for the swapwriter to use. We support any number of swap
devices, of both types (partitions and files). After allocating the swap,
update the list of sectors that the entries map to.

Signed-off-by: Nigel Cunningham <nigel@suspend2.net>

 kernel/power/suspend_swap.c |   70 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 66 insertions(+), 4 deletions(-)

diff --git a/kernel/power/suspend_swap.c b/kernel/power/suspend_swap.c
index ae33a4e..efd08ca 100644
--- a/kernel/power/suspend_swap.c
+++ b/kernel/power/suspend_swap.c
@@ -365,7 +365,6 @@ static void get_main_pool_phys_params(vo
 	struct extent *extentpointer = NULL;
 	unsigned long address;
 	int i, extent_min = -1, extent_max = -1, last_chain = -1;
-	int prev_header_pages_allocated;
 
 	for (i = 0; i < MAX_SWAPFILES; i++)
 		if (block_chain[i].first)
@@ -413,9 +412,7 @@ static void get_main_pool_phys_params(vo
 			extent_min, extent_max);
 	}
 
-	prev_header_pages_allocated = header_pages_allocated;
-	header_pages_allocated = 0;
-	swapwriter_allocate_header_space(prev_header_pages_allocated);
+	swapwriter_allocate_header_space(header_pages_allocated);
 }
 
 static int swapwriter_storage_allocated(void)
@@ -483,3 +480,68 @@ static int swapwriter_release_storage(vo
 	return 0;
 }
 
+/* 
+ * Round robin allocation (where swap storage has the same priority).
+ * could make this very inefficient, so we track extents allocated on
+ * a per-swapfiles basis.
+ */
+static int swapwriter_allocate_storage(int space_requested)
+{
+	int i, result = 0, first[MAX_SWAPFILES];
+	int pages_to_get = space_requested - swapextents.size;
+	unsigned long extent_min[MAX_SWAPFILES], extent_max[MAX_SWAPFILES];
+	
+	if (pages_to_get < 1)
+		return 0;
+
+	for (i=0; i < MAX_SWAPFILES; i++) {
+		struct swap_info_struct *si = get_swap_info_struct(i);
+		if ((devinfo[i].bdev = si->bdev))
+			devinfo[i].dev_t = si->bdev->bd_dev;
+		devinfo[i].bmap_shift = 3;
+		devinfo[i].blocks_per_page = 1;
+		first[i] = 1;
+	}
+
+	for(i=0; i < pages_to_get; i++) {
+		swp_entry_t entry;
+		unsigned long new_value;
+		unsigned swapfilenum;
+
+		entry = get_swap_page();
+		if (!entry.val) {
+			printk("Failed to get a swap page.\n");
+			result = -ENOSPC;
+			break;
+		}
+		
+		swapfilenum = swp_type(entry);
+		new_value = swap_entry_to_extent_val(entry);
+		if (first[swapfilenum]) {
+			first[swapfilenum] = 0;
+			extent_min[swapfilenum] = extent_max[swapfilenum] =
+				new_value;
+		} else {
+			if (new_value == extent_max[swapfilenum] + 1)
+				extent_max[swapfilenum]++;
+			else {
+				suspend_add_to_extent_chain(
+					&swapextents,
+					extent_min[swapfilenum],
+					extent_max[swapfilenum]);
+				extent_min[swapfilenum] =
+					extent_max[swapfilenum] = new_value;
+			}
+		}
+	}
+
+	for (i = 0; i < MAX_SWAPFILES; i++)
+		if (!first[i])
+			suspend_add_to_extent_chain(
+				&swapextents,
+				extent_min[i], extent_max[i]);
+
+	get_main_pool_phys_params();
+	return result;
+}
+

--
Nigel Cunningham		nigel at suspend2 dot net

  parent reply	other threads:[~2006-06-26 22:46 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-06-26 22:41 [Suspend2][ 00/28] Swapwriter Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 01/28] [Suspend2] Swapwriter.c header Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 02/28] [Suspend2] Close a bdev used by the swapwriter Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 03/28] [Suspend2] Close bdevs opened " Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 04/28] [Suspend2] Open bdev for swapwriter use Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 05/28] [Suspend2] Enable/disable swapfile Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 06/28] [Suspend2] Try to parse resume2= for swapwriter Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 07/28] [Suspend2] Reset swapwriter when not resuming Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 08/28] [Suspend2] Parse swapwriter signature Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 09/28] [Suspend2] Prepare " Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 10/28] [Suspend2] Allocate swapwriter header space Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 11/28] [Suspend2] Get block chains for swapwriter Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 12/28] [Suspend2] Swapwriter storage allocated and available Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 13/28] [Suspend2] Initialise/cleanup swapwriter Nigel Cunningham
2006-06-26 22:41 ` [Suspend2][ 14/28] [Suspend2] Release swapwriter storage Nigel Cunningham
2006-06-26 22:41 ` Nigel Cunningham [this message]
2006-06-26 22:42 ` [Suspend2][ 16/28] [Suspend2] Initialise/cleanup writing the header Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 17/28] [Suspend2] Swapwriter read image header init/cleanup Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 18/28] [Suspend2] Invalidate swapwriter image Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 19/28] [Suspend2] Swapwriter memory needed Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 20/28] [Suspend2] Get swapwriter debug info Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 21/28] [Suspend2] Get swapwriter image storage needed Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 22/28] [Suspend2] Does a swapwriter image exist? Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 23/28] [Suspend2] Swapwriter mark resume attempted Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 24/28] [Suspend2] Swapwriter parse resume2= Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 25/28] [Suspend2] Read resume2= values for currently enabled swap Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 26/28] [Suspend2] Swapwriter proc entries Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 27/28] [Suspend2] Swapwriter ops Nigel Cunningham
2006-06-26 22:42 ` [Suspend2][ 28/28] [Suspend2] Swapwriter load and unload routines Nigel Cunningham

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=20060626224155.4975.97208.stgit@nigel.suspend2.net \
    --to=nigel@suspend2.net \
    --cc=linux-kernel@vger.kernel.org \
    /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

all inboxes | Powered by JetHome®