Whamcloud - gitweb
LU-14395 kernel: kernel update RHEL7.9 [3.10.0-1160.15.2.el7] 46/41446/3
authorJian Yu <yujian@whamcloud.com>
Wed, 3 Mar 2021 03:35:04 +0000 (19:35 -0800)
committerOleg Drokin <green@whamcloud.com>
Thu, 4 Mar 2021 08:36:30 +0000 (08:36 +0000)
Update RHEL7.9 kernel to 3.10.0-1160.15.2.el7.

Change debuginfo download location since debuginfo.centos.org
does not provide kernel-debuginfo-common anymore.

The patch also reverts the following fix from RHEL 7.9 kernel
since version 3.10.0-1160.8.1.el7:

- [kernel] timer: Fix lockup in __run_timers() caused by
  large jiffies/timer_jiffies delta (Waiman Long) [1849716]

The above fix caused Hard LOCKUP kernel panic.

Test-Parameters: clientdistro=el7.9 serverdistro=el7.9

Change-Id: Icdd9e8bf4bd595dece266f6c5a9b0de344781a93
Signed-off-by: Jian Yu <yujian@whamcloud.com>
Signed-off-by: Minh Diep <mdiep@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/41446
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Yang Sheng <ys@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
contrib/lbuild/lbuild-rhel7
lustre/ChangeLog
lustre/kernel_patches/patches/revert-fix-lockup-in-run_timers-large-jiffies-delta.patch [new file with mode: 0644]
lustre/kernel_patches/series/3.10-rhel7.9.series
lustre/kernel_patches/targets/3.10-rhel7.9.target.in
lustre/kernel_patches/which_patch

