All of lore.kernel.org
 help / color / mirror / Atom feed
From: Len Brown <lenb@kernel.org>
To: linux-acpi@vger.kernel.org
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>, Len Brown <len.brown@intel.com>
Subject: [PATCH 10/94] Hibernate: Take overlapping zones into account (rev. 2)
Date: Fri, 09 Jan 2009 04:26:12 -0500	[thread overview]
Message-ID: <846705deb059c352cc0e5806d5964f815b8c6d98.1231492608.git.len.brown@intel.com> (raw)
In-Reply-To: <1231493256-11678-1-git-send-email-lenb@kernel.org>
In-Reply-To: <c5279dee26c0e8d7c4200993bfc4b540d2469598.1231492606.git.len.brown@intel.com>

From: Rafael J. Wysocki <rjw@sisk.pl>

It has been requested to make hibernation work with memory
hotplugging enabled and for this purpose the hibernation code has to
be reworked to take the possible overlapping of zones into account.
Thus, rework the hibernation memory bitmaps code to prevent
duplication of PFNs from occuring and add checks to make sure that
one page frame will not be marked as saveable many times.

Additionally, use list.h lists instead of open-coded lists to
implement the memory bitmaps.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Len Brown <len.brown@intel.com>
---
 kernel/power/snapshot.c |  325 ++++++++++++++++++++++++-----------------------
 1 files changed, 166 insertions(+), 159 deletions(-)

diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
index 955c8cc..ec9f153 100644
--- a/kernel/power/snapshot.c
+++ b/kernel/power/snapshot.c
@@ -25,6 +25,7 @@
 #include <linux/syscalls.h>
 #include <linux/console.h>
 #include <linux/highmem.h>
+#include <linux/list.h>
 
 #include <asm/uaccess.h>
 #include <asm/mmu_context.h>
@@ -192,12 +193,6 @@ static void *chain_alloc(struct chain_allocator *ca, unsigned int size)
 	return ret;
 }
 
-static void chain_free(struct chain_allocator *ca, int clear_page_nosave)
-{
-	free_list_of_pages(ca->chain, clear_page_nosave);
-	memset(ca, 0, sizeof(struct chain_allocator));
-}
-
 /**
  *	Data types related to memory bitmaps.
  *
@@ -233,7 +228,7 @@ static void chain_free(struct chain_allocator *ca, int clear_page_nosave)
 #define BM_BITS_PER_BLOCK	(PAGE_SIZE << 3)
 
 struct bm_block {
-	struct bm_block *next;		/* next element of the list */
+	struct list_head hook;	/* hook into a list of bitmap blocks */
 	unsigned long start_pfn;	/* pfn represented by the first bit */
 	unsigned long end_pfn;	/* pfn represented by the last bit plus 1 */
 	unsigned long *data;	/* bitmap representing pages */
@@ -244,24 +239,15 @@ static inline unsigned long bm_block_bits(struct bm_block *bb)
 	return bb->end_pfn - bb->start_pfn;
 }
 
