]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
cxl: Disable prefault_mode in Radix mode
authorVaibhav Jain <vaibhav@linux.ibm.com>
Fri, 18 May 2018 09:42:23 +0000 (15:12 +0530)
committerStefan Bader <stefan.bader@canonical.com>
Tue, 14 Aug 2018 10:23:17 +0000 (12:23 +0200)
BugLink: http://bugs.launchpad.net/bugs/1774471
Currently we see a kernel-oops reported on Power-9 while attaching a
context to an AFU, with radix-mode and sysfs attr 'prefault_mode' set
to anything other than 'none'. The backtrace of the oops is of this
form:

  Unable to handle kernel paging request for data at address 0x00000080
  Faulting instruction address: 0xc00800000bcf3b20
  cpu 0x1: Vector: 300 (Data Access) at [c00000037f003800]
      pc: c00800000bcf3b20: cxl_load_segment+0x178/0x290 [cxl]
      lr: c00800000bcf39f0: cxl_load_segment+0x48/0x290 [cxl]
      sp: c00000037f003a80
     msr: 9000000000009033
     dar: 80
   dsisr: 40000000
    current = 0xc00000037f280000
    paca    = 0xc0000003ffffe600   softe: 3        irq_happened: 0x01
      pid   = 3529, comm = afp_no_int
  <snip>
  cxl_prefault+0xfc/0x248 [cxl]
  process_element_entry_psl9+0xd8/0x1a0 [cxl]
  cxl_attach_dedicated_process_psl9+0x44/0x130 [cxl]
  native_attach_process+0xc0/0x130 [cxl]
  afu_ioctl+0x3f4/0x5e0 [cxl]
  do_vfs_ioctl+0xdc/0x890
  ksys_ioctl+0x68/0xf0
  sys_ioctl+0x40/0xa0
  system_call+0x58/0x6c

The issue is caused as on Power-8 the AFU attr 'prefault_mode' was
used to improve initial storage fault performance by prefaulting
process segments. However on Power-9 with radix mode we don't have
Storage-Segments that we can prefault. Also prefaulting process Pages
will be too costly and fine-grained.

Hence, since the prefaulting mechanism doesn't makes sense of
radix-mode, this patch updates prefault_mode_store() to not allow any
other value apart from CXL_PREFAULT_NONE when radix mode is enabled.

Fixes: f24be42aab37 ("cxl: Add psl9 specific code")
Cc: stable@vger.kernel.org # v4.12+
Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com>
Acked-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com>
Acked-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
(cherry picked from linux-next commit b6c84ba22ff3a198eb8d5552cf9b8fda1d792e54)
Signed-off-by: Joseph Salisbury <joseph.salisbury@canonical.com>
Acked-by: Khalid Elmously <khalid.elmously@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
Documentation/ABI/testing/sysfs-class-cxl
drivers/misc/cxl/sysfs.c

index 8e69345c37ccd9e1d74bd86f5858a45b1573f838..bbbabffc682a93feef010381dab1edf94b8c0394 100644 (file)
@@ -69,7 +69,9 @@ Date:           September 2014
 Contact:        linuxppc-dev@lists.ozlabs.org
 Description:    read/write
                 Set the mode for prefaulting in segments into the segment table
-                when performing the START_WORK ioctl. Possible values:
+                when performing the START_WORK ioctl. Only applicable when
+                running under hashed page table mmu.
+                Possible values:
                         none: No prefaulting (default)
                         work_element_descriptor: Treat the work element
                                  descriptor as an effective address and
index 4b5a4c5d3c012dff77508b9f0b8b9883671e594c..629e2e156412487d99edf30ae825b9e3cf790072 100644 (file)
@@ -353,12 +353,20 @@ static ssize_t prefault_mode_store(struct device *device,
        struct cxl_afu *afu = to_cxl_afu(device);
        enum prefault_modes mode = -1;
 
-       if (!strncmp(buf, "work_element_descriptor", 23))
-               mode = CXL_PREFAULT_WED;
-       if (!strncmp(buf, "all", 3))
-               mode = CXL_PREFAULT_ALL;
        if (!strncmp(buf, "none", 4))
                mode = CXL_PREFAULT_NONE;
+       else {
+               if (!radix_enabled()) {
+
+                       /* only allowed when not in radix mode */
+                       if (!strncmp(buf, "work_element_descriptor", 23))
+                               mode = CXL_PREFAULT_WED;
+                       if (!strncmp(buf, "all", 3))
+                               mode = CXL_PREFAULT_ALL;
+               } else {
+                       dev_err(device, "Cannot prefault with radix enabled\n");
+               }
+       }
 
        if (mode == -1)
                return -EINVAL;