Blame SOURCES/0011-Fix-for-kmem-s-S-and-bt-F-F-on-Linux-5.17-rc1.patch

e039e7
From 86446eaba408807e00cf2310d5748aa6b7511284 Mon Sep 17 00:00:00 2001
e039e7
From: Kazuhito Hagio <k-hagio-ab@nec.com>
e039e7
Date: Wed, 2 Feb 2022 02:14:56 +0000
e039e7
Subject: [PATCH 11/11] Fix for "kmem -s|-S" and "bt -F[F]" on Linux 5.17-rc1
e039e7
e039e7
Since the following kernel commits split slab info from struct page
e039e7
into struct slab, crash cannot get several slab related offsets from
e039e7
struct page.
e039e7
e039e7
  d122019bf061 ("mm: Split slab into its own type")
e039e7
  07f910f9b729 ("mm: Remove slab from struct page")
e039e7
e039e7
Without the patch, "kmem -s|-S" and "bt -F[F]" options cannot work
e039e7
correctly with the following errors:
e039e7
e039e7
  crash> kmem -s kmem_cache
e039e7
  CACHE             OBJSIZE  ALLOCATED     TOTAL  SLABS  SSIZE  NAME
e039e7
  kmem: page_to_nid: invalid page: ffff9454afc35020
e039e7
  kmem: kmem_cache: cannot gather relevant slab data
e039e7
  ffff945140042000      216          ?         ?      ?     8k  kmem_cache
e039e7
e039e7
  crash> bt -F
e039e7
  ...
e039e7
  bt: invalid structure member offset: page_slab
e039e7
      FILE: memory.c  LINE: 9477  FUNCTION: vaddr_to_kmem_cache()
e039e7
e039e7
Signed-by: Kazuhito Hagio <k-hagio-ab@nec.com>
e039e7
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
e039e7
---
e039e7
 memory.c | 13 +++++++++++++
e039e7
 1 file changed, 13 insertions(+)
e039e7
e039e7
diff --git a/memory.c b/memory.c
e039e7
index e80c59ea4534..8448ddc3a16c 100644
e039e7
--- a/memory.c
e039e7
+++ b/memory.c
e039e7
@@ -421,6 +421,8 @@ vm_init(void)
e039e7
 		MEMBER_OFFSET_INIT(page_prev, "page", "prev");
e039e7
 	if (INVALID_MEMBER(page_next))
e039e7
 		ANON_MEMBER_OFFSET_INIT(page_next, "page", "next");
e039e7
+	if (INVALID_MEMBER(page_next))
e039e7
+		MEMBER_OFFSET_INIT(page_next, "slab", "next");
e039e7
 
e039e7
 	MEMBER_OFFSET_INIT(page_list, "page", "list");
e039e7
 	if (VALID_MEMBER(page_list)) {
e039e7
@@ -747,11 +749,15 @@ vm_init(void)
e039e7
 		MEMBER_OFFSET_INIT(kmem_cache_random, "kmem_cache", "random");
e039e7
 		MEMBER_OFFSET_INIT(kmem_cache_cpu_freelist, "kmem_cache_cpu", "freelist");
e039e7
 		MEMBER_OFFSET_INIT(kmem_cache_cpu_page, "kmem_cache_cpu", "page");
e039e7
+		if (INVALID_MEMBER(kmem_cache_cpu_page))
e039e7
+			MEMBER_OFFSET_INIT(kmem_cache_cpu_page, "kmem_cache_cpu", "slab");
e039e7
 		MEMBER_OFFSET_INIT(kmem_cache_cpu_node, "kmem_cache_cpu", "node");
e039e7
 		MEMBER_OFFSET_INIT(kmem_cache_cpu_partial, "kmem_cache_cpu", "partial");
e039e7
 		MEMBER_OFFSET_INIT(page_inuse, "page", "inuse");
e039e7
 		if (INVALID_MEMBER(page_inuse))
e039e7
 			ANON_MEMBER_OFFSET_INIT(page_inuse, "page", "inuse");
e039e7
+		if (INVALID_MEMBER(page_inuse))
e039e7
+			MEMBER_OFFSET_INIT(page_inuse, "slab", "inuse");
e039e7
 		MEMBER_OFFSET_INIT(page_offset, "page", "offset");
e039e7
 		if (INVALID_MEMBER(page_offset))
e039e7
 			ANON_MEMBER_OFFSET_INIT(page_offset, "page", "offset");
e039e7
@@ -763,6 +769,9 @@ vm_init(void)
e039e7
 			if (INVALID_MEMBER(page_slab))
e039e7
 				ANON_MEMBER_OFFSET_INIT(page_slab, "page", "slab_cache");
e039e7
 		}
e039e7
+		if (INVALID_MEMBER(page_slab))
e039e7
+			MEMBER_OFFSET_INIT(page_slab, "slab", "slab_cache");
e039e7
+
e039e7
 		MEMBER_OFFSET_INIT(page_slab_page, "page", "slab_page");
e039e7
 		if (INVALID_MEMBER(page_slab_page))
e039e7
 			ANON_MEMBER_OFFSET_INIT(page_slab_page, "page", "slab_page");
e039e7
@@ -772,10 +781,14 @@ vm_init(void)
e039e7
 		MEMBER_OFFSET_INIT(page_freelist, "page", "freelist");
e039e7
 		if (INVALID_MEMBER(page_freelist))
e039e7
 			ANON_MEMBER_OFFSET_INIT(page_freelist, "page", "freelist");
e039e7
+		if (INVALID_MEMBER(page_freelist))
e039e7
+			MEMBER_OFFSET_INIT(page_freelist, "slab", "freelist");
e039e7
 		if (INVALID_MEMBER(kmem_cache_objects)) {
e039e7
 			MEMBER_OFFSET_INIT(kmem_cache_oo, "kmem_cache", "oo");
e039e7
 			/* NOTE: returns offset of containing bitfield */
e039e7
 			ANON_MEMBER_OFFSET_INIT(page_objects, "page", "objects");
e039e7
+			if (INVALID_MEMBER(page_objects))
e039e7
+				ANON_MEMBER_OFFSET_INIT(page_objects, "slab", "objects");
e039e7
 		}
e039e7
 		if (VALID_MEMBER(kmem_cache_node)) {
e039e7
                 	ARRAY_LENGTH_INIT(len, NULL, "kmem_cache.node", NULL, 0);
e039e7
-- 
e039e7
2.20.1
e039e7