[PATCH 05/10] Add hardcoded page flag values

HATAYAMA Daisuke d.hatayama at jp.fujitsu.com
Thu Nov 8 04:48:34 EST 2012


Basically, these should be exported as VMCOREINFO from kernel. But we
cannot modify old kernels. Luckily, page flag values had frequently
changed in old kernels, so on old kernels, it's relatively easy to
determine appropreate page flags on a given kernel version without any
symbol and type information.

Specifically:

- PG_slab has had the same value 7 since v2.6.15, and

- PG_buddy had been defined as macro value from v2.6.17 to v2.6.26

On later kernel version, enum pageflags type was introduced and at the
version, PG_buddy's value depends on CONFIG_PAGEFLAGS_EXTEND; luckily,
this can be determined by looking at error_states array, for example,
without any debugging information but I don't implement it in this
patch because it's better to check if enum pageflags is present to
simplify design.

Signed-off-by: HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com>
---

 makedumpfile.c |    6 ++++++
 makedumpfile.h |    3 +++
 2 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index 0d03716..cb64902 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -1210,6 +1210,12 @@ get_value_for_old_linux(void)
 		NUMBER(PG_private) = PG_private_ORIGINAL;
 	if (NUMBER(PG_swapcache) == NOT_FOUND_NUMBER)
 		NUMBER(PG_swapcache) = PG_swapcache_ORIGINAL;
+	if (NUMBER(PG_slab) == NOT_FOUND_NUMBER)
+		NUMBER(PG_slab) = PG_slab_ORIGINAL;
+	if (NUMBER(PG_buddy) == NOT_FOUND_NUMBER
+	    && info->kernel_version >= KERNEL_VERSION(2, 6, 17)
+	    && info->kernel_version <= KERNEL_VERSION(2, 6, 26))
+		NUMBER(PG_buddy) = PG_buddy_v2_6_17_to_v2_6_26;
 	return TRUE;
 }
 
diff --git a/makedumpfile.h b/makedumpfile.h
index 1304df0..fecb003 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -71,9 +71,12 @@ int get_mem_type(void);
  * The following values are for linux-2.6.25 or former.
  */
 #define PG_lru_ORIGINAL	 	(5)
+#define PG_slab_ORIGINAL	(7)
 #define PG_private_ORIGINAL	(11)	/* Has something at ->private */
 #define PG_swapcache_ORIGINAL	(15)	/* Swap page: swp_entry_t in private */
 
+#define PG_buddy_v2_6_17_to_v2_6_26	(19)
+
 #define PAGE_MAPPING_ANON	(1)
 
 #define LSEEKED_BITMAP	(1)




More information about the kexec mailing list