-struct zone_bitmap {
-	struct zone_bitmap *next;	/* next element of the list */
-	unsigned long start_pfn;	/* minimal pfn in this zone */
-	unsigned long end_pfn;		/* maximal pfn in this zone plus 1 */
-	struct bm_block *bm_blocks;	/* list of bitmap blocks */
-	struct bm_block *cur_block;	/* recently used bitmap block */
-};
-
 /* strcut bm_position is used for browsing memory bitmaps */
 
 struct bm_position {
-	struct zone_bitmap *zone_bm;
 	struct bm_block *block;
 	int bit;
 };
 
 struct memory_bitmap {
-	struct zone_bitmap *zone_bm_list;	/* list of zone bitmaps */
+	struct list_head blocks;	/* list of bitmap blocks */
 	struct linked_page *p_list;	/* list of pages used to store zone
 					 * bitmap objects and bitmap block
 					 * objects
@@ -273,11 +259,7 @@ struct memory_bitmap {
 
 static void memory_bm_position_reset(struct memory_bitmap *bm)
 {
-	struct zone_bitmap *zone_bm;
-
-	zone_bm = bm->zone_bm_list;
-	bm->cur.zone_bm = zone_bm;
-	bm->cur.block = zone_bm->bm_blocks;
+	bm->cur.block = list_entry(bm->blocks.next, struct bm_block, hook);
 	bm->cur.bit = 0;
 }
 
@@ -285,151 +267,184 @@ static void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free);
 
 /**
  *	create_bm_block_list - create a list of block bitmap objects
+ *	@nr_blocks - number of blocks to allocate
+ *	@list - list to put the allocated blocks into
+ *	@ca - chain allocator to be used for allocating memory
  */
-
-static inline struct bm_block *
-create_bm_block_list(unsigned int nr_blocks, struct chain_allocator *ca)
+static int create_bm_block_list(unsigned long pages,
+				struct list_head *list,
+				struct chain_allocator *ca)
 {
-	struct bm_block *bblist = NULL;
+	unsigned int nr_blocks = DIV_ROUND_UP(pages, BM_BITS_PER_BLOCK);
 
 	while (nr_blocks-- > 0) {
 		struct bm_block *bb;
 
 		bb = chain_alloc(ca, sizeof(struct bm_block));
 		if (!bb)
-			return NULL;
-
-		bb->next = bblist;
-		bblist = bb;
+			return -ENOMEM;
+		list_add(&bb->hook, list);
 	}
-	return bblist;
+
+	return 0;
 }
 
+struct mem_extent {
+	struct list_head hook;
+	unsigned long start;
+	unsigned long end;
+};
+
 /**
- *	create_zone_bm_list - create a list of zone bitmap objects
+ *	free_mem_extents - free a list of memory extents
+ *	@list - list of extents to empty
  */
+static void free_mem_extents(struct list_head *list)
+{
+	struct mem_extent *ext, *aux;
+
+	list_for_each_entry_safe(ext, aux, list, hook) {
+		list_del(&ext->hook);
+		kfree(ext);
+	}
+}
 
-static inline struct zone_bitmap *
-create_zone_bm_list(unsigned int nr_zones, struct chain_allocator *ca)
+/**
+ *	create_mem_extents - create a list of memory extents representing
+ *	                     contiguous ranges of PFNs
+ *	@list - list to put the extents into
+ *	@gfp_mask - mask to use for memory allocations
+ */
+static int create_mem_extents(struct list_head *list, gfp_t gfp_mask)
 {
-	struct zone_bitmap *zbmlist = NULL;
+	struct zone *zone;
 
-	while (nr_zones-- > 0) {
-		struct zone_bitmap *zbm;
+	INIT_LIST_HEAD(list);
 
-		zbm = chain_alloc(ca, sizeof(struct zone_bitmap));
-		if (!zbm)
-			return NULL;
+	for_each_zone(zone) {
+		unsigned long zone_start, zone_end;
+		struct mem_extent *ext, *cur, *aux;
+
+		if (!populated_zone(zone))
+			continue;
+
+		zone_start = zone->zone_start_pfn;
+		zone_end = zone->zone_start_pfn + zone->spanned_pages;
 
-		zbm->next = zbmlist;
-		zbmlist = zbm;
+		list_for_each_entry(ext, list, hook)
+			if (zone_start <= ext->end)
+				break;
+
+		if (&ext->hook == list || zone_end < ext->start) {
+			/* New extent is necessary */
+			struct mem_extent *new_ext;
+
+			new_ext = kzalloc(sizeof(struct mem_extent), gfp_mask);
+			if (!new_ext) {
+				free_mem_extents(list);
+				return -ENOMEM;
+			}
+			new_ext->start = zone_start;
+			new_ext->end = zone_end;
+			list_add_tail(&new_ext->hook, &ext->hook);
+			continue;
+		}
+
+		/* Merge this zone's range of PFNs with the existing one */
+		if (zone_start < ext->start)
+			ext->start = zone_start;
+		if (zone_end > ext->end)
+			ext->end = zone_end;
+
+		/* More merging may be possible */
+		cur = ext;
+		list_for_each_entry_safe_continue(cur, aux, list, hook) {
+			if (zone_end < cur->start)
+				break;
+			if (zone_end < cur->end)
+				ext->end = cur->end;
+			list_del(&cur->hook);
+			kfree(cur);
+		}
 	}
-	return zbmlist;
+
+	return 0;
 }
 
 /**
   *	memory_bm_create - allocate memory for a memory bitmap
   */
-
 static int
 memory_bm_create(struct memory_bitmap *bm, gfp_t gfp_mask, int safe_needed)
 {
 	struct chain_allocator ca;
-	struct zone *zone;
-	struct zone_bitmap *zone_bm;
-	struct bm_block *bb;
-	unsigned int nr;
+	struct list_head mem_extents;
+	struct mem_extent *ext;
+	int error;
 
 	chain_init(&ca, gfp_mask, safe_needed);
+	INIT_LIST_HEAD(&bm->blocks);
 
-	/* Compute the number of zones */
-	nr = 0;
-	for_each_zone(zone)
-		if (populated_zone(zone))
-			nr++;
-
-	/* Allocate the list of zones bitmap objects */
-	zone_bm = create_zone_bm_list(nr, &ca);
-	bm->zone_bm_list = zone_bm;
-	if (!zone_bm) {
-		chain_free(&ca, PG_UNSAFE_CLEAR);
-		return -ENOMEM;
-	}
-
-	/* Initialize the zone bitmap objects */
-	for_each_zone(zone) {
-		unsigned long pfn;
+	error = create_mem_extents(&mem_extents, gfp_mask);
+	if (error)
+		return error;
 
-		if (!populated_zone(zone))
-			continue;
+	list_for_each_entry(ext, &mem_extents, hook) {
+		struct bm_block *bb;
+		unsigned long pfn = ext->start;
+		unsigned long pages = ext->end - ext->start;
 
-		zone_bm->start_pfn = zone->zone_start_pfn;
-		zone_bm->end_pfn = zone->zone_start_pfn + zone->spanned_pages;
-		/* Allocate the list of bitmap block objects */
-		nr = DIV_ROUND_UP(zone->spanned_pages, BM_BITS_PER_BLOCK);
-		bb = create_bm_block_list(nr, &ca);
-		zone_bm->bm_blocks = bb;
-		zone_bm->cur_block = bb;
-		if (!bb)
-			goto Free;
+		bb = list_entry(bm->blocks.prev, struct bm_block, hook);
 
-		nr = zone->spanned_pages;
-		pfn = zone->zone_start_pfn;
-		/* Initialize the bitmap block objects */
-		while (bb) {
-			unsigned long *ptr;
+		error = create_bm_block_list(pages, bm->blocks.prev, &ca);
+		if (error)
+			goto Error;
 
-			ptr = get_image_page(gfp_mask, safe_needed);
-			bb->data = ptr;
-			if (!ptr)
-				goto Free;
+		list_for_each_entry_continue(bb, &bm->blocks, hook) {
+			bb->data = get_image_page(gfp_mask, safe_needed);
+			if (!bb->data) {
+				error = -ENOMEM;
+				goto Error;
+			}
 
 			bb->start_pfn = pfn;
-			if (nr >= BM_BITS_PER_BLOCK) {
+			if (pages >= BM_BITS_PER_BLOCK) {
 				pfn += BM_BITS_PER_BLOCK;
-				nr -= BM_BITS_PER_BLOCK;
+				pages -= BM_BITS_PER_BLOCK;
 			} else {
 				/* This is executed only once in the loop */
-				pfn += nr;
+				pfn += pages;
 			}
 			bb->end_pfn = pfn;
-			bb = bb->next;
 		}
-		zone_bm = zone_bm->next;
 	}
+
 	bm->p_list = ca.chain;
 	memory_bm_position_reset(bm);
-	return 0;
+ Exit:
+	free_mem_extents(&mem_extents);
+	return error;
 
- Free:
+ Error:
 	bm->p_list = ca.chain;
 	memory_bm_free(bm, PG_UNSAFE_CLEAR);
-	return -ENOMEM;
+	goto Exit;
 }
 
 /**
   *	memory_bm_free - free memory occupied by the memory bitmap @bm
   */
-
 static void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free)
 {
-	struct zone_bitmap *zone_bm;
+	struct bm_block *bb;
 
-	/* Free the list of bit blocks for each zone_bitmap object */
-	zone_bm = bm->zone_bm_list;
-	while (zone_bm) {
-		struct bm_block *bb;
+	list_for_each_entry(bb, &bm->blocks, hook)
+		if (bb->data)
+			free_image_page(bb->data, clear_nosave_free);
 
-		bb = zone_bm->bm_blocks;
-		while (bb) {
-			if (bb->data)
-				free_image_page(bb->data, clear_nosave_free);
-			bb = bb->next;
-		}
-		zone_bm = zone_bm->next;
-	}
 	free_list_of_pages(bm->p_list, clear_nosave_free);
-	bm->zone_bm_list = NULL;
+
+	INIT_LIST_HEAD(&bm->blocks);
 }
 
 /**
@@ -437,38 +452,33 @@ static void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free)
  *	to given pfn.  The cur_zone_bm member of @bm and the cur_block member
  *	of @bm->cur_zone_bm are updated.
  */
-
 static int memory_bm_find_bit(struct memory_bitmap *bm, unsigned long pfn,
 				void **addr, unsigned int *bit_nr)
 {
-	struct zone_bitmap *zone_bm;
 	struct bm_block *bb;
 
-	/* Check if the pfn is from the current zone */
-	zone_bm = bm->cur.zone_bm;
-	if (pfn < zone_bm->start_pfn || pfn >= zone_bm->end_pfn) {
-		zone_bm = bm->zone_bm_list;
-		/* We don't assume that the zones are sorted by pfns */
-		while (pfn < zone_bm->start_pfn || pfn >= zone_bm->end_pfn) {
-			zone_bm = zone_bm->next;
-
-			if (!zone_bm)
-				return -EFAULT;
-		}
-		bm->cur.zone_bm = zone_bm;
-	}
-	/* Check if the pfn corresponds to the current bitmap block */
-	bb = zone_bm->cur_block;
+	/*
+	 * Check if the pfn corresponds to the current bitmap block and find
+	 * the block where it fits if this is not the case.
+	 */
+	bb = bm->cur.block;
 	if (pfn < bb->start_pfn)
-		bb = zone_bm->bm_blocks;
+		list_for_each_entry_continue_reverse(bb, &bm->blocks, hook)
+			if (pfn >= bb->start_pfn)
+				break;
 
-	while (pfn >= bb->end_pfn) {
-		bb = bb->next;
+	if (pfn >= bb->end_pfn)
+		list_for_each_entry_continue(bb, &bm->blocks, hook)
+			if (pfn >= bb->start_pfn && pfn < bb->end_pfn)
+				break;
 
-		BUG_ON(!bb);
-	}
-	zone_bm->cur_block = bb;
+	if (&bb->hook == &bm->blocks)
+		return -EFAULT;
+
+	/* The block has been found */
+	bm->cur.block = bb;
 	pfn -= bb->start_pfn;
+	bm->cur.bit = pfn + 1;
 	*bit_nr = pfn;
 	*addr = bb->data;
 	return 0;
@@ -538,29 +548,21 @@ static bool memory_bm_pfn_present(struct memory_bitmap *bm, unsigned long pfn)
 
 static unsigned long memory_bm_next_pfn(struct memory_bitmap *bm)
 {
-	struct zone_bitmap *zone_bm;
 	struct bm_block *bb;
 	int bit;
 
+	bb = bm->cur.block;
 	do {
-		bb = bm->cur.block;
-		do {
-			bit = bm->cur.bit;
-			bit = find_next_bit(bb->data, bm_block_bits(bb), bit);
-			if (bit < bm_block_bits(bb))
-				goto Return_pfn;
-
-			bb = bb->next;
-			bm->cur.block = bb;
-			bm->cur.bit = 0;
-		} while (bb);
-		zone_bm = bm->cur.zone_bm->next;
-		if (zone_bm) {
-			bm->cur.zone_bm = zone_bm;
-			bm->cur.block = zone_bm->bm_blocks;
-			bm->cur.bit = 0;
-		}
-	} while (zone_bm);
+		bit = bm->cur.bit;
+		bit = find_next_bit(bb->data, bm_block_bits(bb), bit);
+		if (bit < bm_block_bits(bb))
+			goto Return_pfn;
+
+		bb = list_entry(bb->hook.next, struct bm_block, hook);
+		bm->cur.block = bb;
+		bm->cur.bit = 0;
+	} while (&bb->hook != &bm->blocks);
+
 	memory_bm_position_reset(bm);
 	return BM_END_OF_MAP;
 
@@ -816,8 +818,7 @@ static unsigned int count_free_highmem_pages(void)
  *	We should save the page if it isn't Nosave or NosaveFree, or Reserved,
  *	and it isn't a part of a free chunk of pages.
  */
-
-static struct page *saveable_highmem_page(unsigned long pfn)
+static struct page *saveable_highmem_page(struct zone *zone, unsigned long pfn)
 {
 	struct page *page;
 
@@ -825,6 +826,8 @@ static struct page *saveable_highmem_page(unsigned long pfn)
 		return NULL;
 
 	page = pfn_to_page(pfn);
+	if (page_zone(page) != zone)
+		return NULL;
 
 	BUG_ON(!PageHighMem(page));
 
@@ -854,13 +857,16 @@ unsigned int count_highmem_pages(void)
 		mark_free_pages(zone);
 		max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages;
 		for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++)
-			if (saveable_highmem_page(pfn))
+			if (saveable_highmem_page(zone, pfn))
 				n++;
 	}
 	return n;
 }
 #else
-static inline void *saveable_highmem_page(unsigned long pfn) { return NULL; }
+static inline void *saveable_highmem_page(struct zone *z, unsigned long p)
+{
+	return NULL;
+}
 #endif /* CONFIG_HIGHMEM */
 
 /**
@@ -871,8 +877,7 @@ static inline void *saveable_highmem_page(unsigned long pfn) { return NULL; }
  *	of pages statically defined as 'unsaveable', and it isn't a part of
  *	a free chunk of pages.
  */
-
-static struct page *saveable_page(unsigned long pfn)
+static struct page *saveable_page(struct zone *zone, unsigned long pfn)
 {
 	struct page *page;
 
@@ -880,6 +885,8 @@ static struct page *saveable_page(unsigned long pfn)
 		return NULL;
 
 	page = pfn_to_page(pfn);
+	if (page_zone(page) != zone)
+		return NULL;
 
 	BUG_ON(PageHighMem(page));
 
@@ -911,7 +918,7 @@ unsigned int count_data_pages(void)
 		mark_free_pages(zone);
 		max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages;
 		for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++)
-			if(saveable_page(pfn))
+			if (saveable_page(zone, pfn))
 				n++;
 	}
 	return n;
@@ -952,7 +959,7 @@ static inline struct page *
 page_is_saveable(struct zone *zone, unsigned long pfn)
 {
 	return is_highmem(zone) ?
-			saveable_highmem_page(pfn) : saveable_page(pfn);
+		saveable_highmem_page(zone, pfn) : saveable_page(zone, pfn);
 }
 
 static void copy_data_page(unsigned long dst_pfn, unsigned long src_pfn)
@@ -983,7 +990,7 @@ static void copy_data_page(unsigned long dst_pfn, unsigned long src_pfn)
 	}
 }
 #else
