Blob Blame History Raw
From 93a97bce23d6b4a7955e71e2881e4bad70657b13 Mon Sep 17 00:00:00 2001
From: Juergen Gross <jgross@suse.com>
Date: Thu, 25 Mar 2021 12:01:19 +0100
Patch-mainline: never, SUSE debugging
References: bsc#1180846
Subject: [PATCH v2 2/2] kernel/smp: make csdlock timeout depend on boot
 parameter

Add a csdlock_timeout parameter for being able to specify csdlock
timeout in milliseconds. Default is 5000 (5 seconds).

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 kernel/smp.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/kernel/smp.c b/kernel/smp.c
index 4480fd47b88a..c59fd2958295 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -25,6 +25,7 @@
 #include <linux/nmi.h>
 #include <linux/sched/debug.h>
 #include <linux/jump_label.h>
+#include <linux/moduleparam.h>
 
 #include "smpboot.h"
 
@@ -193,12 +194,14 @@ static int __init csdlock_debug(char *str)
 }
 __setup("csdlock_debug=", csdlock_debug);
 
+static int csdlock_timeout = 5000;
+core_param(csdlock_timeout, csdlock_timeout, int, 0644);
+
 static DEFINE_PER_CPU(call_single_data_t *, cur_csd);
 static DEFINE_PER_CPU(smp_call_func_t, cur_csd_func);
 static DEFINE_PER_CPU(void *, cur_csd_info);
 static DEFINE_PER_CPU(struct cfd_seq_local, cfd_seq_local);
 
-#define CSD_LOCK_TIMEOUT (5ULL * NSEC_PER_SEC)
 atomic_t csd_bug_count = ATOMIC_INIT(0);
 static u64 cfd_seq;
 
@@ -391,7 +394,7 @@ static bool csd_lock_wait_toolong(call_single_data_t *csd, u64 ts0, u64 *ts1, in
 
 	ts2 = sched_clock();
 	ts_delta = ts2 - *ts1;
-	if (likely(ts_delta <= CSD_LOCK_TIMEOUT))
+	if (likely(ts_delta <= (u64)csdlock_timeout * NSEC_PER_MSEC))
 		return false;
 
 	firsttime = !*bug_id;
-- 
2.26.2