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][ 4/9] [Suspend2] Add extent to extent chain.
Date: Tue, 27 Jun 2006 02:54:18 +1000	[thread overview]
Message-ID: <20060626165417.11065.15610.stgit@nigel.suspend2.net> (raw)
In-Reply-To: <20060626165404.11065.91833.stgit@nigel.suspend2.net>

Add a new extent, possibly merging it with existing extents.

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

 kernel/power/extent.c |   71 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 71 insertions(+), 0 deletions(-)

diff --git a/kernel/power/extent.c b/kernel/power/extent.c
index ab19509..31fcb65 100644
--- a/kernel/power/extent.c
+++ b/kernel/power/extent.c
@@ -70,3 +70,74 @@ void suspend_put_extent_chain(struct ext
 	chain->size = chain->allocs = chain->frees = 0;
 }
 
+/* 
+ * suspend_add_to_extent_chain
+ *
+ * Add an extent to an existing chain.
+ */
+int suspend_add_to_extent_chain(struct extent_chain *chain, 
+		unsigned long minimum, unsigned long maximum)
+{
+	struct extent *new_extent = NULL, *start_at;
+
+	/* Find the right place in the chain */
+	start_at = (chain->last_touched && 
+		    (chain->last_touched->minimum < minimum)) ?
+		chain->last_touched : NULL;
+
+	if (!start_at && chain->first && chain->first->minimum < minimum)
+		start_at = chain->first;
+
+	while (start_at && start_at->next && start_at->next->minimum < minimum)
+		start_at = start_at->next;
+
+	if (start_at && start_at->maximum == (minimum - 1)) {
+		start_at->maximum = maximum;
+
+		/* Merge with the following one? */
+		if (start_at->next &&
+		    start_at->maximum + 1 == start_at->next->minimum) {
+			struct extent *to_free = start_at->next;
+			start_at->maximum = start_at->next->maximum;
+			start_at->next = start_at->next->next;
+			chain->frees++;
+			suspend_put_extent(to_free);
+		}
+
+		chain->last_touched = start_at;
+		chain->size+= (maximum - minimum + 1);
+
+		return 0;
+	}
+
+	new_extent = suspend_get_extent();
+	if (!new_extent) {
+		printk("Error unable to append a new extent to the chain.\n");
+		return 2;
+	}
+
+	chain->allocs++;
+	chain->size+= (maximum - minimum + 1);
+	new_extent->minimum = minimum;
+	new_extent->maximum = maximum;
+	new_extent->next = NULL;
+
+	chain->last_touched = new_extent;
+
+	if (start_at) {
+		struct extent *next = start_at->next;
+		start_at->next = new_extent;
+		new_extent->next = next;
+		if (!next)
+			chain->last = new_extent;
+	} else {
+		if (chain->first) {
+			new_extent->next = chain->first;
+			chain->first = new_extent;
+		} else
+			chain->last = chain->first = new_extent;
+	}
+
+	return 0;
+}
+

--
Nigel Cunningham		nigel at suspend2 dot net

  parent reply	other threads:[~2006-06-26 16:56 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-06-26 16:54 [Suspend2][ 0/9] Extents support Nigel Cunningham
2006-06-26 16:54 ` [Suspend2][ 1/9] [Suspend2] Extents header Nigel Cunningham
2006-06-26 16:54 ` [Suspend2][ 2/9] [Suspend2] Extent allocation routines Nigel Cunningham
2006-06-26 16:54 ` [Suspend2][ 3/9] [Suspend2] Free a whole extent chain Nigel Cunningham
2006-06-26 16:54 ` Nigel Cunningham [this message]
2006-06-26 16:54 ` [Suspend2][ 5/9] [Suspend2] Serialise extent chains Nigel Cunningham
2006-06-26 16:54 ` [Suspend2][ 6/9] [Suspend2] Get next extent in an extent state Nigel Cunningham
2006-06-26 16:54 ` [Suspend2][ 7/9] [Suspend2] Extent state to the start Nigel Cunningham
2006-06-26 16:54 ` [Suspend2][ 8/9] [Suspend2] Extent state save and restore Nigel Cunningham
2006-06-26 16:54 ` [Suspend2][ 9/9] [Suspend2] Extent header Nigel Cunningham
2006-06-26 21:20 ` [Suspend2][ 0/9] Extents support Rafael J. Wysocki
2006-06-27  4:28   ` Nigel Cunningham
2006-06-27  5:36     ` Jens Axboe
2006-06-27  5:39       ` Nigel Cunningham
2006-06-27  7:05         ` Jens Axboe
2006-06-27  7:39           ` Nigel Cunningham
2006-06-27  7:59             ` Jens Axboe
2006-06-27  8:12               ` Greg KH
2006-06-27  8:22                 ` Jens Axboe
2006-06-27  8:58                 ` Nigel Cunningham
2006-06-28 21:11                   ` Pavel Machek
2006-06-28 22:25                     ` Nigel Cunningham
2006-06-28 22:44                       ` Pavel Machek
2006-06-28 23:14                         ` Nigel Cunningham
2006-06-30 17:36                           ` Pavel Machek
2006-06-29  3:11                       ` Martin J. Bligh
2006-06-27  9:07               ` Nigel Cunningham
2006-06-27  9:26                 ` Rafael J. Wysocki
2006-06-27  9:35                   ` Nigel Cunningham
2006-06-27 22:19                     ` Rafael J. Wysocki
2006-06-27 23:47                       ` Nigel Cunningham
2006-06-28 22:35                         ` Rafael J. Wysocki
2006-06-28 23:26                           ` Nigel Cunningham
2006-06-29 20:52                             ` Rafael J. Wysocki
2006-06-30 17:58                           ` Pavel Machek
2006-06-28 11:28             ` Rahul Karnik
2006-06-28 12:42               ` Nigel Cunningham
2006-06-28 14:42                 ` Pekka Enberg
2006-06-28 23:37                   ` Nigel Cunningham
2006-06-29  5:19                     ` Pekka Enberg
2006-06-29  5:44                       ` Nigel Cunningham
2006-06-29 21:11                         ` Rafael J. Wysocki
2006-06-30 17:55                     ` suspend2 merge [was Re: [Suspend2][ 0/9] Extents support.] Pavel Machek
2006-07-01  9:31                       ` Dumitru Ciobarcianu
2006-06-28 22:41                 ` [Suspend2][ 0/9] Extents support Rafael J. Wysocki
2006-06-28 14:37               ` Olivier Galibert
2006-06-28 21:05                 ` Pavel Machek
2006-06-27  7:06         ` Greg KH
2006-06-27  7:27           ` Nigel Cunningham
2006-06-27  7:53             ` Greg KH
2006-06-27  9:08               ` 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=20060626165417.11065.15610.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

Powered by JetHome