Whamcloud - gitweb
LU-12634 libcfs: force_sig() removed task parameter 45/35745/8
authorShaun Tancheff <stancheff@cray.com>
Tue, 5 Nov 2019 05:12:20 +0000 (23:12 -0600)
committerOleg Drokin <green@whamcloud.com>
Fri, 6 Dec 2019 01:06:57 +0000 (01:06 +0000)
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 <stancheff@cray.com>
Change-Id: Ic28f604d985f7e6c3c3dea8bc284c6f2e212f45c
Reviewed-on: https://review.whamcloud.com/35745
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Petros Koutoupis <pkoutoupis@cray.com>
Reviewed-by: Neil Brown <neilb@suse.de>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
libcfs/autoconf/lustre-libcfs.m4
libcfs/include/libcfs/libcfs.h
lustre/lfsck/lfsck_lib.c

index 279be80..9fd7e10 100644 (file)
@@ -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 <linux/sched/signal.h>
+],[
+       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
 
 #
index 608f562..3d54dda 100644 (file)
  #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
index db9ca31..6b5d58e 100644 (file)
@@ -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);
                }
        }