Accepting request 602492 from Kernel:kdump
OBS-URL: https://build.opensuse.org/request/show/602492 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/makedumpfile?expand=0&rev=69
This commit is contained in:
123
makedumpfile-check-PG_swapbacked.patch
Normal file
123
makedumpfile-check-PG_swapbacked.patch
Normal file
@@ -0,0 +1,123 @@
|
||||
From: Petr Tesarik <ptesarik@suse.com>
|
||||
Date: Fri, 13 Apr 2018 17:35:55 +0200
|
||||
Subject: Check PG_swapbacked for swap cache pages
|
||||
References: bsc#1088354
|
||||
Upstream: posted 2018-04-13
|
||||
|
||||
When page cache is filtered out (dump level bitmap includes 2 or 4),
|
||||
makedumpfile checks the PG_swapcache bit, but since kernel commit
|
||||
6326fec1122cde256bd2a8c63f2606e08e44ce1d (v4.10-rc1~7) this bit is
|
||||
an alias for PG_owner_priv_1, which is also used by filesystem
|
||||
code (PG_checked) and Xen (PG_pinned and PG_foreign).
|
||||
|
||||
With these kernels, the PG_swapcache flag is valid only if
|
||||
PG_swapbacked is set. A Linux kernel patch has already been
|
||||
submitted to export the value of PG_swapbacked in VMCOREINFO.
|
||||
|
||||
Since there are released kernels in the wild which do not export the
|
||||
value, a fallback is implemented. I considered these three situations:
|
||||
|
||||
1. Kernels before v2.6.28-rc1~244:
|
||||
PG_swapbacked does not exist, so it must not be checked.
|
||||
Instead, check PG_swapcache, which is never overloaded for
|
||||
another purpose.
|
||||
|
||||
2. Kernels between v2.6.28-rc1~244 and v4.10-rc1~7:
|
||||
It is sufficient to check only PG_swapcache, but PG_swapbacked
|
||||
may also be checked (it is always set if PG_swapcache is set).
|
||||
|
||||
3. Kernels since v4.10-rc1~7:
|
||||
PG_swapbacked must be checked.
|
||||
|
||||
If PG_swapbacked value is known (exported or read from debuginfo),
|
||||
it is always safe to use it (case 2 or 3). If PG_swapbacked is not
|
||||
known, it is safe to ignore it for cases 1 and 2, but not 3.
|
||||
Thankfully, the new value of PG_swapcache (since v4.10-rc1~7) is
|
||||
less than PG_private (which is known), whereas the old value had
|
||||
always been greater than PG_private. Moreover, the flags between
|
||||
PG_private and PG_swapbacked haven't changed since v4.10-rc1~7, so
|
||||
PG_swapbacked can fall back to PG_private + 6 if unknown.
|
||||
|
||||
Without this patch, all Xen dumps are unusable, because PG_pinned is
|
||||
set for all page table pages.
|
||||
|
||||
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
---
|
||||
makedumpfile.c | 19 ++++++++++++++++++-
|
||||
makedumpfile.h | 2 ++
|
||||
2 files changed, 20 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/makedumpfile.c
|
||||
+++ b/makedumpfile.c
|
||||
@@ -252,7 +252,18 @@ isHugetlb(int dtor)
|
||||
static int
|
||||
is_cache_page(unsigned long flags)
|
||||
{
|
||||
- return isLRU(flags) || isSwapCache(flags);
|
||||
+ if (isLRU(flags))
|
||||
+ return TRUE;
|
||||
+
|
||||
+ /* PG_swapcache is valid only if:
|
||||
+ * a. PG_swapbacked bit is set, or
|
||||
+ * b. PG_swapbacked did not exist (kernels before 4.10-rc1).
|
||||
+ */
|
||||
+ if ((NUMBER(PG_swapbacked) == NOT_FOUND_NUMBER || isSwapBacked(flags))
|
||||
+ && isSwapCache(flags))
|
||||
+ return TRUE;
|
||||
+
|
||||
+ return FALSE;
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
@@ -1735,6 +1746,7 @@ get_structure_info(void)
|
||||
ENUM_NUMBER_INIT(PG_lru, "PG_lru");
|
||||
ENUM_NUMBER_INIT(PG_private, "PG_private");
|
||||
ENUM_NUMBER_INIT(PG_swapcache, "PG_swapcache");
|
||||
+ ENUM_NUMBER_INIT(PG_swapbacked, "PG_swapbacked");
|
||||
ENUM_NUMBER_INIT(PG_buddy, "PG_buddy");
|
||||
ENUM_NUMBER_INIT(PG_slab, "PG_slab");
|
||||
ENUM_NUMBER_INIT(PG_hwpoison, "PG_hwpoison");
|
||||
@@ -1988,6 +2000,9 @@ 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_swapbacked) == NOT_FOUND_NUMBER
|
||||
+ && NUMBER(PG_swapcache) < NUMBER(PG_private))
|
||||
+ NUMBER(PG_swapbacked) = NUMBER(PG_private) + 6;
|
||||
if (NUMBER(PG_slab) == NOT_FOUND_NUMBER)
|
||||
NUMBER(PG_slab) = PG_slab_ORIGINAL;
|
||||
if (NUMBER(PG_head_mask) == NOT_FOUND_NUMBER)
|
||||
@@ -2264,6 +2279,7 @@ write_vmcoreinfo_data(void)
|
||||
WRITE_NUMBER("PG_private", PG_private);
|
||||
WRITE_NUMBER("PG_head_mask", PG_head_mask);
|
||||
WRITE_NUMBER("PG_swapcache", PG_swapcache);
|
||||
+ WRITE_NUMBER("PG_swapbacked", PG_swapbacked);
|
||||
WRITE_NUMBER("PG_buddy", PG_buddy);
|
||||
WRITE_NUMBER("PG_slab", PG_slab);
|
||||
WRITE_NUMBER("PG_hwpoison", PG_hwpoison);
|
||||
@@ -2658,6 +2674,7 @@ read_vmcoreinfo(void)
|
||||
READ_NUMBER("PG_private", PG_private);
|
||||
READ_NUMBER("PG_head_mask", PG_head_mask);
|
||||
READ_NUMBER("PG_swapcache", PG_swapcache);
|
||||
+ READ_NUMBER("PG_swapbacked", PG_swapbacked);
|
||||
READ_NUMBER("PG_slab", PG_slab);
|
||||
READ_NUMBER("PG_buddy", PG_buddy);
|
||||
READ_NUMBER("PG_hwpoison", PG_hwpoison);
|
||||
--- a/makedumpfile.h
|
||||
+++ b/makedumpfile.h
|
||||
@@ -155,6 +155,7 @@ test_bit(int nr, unsigned long addr)
|
||||
#define isPrivate(flags) test_bit(NUMBER(PG_private), flags)
|
||||
#define isCompoundHead(flags) (!!((flags) & NUMBER(PG_head_mask)))
|
||||
#define isSwapCache(flags) test_bit(NUMBER(PG_swapcache), flags)
|
||||
+#define isSwapBacked(flags) test_bit(NUMBER(PG_swapbacked), flags)
|
||||
#define isHWPOISON(flags) (test_bit(NUMBER(PG_hwpoison), flags) \
|
||||
&& (NUMBER(PG_hwpoison) != NOT_FOUND_NUMBER))
|
||||
|
||||
@@ -1869,6 +1870,7 @@ struct number_table {
|
||||
long PG_head;
|
||||
long PG_head_mask;
|
||||
long PG_swapcache;
|
||||
+ long PG_swapbacked;
|
||||
long PG_buddy;
|
||||
long PG_slab;
|
||||
long PG_hwpoison;
|
47
makedumpfile-is_cache_page-helper.patch
Normal file
47
makedumpfile-is_cache_page-helper.patch
Normal file
@@ -0,0 +1,47 @@
|
||||
From: Petr Tesarik <ptesarik@suse.com>
|
||||
Date: Fri, 13 Apr 2018 15:58:45 +0200
|
||||
Subject: Add is_cache_page() helper to check if a page belongs to the cache
|
||||
References: bsc#1088354
|
||||
Upstream: posted 2018-04-13
|
||||
|
||||
No functional change, but clarify the purpose of checking isLRU()
|
||||
and SwapCache(), and move the check to a single place.
|
||||
|
||||
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
---
|
||||
makedumpfile.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/makedumpfile.c
|
||||
+++ b/makedumpfile.c
|
||||
@@ -249,6 +249,12 @@ isHugetlb(int dtor)
|
||||
&& (SYMBOL(free_huge_page) == dtor));
|
||||
}
|
||||
|
||||
+static int
|
||||
+is_cache_page(unsigned long flags)
|
||||
+{
|
||||
+ return isLRU(flags) || isSwapCache(flags);
|
||||
+}
|
||||
+
|
||||
static inline unsigned long
|
||||
calculate_len_buf_out(long page_size)
|
||||
{
|
||||
@@ -5850,7 +5856,7 @@ __exclude_unnecessary_pages(unsigned lon
|
||||
* Exclude the non-private cache page.
|
||||
*/
|
||||
else if ((info->dump_level & DL_EXCLUDE_CACHE)
|
||||
- && (isLRU(flags) || isSwapCache(flags))
|
||||
+ && is_cache_page(flags)
|
||||
&& !isPrivate(flags) && !isAnon(mapping)) {
|
||||
pfn_counter = &pfn_cache;
|
||||
}
|
||||
@@ -5858,7 +5864,7 @@ __exclude_unnecessary_pages(unsigned lon
|
||||
* Exclude the cache page whether private or non-private.
|
||||
*/
|
||||
else if ((info->dump_level & DL_EXCLUDE_CACHE_PRI)
|
||||
- && (isLRU(flags) || isSwapCache(flags))
|
||||
+ && is_cache_page(flags)
|
||||
&& !isAnon(mapping)) {
|
||||
if (isPrivate(flags))
|
||||
pfn_counter = &pfn_cache_private;
|
@@ -1,3 +1,11 @@
|
||||
-------------------------------------------------------------------
|
||||
Mon Apr 30 09:39:40 UTC 2018 - ptesarik@suse.com
|
||||
|
||||
- makedumpfile-is_cache_page-helper.patch: Add is_cache_page()
|
||||
helper to check if a page belongs to the cache (bsc#1088354).
|
||||
- makedumpfile-check-PG_swapbacked.patch: Check PG_swapbacked for
|
||||
swap cache pages (bsc#1088354).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Apr 9 09:53:05 UTC 2018 - ptesarik@suse.com
|
||||
|
||||
|
@@ -42,6 +42,8 @@ Patch1: %{name}-override-libtinfo.patch
|
||||
Patch2: %{name}-always-use-bigger-SECTION_MAP_MASK.patch
|
||||
Patch3: %{name}-sadump-fix-PTI-enabled-kernels.patch
|
||||
Patch4: %{name}-do-not-print-ETA-if-progress-is-0.patch
|
||||
Patch5: %{name}-is_cache_page-helper.patch
|
||||
Patch6: %{name}-check-PG_swapbacked.patch
|
||||
BuildRequires: libdw-devel
|
||||
BuildRequires: libebl-devel
|
||||
BuildRequires: libelf-devel
|
||||
@@ -74,6 +76,8 @@ via gdb or crash utility.
|
||||
%patch2 -p1
|
||||
%patch3 -p1
|
||||
%patch4 -p1
|
||||
%patch5 -p1
|
||||
%patch6 -p1
|
||||
|
||||
%build
|
||||
%if %{have_snappy}
|
||||
|
Reference in New Issue
Block a user