[Crash-utility] [PATCH 3/3] sbitmapq: Fix for sbitmap_queue without min_shallow_depth member

Kazuhito Hagio k-hagio-ab at nec.com
Fri Jun 10 02:49:49 UTC 2022


The sbitmap_queue.min_shallow_depth member was added by kernel commit
a327553965de ("sbitmap: fix missed wakeups caused by sbitmap_queue_get_shallow()")
at Linux 4.18.  Without the patch, on earlier kernels the "sbitmapq"
command fails with the following error:

  crash> sbitmapq ffff89bb7638ee50

  sbitmapq: invalid structure member offset: sbitmap_queue_min_shallow_depth
            FILE: sbitmap.c  LINE: 398  FUNCTION: sbitmap_queue_context_load()

Signed-off-by: Kazuhito Hagio <k-hagio-ab at nec.com>
---
 sbitmap.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/sbitmap.c b/sbitmap.c
index c8c9f2b6d003..500246ec6bea 100644
--- a/sbitmap.c
+++ b/sbitmap.c
@@ -371,7 +371,8 @@ static void sbitmap_queue_show(const struct sbitmap_queue_context *sqc,
 	else if (VALID_MEMBER(sbitmap_round_robin)) /* 5.13 and later */
 		fprintf(fp, "round_robin = %d\n", sc->round_robin);
 
-	fprintf(fp, "min_shallow_depth = %u\n", sqc->min_shallow_depth);
+	if (VALID_MEMBER(sbitmap_queue_min_shallow_depth)) /* 4.18 and later */
+		fprintf(fp, "min_shallow_depth = %u\n", sqc->min_shallow_depth);
 }
 
 static void sbitmap_queue_context_load(ulong addr, struct sbitmap_queue_context *sqc)
@@ -395,7 +396,8 @@ static void sbitmap_queue_context_load(ulong addr, struct sbitmap_queue_context
 		sqc->ws_active = INT(sbitmap_queue_buf + OFFSET(sbitmap_queue_ws_active));
 	if (VALID_MEMBER(sbitmap_queue_round_robin))
 		sqc->round_robin = BOOL(sbitmap_queue_buf + OFFSET(sbitmap_queue_round_robin));
-	sqc->min_shallow_depth = UINT(sbitmap_queue_buf + OFFSET(sbitmap_queue_min_shallow_depth));
+	if (VALID_MEMBER(sbitmap_queue_min_shallow_depth))
+		sqc->min_shallow_depth = UINT(sbitmap_queue_buf + OFFSET(sbitmap_queue_min_shallow_depth));
 
 	FREEBUF(sbitmap_queue_buf);
 }
-- 
2.27.0



More information about the Crash-utility mailing list