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

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