-#define page_is_saveable(zone, pfn)	saveable_page(pfn)
+#define page_is_saveable(zone, pfn)	saveable_page(zone, pfn)
 
 static inline void copy_data_page(unsigned long dst_pfn, unsigned long src_pfn)
 {
-- 
1.5.6.6


  parent reply	other threads:[~2009-01-09  9:28 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-09  9:26 ACPI & Suspend related patches for 2.6.29 Len Brown
2009-01-09  9:26 ` [PATCH 01/94] ACPI: EC: Add some basic check for ECDT data Len Brown
2009-01-09  9:26   ` [PATCH 02/94] ACPI: EC: fix compilation warning Len Brown
2009-01-09  9:26   ` [PATCH 03/94] /proc/acpi/alarm: handle day-of-month wraparound on readback Len Brown
2009-01-09  9:26   ` [PATCH 04/94] ACPI: video: Fix reversed brightness behavior on ThinkPad SL series Len Brown
2009-01-09  9:26   ` [PATCH 05/94] Hibernate: Call platform_begin before swsusp_shrink_memory Len Brown
2009-01-09  9:26   ` [PATCH 06/94] ACPI hibernate: Add a mechanism to save/restore ACPI NVS memory Len Brown
2009-01-09  9:26   ` [PATCH 07/94] x86 hibernate: Mark ACPI NVS memory region at startup Len Brown
2009-01-09  9:26   ` [PATCH 08/94] ACPI hibernate: Introduce new kernel parameter acpi_sleep=s4_nonvs Len Brown
2009-01-09  9:26   ` [PATCH 09/94] Hibernate: Do not oops on resume if image data are incorrect Len Brown
2009-01-09  9:26   ` Len Brown [this message]
2009-01-09  9:26   ` [PATCH 11/94] Hibernate: Replace unnecessary evaluation of pfn_to_page() Len Brown
2009-01-09  9:26   ` [PATCH 12/94] drivers/misc/Makefile, Kconfig: cleanup Len Brown
2009-01-09  9:26   ` [PATCH 13/94] create drivers/platform/x86/ from drivers/misc/ Len Brown
2009-01-09  9:26   ` [PATCH 14/94] ACPI: move wmi, asus_acpi, toshiba_acpi to drivers/platform/x86 Len Brown
2009-01-09  9:26   ` [PATCH 15/94] doc: fix kernel-parameters.txt formatting Len Brown
2009-01-09  9:26   ` [PATCH 16/94] Newly inserted battery might differ from one just removed, so Len Brown
2009-01-09  9:26   ` [PATCH 17/94] ACPI: disable MPS when NO APIC-table found Len Brown
2009-01-09  9:26   ` [PATCH 18/94] eeepc-laptop: use select and not depends on Len Brown
2009-01-09  9:26   ` [PATCH 19/94] ACPICA: Fix several warnings under gcc 4 compiler Len Brown
2009-01-09  9:26   ` [PATCH 20/94] ACPICA: Update FACS waking vector interfaces Len Brown
2009-01-09  9:26   ` [PATCH 21/94] ACPICA: Fix possible memory leak on error in parser Len Brown
2009-01-09  9:26   ` [PATCH 22/94] ACPICA: Optimize execution of AML While loops Len Brown
2009-01-09  9:26   ` [PATCH 23/94] ACPICA: Add a mechanism to escape infinite AML While() loops Len Brown
2009-01-09  9:26   ` [PATCH 24/94] ACPICA: Update debug output for IndexField I/O Len Brown
2009-01-09  9:26   ` [PATCH 25/94] ACPICA: Fix namestring for the SystemCMOS address space Len Brown
2009-01-09  9:26   ` [PATCH 26/94] ACPICA: Emit warning if two FACS or DSDT tables found in the FADT Len Brown
2009-01-09  9:26   ` [PATCH 27/94] ACPICA: Add global pointer for FACS table to simplify FACS access Len Brown
2009-01-09  9:26   ` [PATCH 28/94] ACPICA: Reformat comments, no functional changes Len Brown
2009-01-09  9:26   ` [PATCH 29/94] ACPICA: Add support to externally execute _OSI method Len Brown
2009-01-09  9:26   ` [PATCH 30/94] ACPICA: Remove references to obsolete ACPI_DUMP_APP Len Brown
2009-01-09  9:26   ` [PATCH 31/94] ACPICA: Fix to allow aliases within ASL namepaths Len Brown
2009-01-09  9:26   ` [PATCH 32/94] ACPICA: Allow multiple backslash prefix in namepaths Len Brown
2009-01-09  9:26   ` [PATCH 33/94] ACPICA: Add Buffer->String conversion for predefined methods Len Brown
2009-01-09  9:26   ` [PATCH 34/94] ACPICA: Consolidate method arg count validation code Len Brown
2009-01-09  9:26   ` [PATCH 35/94] ACPICA: Enhance implicit return mechanism Len Brown
2009-01-09  9:26   ` [PATCH 36/94] ACPICA: Update version to 20081031 Len Brown
2009-01-09  9:26   ` [PATCH 37/94] cpuidle: Add decaying history logic to menu idle predictor Len Brown
2009-01-09  9:26   ` [PATCH 38/94] ACPI: Do not modify SCI_EN directly Len Brown
2009-01-09  9:26   ` [PATCH 39/94] ACPI: PCI: use conventional PCI address format Len Brown
2009-01-09  9:26   ` [PATCH 40/94] ACPI: PCI: remove unnecessary null pointer checks Len Brown
2009-01-09  9:26   ` [PATCH 41/94] ACPI: PCI: simplify buffer management for evaluating _PRT Len Brown
2009-01-09  9:26   ` [PATCH 42/94] ACPI: PCI: ignore _PRT function information Len Brown
2009-01-09  9:26   ` [PATCH 43/94] ACPI: PCI: fix GSI/IRQ naming confusion Len Brown
2009-01-09  9:26   ` [PATCH 44/94] ACPI: PCI: move struct acpi_prt_entry declaration out of public header file Len Brown
2009-01-09  9:26   ` [PATCH 45/94] ACPI: PCI: add a helper to convert _PRT INTx pin number to name Len Brown
2009-01-09  9:26   ` [PATCH 46/94] ACPI: PCI: always use the PCI INTx pin values, not the _PRT ones Len Brown
2009-01-09  9:26   ` [PATCH 47/94] ACPI: PCI: use 1-based encoding for _PRT quirks Len Brown
2009-01-09  9:26   ` [PATCH 48/94] ACPI: PCI: lookup _PRT entry by PCI dev and pin, not segment/bus/dev/pin Len Brown
2009-01-09  9:26   ` [PATCH 49/94] ACPI: PCI: tweak _PRT lookup debug Len Brown
2009-01-09  9:26   ` [PATCH 50/94] ACPI: PCI: remove callback from acpi_pci_irq_lookup & acpi_pci_irq_derive Len Brown
2009-01-09  9:26   ` [PATCH 51/94] ACPI: PCI: use positive logic to simplify code Len Brown
2009-01-09  9:26   ` [PATCH 52/94] ACPI: PCI: follow typical PCI INTx swizzling pattern Len Brown
2009-01-09  9:26   ` [PATCH 53/94] ACPI: PCI: combine lookup and derive Len Brown
2009-01-09  9:26   ` [PATCH 54/94] ACPI: PCI: simplify list of _PRT entries Len Brown
2009-01-09  9:26   ` [PATCH 55/94] ACPI: PCI: simplify struct acpi_prt_entry Len Brown
2009-01-09  9:26   ` [PATCH 56/94] ACPI: PCI: expand acpi_pci_allocate_irq() and acpi_pci_free_irq() inline Len Brown
2009-01-09  9:26   ` [PATCH 57/94] ACPI: PCI: whitespace and useless initialization cleanup Len Brown
2009-01-09  9:27   ` [PATCH 58/94] ACPI: PCI: add HP copyright Len Brown
2009-01-09  9:27   ` [PATCH 59/94] ACPI: simplify buffer management for acpi_pci_bind() etc Len Brown
2009-01-09  9:27   ` [PATCH 60/94] ACPI: ec.c, pci_link.c, video_detec.c: static Len Brown
2009-01-09  9:27   ` [PATCH 61/94] video: always update the brightness when poking "brightness" Len Brown
2009-01-09  9:27   ` [PATCH 62/94] ACPI: osl.c: replace return_ACPI_STATUS with return Len Brown
2009-01-09  9:27   ` [PATCH 63/94] ACPI: ec.c: call acpi_get_name to get node name Len Brown
2009-01-09  9:27   ` [PATCH 64/94] ACPI: proc.c: remove ACPI_FUNCTION_TRACE Len Brown
2009-01-09  9:27   ` [PATCH 65/94] ACPI: wakeup.c: " Len Brown
2009-01-09  9:27   ` [PATCH 66/94] ACPICA: New: acpi_get_gpe_device interface Len Brown
2009-01-09  9:27   ` [PATCH 67/94] ACPICA: New: Public GPE group enable/disable interfaces Len Brown
2009-01-09  9:27   ` [PATCH 68/94] ACPI: main.c: use new public " Len Brown
2009-01-09  9:27   ` [PATCH 69/94] ACPI: sony-laptop.c: call acpi_get_object_info to get node info Len Brown
2009-01-09  9:27   ` [PATCH 70/94] ACPI: power.c: call acpi_get_name to get node name Len Brown
2009-01-09  9:27   ` [PATCH 71/94] ACPI: panasonic-laptop.c: remove ACPI_FUNCTION_TRACE Len Brown
2009-01-09  9:27   ` [PATCH 72/94] ACPI: io_acpi_init.c: call acpi_get_name to get node fullname Len Brown
2009-01-09  9:27   ` [PATCH 73/94] ACPI: io_common.c: call acpi_get_table to avoid using ACPI_SIG_DSDT Len Brown
2009-01-09  9:27   ` [PATCH 74/94] ACPICA: New: acpi_read and acpi_write public interfaces Len Brown
2009-01-09  9:27   ` [PATCH 75/94] ACPICA: Move all public H/W interfaces to new hwxface Len Brown
2009-01-09  9:27   ` [PATCH 76/94] ACPICA: New: acpi_reset interface - write to reset register Len Brown
2009-01-09  9:27   ` [PATCH 77/94] ACPI: reboot.c: use new acpi_reset interface Len Brown
2009-01-09  9:27   ` [PATCH 78/94] ACPI: remove private acpica headers from driver files Len Brown
2009-01-09  9:27   ` [PATCH 80/94] ACPICA: Fixes for various ACPI data tables Len Brown
2009-01-09  9:27   ` [PATCH 81/94] ACPICA: Add ACPI_MUTEX_TYPE configuration option Len Brown
2009-01-09  9:27   ` [PATCH 82/94] ACPICA: FADT parsing changes and fixes Len Brown
2009-01-09  9:27   ` [PATCH 83/94] ACPICA: FADT: set acpi_gbl_use_default_register_widths to TRUE by default Len Brown
2009-01-09  9:27   ` [PATCH 84/94] ACPICA: FADT: Update error msgs for consistency Len Brown
2009-01-09  9:27   ` [PATCH 85/94] ACPICA: Update version to 20081204 Len Brown
2009-01-09  9:27   ` [PATCH 86/94] ACPICA: delete acdisasm.h Len Brown
2009-01-09  9:27   ` [PATCH 87/94] ACPICA: delete utcache.c Len Brown
2009-01-09  9:27   ` [PATCH 88/94] fujitsu-laptop: Add BL power, LED control and radio state information Len Brown
2009-01-09  9:27   ` [PATCH 89/94] fujitsu-laptop: Simplify SBLL/SBL2 backlight handling Len Brown
2009-01-09  9:27   ` [PATCH 90/94] ACPI: Avoid array address overflow when _CST MWAIT hint bits are set Len Brown
2009-01-09  9:27   ` [PATCH 91/94] ACPI : Use RSDT instead of XSDT by adding boot option of "acpi=rsdt" Len Brown
2009-01-09  9:27   ` [PATCH 92/94] ACPI: fix build warning Len Brown
2009-01-09  9:27   ` [PATCH 93/94] ACPICA: create acpica/ directory Len Brown
2009-01-09  9:27   ` [PATCH 94/94] ACPICA: hide private headers Len Brown
2009-01-09 12:06 ` ACPI & Suspend related patches for 2.6.29 Rafael J. Wysocki
2009-01-09 20:04   ` Len Brown

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=846705deb059c352cc0e5806d5964f815b8c6d98.1231492608.git.len.brown@intel.com \
    --to=lenb@kernel.org \
    --cc=len.brown@intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=rjw@sisk.pl \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.