From db9f9543ecb396c5187368811132411a80485174 Mon Sep 17 00:00:00 2001 From: Shaun Tancheff Date: Mon, 4 Nov 2019 23:12:20 -0600 Subject: [PATCH] LU-12634 libcfs: force_sig() removed task parameter Linux 5.3 removed the task parameter for force_sig() signal: Remove task parameter from force_sig When force_sig() is not available reset the target thread default handler to SIG_DFL and proceed to use send_sig(..., 1) which eventually marshals the same signal to the target task. kernel-commit: 3cf5d076fb4d48979f382bc9452765bf8b79e740 NOTE: force_sig() is used here instead of a wake_up_process() as tasks may be blocked on rpc activity. Test-Parameters: trivial Cray-bug-id: LUS-7689 Signed-off-by: Shaun Tancheff Change-Id: Ic28f604d985f7e6c3c3dea8bc284c6f2e212f45c Reviewed-on: https://review.whamcloud.com/35745 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Petros Koutoupis Reviewed-by: Neil Brown Reviewed-by: Oleg Drokin --- libcfs/autoconf/lustre-libcfs.m4 | 23 +++++++++++++++++++++++ libcfs/include/libcfs/libcfs.h | 14 ++++++++++++++ lustre/lfsck/lfsck_lib.c | 6 +++--- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/libcfs/autoconf/lustre-libcfs.m4 b/libcfs/autoconf/lustre-libcfs.m4 index 279be80..9fd7e10 100644 --- a/libcfs/autoconf/lustre-libcfs.m4 +++ b/libcfs/autoconf/lustre-libcfs.m4 @@ -1269,6 +1269,27 @@ EXTRA_KCFLAGS="$tmp_flags" ]) # LIBCFS_HAVE_IOV_ITER_TYPE # +# LIBCFS_FORCE_SIG_WITH_TASK +# +# kernel 5.3 commit 3cf5d076fb4d48979f382bc9452765bf8b79e740 +# signal: Remove task parameter from force_sig +# +AC_DEFUN([LIBCFS_FORCE_SIG_WITH_TASK], [ +tmp_flags="$EXTRA_KCFLAGS" +EXTRA_KCFLAGS="-Werror" +LB_CHECK_COMPILE([if force_sig has task parameter], +force_sig_with_task, [ + #include +],[ + force_sig(SIGINT, NULL); +],[ + AC_DEFINE(HAVE_FORCE_SIG_WITH_TASK, 1, + [force_sig() has task parameter]) +]) +EXTRA_KCFLAGS="$tmp_flags" +]) # LIBCFS_FORCE_SIG_WITH_TASK + +# # LIBCFS_PROG_LINUX # # LibCFS linux kernel checks @@ -1382,6 +1403,8 @@ LIBCFS_CLEAR_AND_WAKE_UP_BIT LIBCFS_HAVE_IOV_ITER_TYPE # 5.0 LIBCFS_MM_TOTALRAM_PAGES_FUNC +# 5.3 +LIBCFS_FORCE_SIG_WITH_TASK ]) # LIBCFS_PROG_LINUX # diff --git a/libcfs/include/libcfs/libcfs.h b/libcfs/include/libcfs/libcfs.h index 608f562..3d54dda 100644 --- a/libcfs/include/libcfs/libcfs.h +++ b/libcfs/include/libcfs/libcfs.h @@ -78,6 +78,20 @@ #endif #endif +#ifdef HAVE_FORCE_SIG_WITH_TASK +#define cfs_force_sig(sig, task) force_sig((sig), (task)) +#else +#define cfs_force_sig(sig, task) \ +do { \ + unsigned long flags; \ + \ + spin_lock_irqsave(&task->sighand->siglock, flags); \ + task->sighand->action[sig - 1].sa.sa_handler = SIG_DFL; \ + send_sig(sig, task, 1); \ + spin_unlock_irqrestore(&task->sighand->siglock, flags); \ +} while (0) +#endif + /* need both kernel and user-land acceptor */ #define LNET_ACCEPTOR_MIN_RESERVED_PORT 512 #define LNET_ACCEPTOR_MAX_RESERVED_PORT 1023 diff --git a/lustre/lfsck/lfsck_lib.c b/lustre/lfsck/lfsck_lib.c index db9ca31..6b5d58e 100644 --- a/lustre/lfsck/lfsck_lib.c +++ b/lustre/lfsck/lfsck_lib.c @@ -3419,7 +3419,7 @@ int lfsck_stop(const struct lu_env *env, struct dt_device *key, thread_set_flags(thread, SVC_STOPPING); LASSERT(lfsck->li_task != NULL); - force_sig(SIGINT, lfsck->li_task); + cfs_force_sig(SIGINT, lfsck->li_task); if (lfsck->li_master) { struct lfsck_component *com; @@ -3429,7 +3429,7 @@ int lfsck_stop(const struct lu_env *env, struct dt_device *key, lad = com->lc_data; spin_lock(&lad->lad_lock); if (lad->lad_task != NULL) - force_sig(SIGINT, lad->lad_task); + cfs_force_sig(SIGINT, lad->lad_task); spin_unlock(&lad->lad_lock); } @@ -3437,7 +3437,7 @@ int lfsck_stop(const struct lu_env *env, struct dt_device *key, lad = com->lc_data; spin_lock(&lad->lad_lock); if (lad->lad_task != NULL) - force_sig(SIGINT, lad->lad_task); + cfs_force_sig(SIGINT, lad->lad_task); spin_unlock(&lad->lad_lock); } } -- 1.8.3.1