1. 12 Apr, 2021 22 commits
  2. 07 Apr, 2021 3 commits
  3. 05 Apr, 2021 9 commits
    • Alexander Gordeev's avatar
      s390/mm: fix phys vs virt confusion in mark_kernel_pXd() functions family · 3784231b
      Alexander Gordeev authored
      Due to historical reasons mark_kernel_pXd() functions
      misuse the notion of physical vs virtual addresses
      difference.
      Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      3784231b
    • Tony Krowiak's avatar
      s390/vfio-ap: fix circular lockdep when setting/clearing crypto masks · 0cc00c8d
      Tony Krowiak authored
      This patch fixes a lockdep splat introduced by commit f21916ec
      ("s390/vfio-ap: clean up vfio_ap resources when KVM pointer invalidated").
      The lockdep splat only occurs when starting a Secure Execution guest.
      Crypto virtualization (vfio_ap) is not yet supported for SE guests;
      however, in order to avoid this problem when support becomes available,
      this fix is being provided.
      
      The circular locking dependency was introduced when the setting of the
      masks in the guest's APCB was executed while holding the matrix_dev->lock.
      While the lock is definitely needed to protect the setting/unsetting of the
      matrix_mdev->kvm pointer, it is not necessarily critical for setting the
      masks; so, the matrix_dev->lock will be released while the masks are being
      set or cleared.
      
      Keep in mind, however, that another process that takes the matrix_dev->lock
      can get control while the masks in the guest's APCB are being set or
      cleared as a result of the driver being notified that the KVM pointer
      has been set or unset. This could result in invalid access to the
      matrix_mdev->kvm pointer by the intervening process. To avoid this
      scenario, two new fields are being added to the ap_matrix_mdev struct:
      
      struct ap_matrix_mdev {
      	...
      	bool kvm_busy;
      	wait_queue_head_t wait_for_kvm;
         ...
      };
      
      The functions that handle notification that the KVM pointer value has
      been set or cleared will set the kvm_busy flag to true until they are done
      processing at which time they will set it to false and wake up the tasks on
      the matrix_mdev->wait_for_kvm wait queue. Functions that require
      access to matrix_mdev->kvm will sleep on the wait queue until they are
      awakened at which time they can safely access the matrix_mdev->kvm
      field.
      
      Fixes: f21916ec ("s390/vfio-ap: clean up vfio_ap resources when KVM pointer invalidated")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarTony Krowiak <akrowiak@linux.ibm.com>
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      0cc00c8d
    • Wan Jiabing's avatar
      s390/cio: remove duplicate struct ccw1 declaration · f38033c8
      Wan Jiabing authored
      struct ccw1 is declared twice. One has been declared
      at 21st line. Remove the duplicate.
      Signed-off-by: default avatarWan Jiabing <wanjiabing@vivo.com>
      Acked-by: default avatarVineeth Vijayan <vneethv@linux.ibm.com>
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      f38033c8
    • Shixin Liu's avatar
      s390/cio: use DECLARE_WAIT_QUEUE_HEAD() for wait_queue · 4e774d59
      Shixin Liu authored
      wait_queue_head_t can be initialized automatically with
      DECLARE_WAIT_QUEUE_HEAD() rather than explicitly calling
      init_waitqueue_head().
      Signed-off-by: default avatarShixin Liu <liushixin2@huawei.com>
      Acked-by: default avatarVineeth Vijayan <vneethv@linux.ibm.com>
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      4e774d59
    • Shixin Liu's avatar
      s390/cio: use DEFINE_SPINLOCK() for spinlock · 1034c96c
      Shixin Liu authored
      static spinlock can be initialized automatically with DEFINE_SPINLOCK()
      rather than explicitly calling spin_lock_init().
      Signed-off-by: default avatarShixin Liu <liushixin2@huawei.com>
      Acked-by: default avatarVineeth Vijayan <vneethv@linux.ibm.com>
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      1034c96c
    • Niklas Schnelle's avatar
      s390/pci: expose UID uniqueness guarantee · 408f2c9c
      Niklas Schnelle authored
      On s390 each PCI device has a user-defined ID (UID) exposed under
      /sys/bus/pci/devices/<dev>/uid. This ID was designed to serve as the PCI
      device's primary index and to match the device within Linux to the
      device configured in the hypervisor. To serve as a primary identifier
      the UID must be unique within the Linux instance, this is guaranteed by
      the platform if and only if the UID Uniqueness Checking flag is set
      within the CLP List PCI Functions response.
      
      While the UID has been exposed to userspace since commit ac4995b9
      ("s390/pci: add some new arch specific pci attributes") whether or not
      the platform guarantees its uniqueness for the lifetime of the Linux
      instance while defined is not visible from userspace. Remedy this by
      exposing this as a per device attribute at
      
      /sys/bus/pci/devices/<dev>/uid_is_unique
      
      Keeping this a per device attribute allows for maximum flexibility if we
      ever end up with some devices not having a UID or not enjoying the
      guaranteed uniqueness.
      Signed-off-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
      Reviewed-by: default avatarViktor Mihajlovski <mihajlov@linux.ibm.com>
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      408f2c9c
    • Heiko Carstens's avatar
      s390/irq: fix reading of ext_params2 field from lowcore · 85012e76
      Heiko Carstens authored
      The contents of the ext_params2 field of the lowcore should just be
      copied to the pt_regs structure, not dereferenced.
      
      Fixes crashes / program check loops like this:
      
      Krnl PSW : 0404c00180000000 00000000d6d02b3c (do_ext_irq+0x74/0x170)
                 R:0 T:1 IO:0 EX:0 Key:0 M:1 W:0 P:0 AS:3 CC:0 PM:0 RI:0 EA:3
      Krnl GPRS: 0000000000000000 80000000000b974e 00000000d71abee0 00000000d71abee0
                 0000000080030000 000000000000000f 0000000000000000 0000000000000000
                 0000000000000001 00000380000bf918 00000000d73ef780 00000380000bf518
                 0000000080348000 00000000d6d13350 00000000d6d02b1e 00000380000bf428
      Krnl Code: 00000000d6d02b2e: 58100080            l       %r1,128
                 00000000d6d02b32: 5010b0a4            st      %r1,164(%r11)
                #00000000d6d02b36: e31001b80104        lg      %r1,4536
                >00000000d6d02b3c: e31010000004        lg      %r1,0(%r1)
                 00000000d6d02b42: e310b0a80024        stg     %r1,168(%r11)
                 00000000d6d02b48: c01000242270        larl    %r1,00000000d7187028
                 00000000d6d02b4e: d5071000b010        clc     0(8,%r1),16(%r11)
                 00000000d6d02b54: a784001b            brc     8,00000000d6d02b8a
      Call Trace:
       [<00000000d6d02b3c>] do_ext_irq+0x74/0x170
       [<00000000d6d0ea5c>] ext_int_handler+0xc4/0xf4
       [<00000000d621d266>] die+0x106/0x188
       [<00000000d62305b8>] do_no_context+0xc8/0x100
       [<00000000d6d02790>] __do_pgm_check+0xe0/0x1f0
       [<00000000d6d0e950>] pgm_check_handler+0x118/0x160
       [<00000000d6d02b3c>] do_ext_irq+0x74/0x170
       [<00000000d6d0ea5c>] ext_int_handler+0xc4/0xf4
       [<00000000d621d266>] die+0x106/0x188
       [<00000000d62305b8>] do_no_context+0xc8/0x100
       [<00000000d6d02790>] __do_pgm_check+0xe0/0x1f0
       [<00000000d6d0e950>] pgm_check_handler+0x118/0x160
       [<00000000d6d02b3c>] do_ext_irq+0x74/0x170
       [<00000000d6d0ea5c>] ext_int_handler+0xc4/0xf4
       [<0000000000000000>] 0x0
       [<00000000d6d0e57a>] default_idle_call+0x42/0x110
       [<00000000d629856e>] do_idle+0xce/0x160
       [<00000000d62987be>] cpu_startup_entry+0x36/0x40
       [<00000000d621f2f2>] smp_start_secondary+0x82/0x88
      
      Cc: Sven Schnelle <svens@linux.ibm.com>
      Cc: Vasily Gorbik <gor@linux.ibm.com>
      Fixes: 56e62a73 ("s390: convert to generic entry")
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      85012e76
    • Vasily Gorbik's avatar
      s390/unwind: add machine check handler stack · 08edb968
      Vasily Gorbik authored
      Fixes: b61b1595 ("s390: add stack for machine check handler")
      Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      08edb968
    • Alexander Gordeev's avatar
      s390/cpcmd: fix inline assembly register clobbering · 7a2f9144
      Alexander Gordeev authored
      Register variables initialized using arithmetic. That leads to
      kasan instrumentaton code corrupting the registers contents.
      Follow GCC guidlines and use temporary variables for assigning
      init values to register variables.
      
      Fixes: 94c12cc7 ("[S390] Inline assembly cleanup.")
      Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
      Acked-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
      Link: https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Local-Register-Variables.htmlSigned-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      7a2f9144
  4. 28 Mar, 2021 3 commits
  5. 25 Mar, 2021 3 commits
    • Heiko Carstens's avatar
      s390/vdso: fix initializing and updating of vdso_data · 5b43bd18
      Heiko Carstens authored
      Li Wang reported that clock_gettime(CLOCK_MONOTONIC_RAW, ...) returns
      incorrect values when time is provided via vdso instead of system call:
      
      vdso_ts_nsec = 4484351380985507, vdso_ts.tv_sec = 4484351, vdso_ts.tv_nsec = 380985507
      sys_ts_nsec  = 1446923235377, sys_ts.tv_sec  = 1446, sys_ts.tv_nsec  = 923235377
      
      Within the s390 specific vdso function __arch_get_hw_counter() reads
      tod clock steering values from the arch_data member of the passed in
      vdso_data structure.
      
      Problem is that only for the CS_HRES_COARSE vdso_data arch_data is
      initialized and gets updated. The CS_RAW specific vdso_data does not
      contain any valid tod_clock_steering information, which explains the
      different values.
      
      Fix this by initializing and updating all vdso_datas.
      Reported-by: default avatarLi Wang <liwang@redhat.com>
      Tested-by: default avatarLi Wang <liwang@redhat.com>
      Fixes: 1ba2d6c0 ("s390/vdso: simplify __arch_get_hw_counter()")
      Link: https://lore.kernel.org/linux-s390/YFnxr1ZlMIOIqjfq@osirisSigned-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      5b43bd18
    • Heiko Carstens's avatar
      s390/vdso: fix tod_steering_delta type · b24bacd6
      Heiko Carstens authored
      The s390 specific vdso function __arch_get_hw_counter() is supposed to
      consider tod clock steering.
      
      If a tod clock steering event happens and the tod clock is set to a
      new value __arch_get_hw_counter() will not return the real tod clock
      value but slowly drift it from the old delta until the returned value
      finally matches the real tod clock value again.
      
      Unfortunately the type of tod_steering_delta unsigned while it is
      supposed to be signed. It depends on if tod_steering_delta is negative
      or positive in which direction the vdso code drifts the clock value.
      
      Worst case is now that instead of drifting the clock slowly it will
      jump into the opposite direction by a factor of two.
      
      Fix this by simply making tod_steering_delta signed.
      
      Fixes: 4bff8cb5 ("s390: convert to GENERIC_VDSO")
      Cc: <stable@vger.kernel.org> # 5.10
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      b24bacd6
    • Heiko Carstens's avatar
      s390/vdso: copy tod_steering_delta value to vdso_data page · 72bbc226
      Heiko Carstens authored
      When converting the vdso assembler code to C it was forgotten to
      actually copy the tod_steering_delta value to vdso_data page.
      
      Which in turn means that tod clock steering will not work correctly.
      
      Fix this by simply copying the value whenever it is updated.
      
      Fixes: 4bff8cb5 ("s390: convert to GENERIC_VDSO")
      Cc: <stable@vger.kernel.org> # 5.10
      Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
      72bbc226