index 721d56b..8226945 100644 (file)
@@ -111,7 +111,7 @@ kernel_srpm_location() {
 
 kernel_debuginfo_location() {
 
-       echo "http://debuginfo.centos.org/7/x86_64/"
+       echo "http://mirror.facebook.net/centos-debuginfo/7/x86_64/"
 
 }
 
index 50c9ff3..1dd9162 100644 (file)
@@ -6,7 +6,7 @@
          3.10.0-957.27.2.el7  (RHEL7.6)
          3.10.0-1062.18.1.el7 (RHEL7.7)
          3.10.0-1127.19.1.el7 (RHEL7.8)
-         3.10.0-1160.2.1.el7  (RHEL7.9)
+         3.10.0-1160.15.2.el7 (RHEL7.9)
        * Server known to build on the following kernels (others may also work):
          2.6.32-696.18.7.el6  (RHEL6.9)
          3.10.0-862.14.4.el7  (RHEL7.5)
@@ -20,7 +20,7 @@
          3.10.0-957.27.2.el7  (RHEL7.6)
          3.10.0-1062.18.1.el7 (RHEL7.7)
          3.10.0-1127.19.1.el7 (RHEL7.8)
-         3.10.0-1160.2.1.el7  (RHEL7.9)
+         3.10.0-1160.15.2.el7 (RHEL7.9)
          4.18.0-80.11.2.el8   (RHEL8.0)
          4.4.180-94.97        (SLES12 SP3)
          4.12.14-95.54        (SLES12 SP4)
diff --git a/lustre/kernel_patches/patches/revert-fix-lockup-in-run_timers-large-jiffies-delta.patch b/lustre/kernel_patches/patches/revert-fix-lockup-in-run_timers-large-jiffies-delta.patch
new file mode 100644 (file)
index 0000000..a8c1796
--- /dev/null
@@ -0,0 +1,112 @@
+--- linux-3.10.0-1160.11.1.el7.x86_64/kernel/timer.c   2020-11-30 12:40:05.000000000 -0500
++++ linux-3.10.0-1160.6.1.el7.x86_64/kernel/timer.c    2020-10-21 13:17:08.000000000 -0400
+@@ -1213,95 +1213,6 @@
+       }
+ }
+-/*
+- * Total number of list_head entries in tv1-tv5 of struct tvec_base.
+- */
+-#define TVEC_LEN      ((offsetofend(struct tvec_base, tv5) -  \
+-                        offsetof(struct tvec_base, tv1)) /    \
+-                        sizeof(struct list_head))
+-
+-/**
+- * requeue_timers - requeue all the timers in the timer wheel
+- * @base: the timer vector to be processed.
+- *
+- * When a cpu is idle for a long period of time, it is possible that
+- * timer_jiffies can significantly lag behind jiffies making the iterative
+- * jiffies check in __run_timers() takes a long time to complete causing
+- * soft or hard system lockup.
+- *
+- * This function remedies this situation by requeuing all the timers in
+- * the cascading timer wheel and adjusting timer_jiffies to the min() of
+- * current jiffies and the expiry times of all active timers. The expiry
+- * times of expired deferrable timers will be set to the new timer_jiffies.
+- */
+-static noinline void requeue_timers(struct tvec_base *base)
+-{
+-      struct timer_list *timer, *tmp;
+-      struct list_head list, head, *vecs;
+-      unsigned long min_jiffies = jiffies;
+-      unsigned long nactive = base->active_timers;
+-      unsigned long nall = base->all_timers;
+-      int i;
+-
+-      lockdep_assert_held(&base->lock);
+-      INIT_LIST_HEAD(&head);
+-
+-      /*
+-       * tv1-tv5 are processed together as a single array of list_head's.
+-       */
+-      vecs = (struct list_head *)&base->tv1;
+-      for (i = 0; i < TVEC_LEN; i++, vecs++) {
+-              if (list_empty(vecs))
+-                      continue;
+-
+-              list_replace_init(vecs, &list);
+-
+-              /*
+-               * Check all the timers in list and move them over to head.
+-               */
+-              list_for_each_entry_safe(timer, tmp, &list, entry) {
+-                      base->all_timers--;
+-                      if (!tbase_get_deferrable(timer->base)) {
+-                              base->active_timers--;
+-                              if (time_before(timer->expires, min_jiffies))
+-                                      min_jiffies = timer->expires;
+-                      }
+-                      list_add_tail(&timer->entry, &head);
+-              }
+-              if (!base->all_timers)
+-                      break;
+-      }
+-      WARN_ON_ONCE(base->all_timers || base->active_timers);
+-
+-      /*
+-       * Restore all_timers and active_timers.
+-       * Requeue timers back into timer wheel with timer_jiffies
+-       * set to min_jiffies.
+-       */
+-      base->all_timers = nall;
+-      base->active_timers = nactive;
+-      base->timer_jiffies = min_jiffies;
+-
+-      list_for_each_entry_safe(timer, tmp, &head, entry) {
+-              unsigned long old_expires;
+-              bool restore = false;
+-
+-              /*
+-               * For expiry time that is < min_jiffies (deferrable ones),
+-               * temporarily change it to min_jiffies, insert the timer
+-               * without accounting and restore the expiry time.
+-               */
+-              if (time_before(timer->expires, min_jiffies)) {
+-                      old_expires = timer->expires;
+-                      timer->expires = min_jiffies;
+-                      restore = true;
+-              }
+-              __internal_add_timer(base, timer);
+-              if (restore)
+-                      timer->expires = old_expires;
+-      }
+-}
+-
+ #define INDEX(N) ((base->timer_jiffies >> (TVR_BITS + (N) * TVN_BITS)) & TVN_MASK)
+ /**
+@@ -1317,13 +1228,6 @@
+       spin_lock_irq(&base->lock);
+-      /*
+-       * Requeue the timers if jiffies - timer_jiffies >= 2*TVEC_LEN.
+-       */
+-      if (base->all_timers &&
+-          time_after_eq(jiffies, base->timer_jiffies + 2 * TVEC_LEN))
+-              requeue_timers(base);
+-
+       while (time_after_eq(jiffies, base->timer_jiffies)) {
+               struct list_head work_list;
+               struct list_head *head = &work_list;
index 28bf7c0..29efbe7 100644 (file)
@@ -2,3 +2,4 @@ vfs-project-quotas-rhel7.patch
 fix-integrity-verify-rhel7.patch
 block-integrity-allow-optional-integrity-functions-rhel7.patch
 block-pass-bio-into-integrity_processing_fn-rhel7.patch
+revert-fix-lockup-in-run_timers-large-jiffies-delta.patch
index b651732..d7dca49 100644 (file)
@@ -1,5 +1,5 @@
 lnxmaj="3.10.0"
-lnxrel="1160.2.1.el7"
+lnxrel="1160.15.2.el7"
 
 KERNEL_SRPM=kernel-${lnxmaj}-${lnxrel}.src.rpm
 SERIES=3.10-rhel7.9.series
index de7a1ae..c6bae16 100644 (file)
@@ -22,7 +22,7 @@ PATCH SERIES FOR SERVER KERNELS:
 3.10-rhel7.6.series     3.10.0-957.27.2.el7  (RHEL 7.6)
 3.10-rhel7.7.series     3.10.0-1062.18.1.el7 (RHEL 7.7)
 3.10-rhel7.8.series     3.10.0-1127.19.1.el7 (RHEL 7.8)
-3.10-rhel7.9.series     3.10.0-1160.2.1.el7  (RHEL 7.9)
+3.10-rhel7.9.series     3.10.0-1160.15.2.el7 (RHEL 7.9)
 3.0-sles11sp3.series    3.0.101-0.47.71      (SLES11 SP3)
 3.0-sles11sp3.series    3.0.101-107          (SLES11 SP4)
 3.12-sles12.series      3.12.74-60.64.40     (SLES12 SP1)