** Changed in: ubuntu-z-systems
       Status: In Progress => Fix Committed

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1906255

Title:
  [UBUNTU 20.10] Applications runing in QEMU/KVM get translation faults

Status in Ubuntu on IBM z Systems:
  Fix Committed
Status in linux package in Ubuntu:
  New
Status in linux source package in Groovy:
  Fix Committed

Bug description:
  SRU Justification:
  ==================

  [Impact]

  * The commit 0b0ed657fe "s390: remove critical section cleanup from
  entry.S" was introduced in kernel 5.8, but instigated a problem where
  FPU registers were not properly restored when entering the SIE (start
  interpretive execution) instruction.

  * This leads to crashes of applications runnning inside KVM, as most
  of the programs in use nowdays are using FPU registers for backing of
  general register content.

  * To fix this interrupts in load_fpu_regs() need to be disabled -
  otherwise an interrupt might come in after the registers are loaded,
  but before CIF_FPU is cleared in load_fpu_regs().

  * When the interrupt returns, CIF_FPU will be cleared and the
  registers will never be restored.

  [Fix]

  * 1179f170b6f0af7bb0b3b7628136eaac450ddf31 1179f170b6f0 "s390: fix fpu
  restore in entry.S"

  [Test Case]

  * IBM Z or LinuxONE hardware with Ubuntu Server 20.10 installed.

  * A KVM host needs to be setup as well as an KVM guest (use again
  20.10).

  * Run (ideally context switching) workload that makes use of FP
  instructions inside of the KVM guest.

  * Monitor the health of the guest for crashes (logs).

  [Regression Potential]

  * Even if the code changes are quite overseeable, there is still a
  certain risk for regression, because:

  * the modifications affect a critical part of the kernel
  (arch/s390/kernel/entry.S)

  * affect the handling of the FPU registers

  * and are always in use if KVM guests run

  * So in worst case the changes may have an even bigger impact on FPU
  workloads in KVM guests

  * and may not only crash in case of FPU usage, but also KVM in
  general.

  * But the code is peurly s390x specific, hence affects IBM Z only,

  * and it got already upstream accepted with v5.10-rc6

  * and a test kernel (based on groovy master-next) was build for
  further testing.

  [Other]

  * The patch got upstream accepted with kernel v5.10-rc6, hence it will
  land sooner or later in Hirsute.

  * It was initially planned to address groovy via 5.8 upstream stable
  update, and in fact the patch was already marked for this, but it
  didn't made it because 5.8 already reached it's EOL.

  * Hence this SRU is submitted for groovy only.

  __________

  commit 0b0ed657fe ("s390: remove critical section cleanup from
  entry.S") introduced a problem where FPU registers were not properly
  restored when entering SIE. This leads to crashes of applications
  runnning inside kvm, as most of the programs in use nowdays are using
  FPU registers for backing of general register content.

  Fix is upstream:
  author        Sven Schnelle <sv...@linux.ibm.com>     2020-11-20 14:17:52 
+0100
  committer     Heiko Carstens <h...@linux.ibm.com>     2020-11-23 11:52:13 
+0100
  commit        1179f170b6f0af7bb0b3b7628136eaac450ddf31 (patch)
  tree  19e8acb64e0968b41de4899cc1315c41b002839e /arch/s390/kernel/entry.S
  parent        78d732e1f326f74f240d416af9484928303d9951 (diff)
  download      linux-1179f170b6f0af7bb0b3b7628136eaac450ddf31.tar.gz
  s390: fix fpu restore in entry.S
  We need to disable interrupts in load_fpu_regs(). Otherwise an
  interrupt might come in after the registers are loaded, but before
  CIF_FPU is cleared in load_fpu_regs(). When the interrupt returns,
  CIF_FPU will be cleared and the registers will never be restored.

  The entry.S code usually saves the interrupt state in __SF_EMPTY on the
  stack when disabling/restoring interrupts. sie64a however saves the pointer
  to the sie control block in __SF_SIE_CONTROL, which references the same
  location.  This is non-obvious to the reader. To avoid thrashing the sie
  control block pointer in load_fpu_regs(), move the __SIE_* offsets eight
  bytes after __SF_EMPTY on the stack.

  Cc: <sta...@vger.kernel.org> # 5.8
  Fixes: 0b0ed657fe00 ("s390: remove critical section cleanup from entry.S")
  Reported-by: Pierre Morel <pmo...@linux.ibm.com>
  Signed-off-by: Sven Schnelle <sv...@linux.ibm.com>
  Acked-by: Christian Borntraeger <borntrae...@de.ibm.com>
  Reviewed-by: Heiko Carstens <h...@linux.ibm.com>
  Signed-off-by: Heiko Carstens <h...@linux.ibm.com>

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu-z-systems/+bug/1906255/+subscriptions

-- 
Mailing list: https://launchpad.net/~kernel-packages
Post to     : kernel-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~kernel-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to