From: Vaibhav Jain <vaib...@linux.ibm.com>

On Power-8 the AFU attr prefault_mode tried to improve storage fault
performance by prefaulting process segments. However Power-9 radix
mode doesn't have Storage-Segments and prefaulting Pages is too fine
grained.

So this patch updates prefault_mode_store() to not allow any other
value apart from CXL_PREFAULT_NONE when radix mode is enabled.

Cc: <sta...@vger.kernel.org>
Fixes: f24be42aab37 ("cxl: Add psl9 specific code")
Signed-off-by: Vaibhav Jain <vaib...@linux.ibm.com>
---
 Documentation/ABI/testing/sysfs-class-cxl |  4 +++-
 drivers/misc/cxl/sysfs.c                  | 16 ++++++++++++----
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-class-cxl 
b/Documentation/ABI/testing/sysfs-class-cxl
index 640f65e79ef1..267920a1874b 100644
--- a/Documentation/ABI/testing/sysfs-class-cxl
+++ b/Documentation/ABI/testing/sysfs-class-cxl
@@ -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
diff --git a/drivers/misc/cxl/sysfs.c b/drivers/misc/cxl/sysfs.c
index 4b5a4c5d3c01..629e2e156412 100644
--- a/drivers/misc/cxl/sysfs.c
+++ b/drivers/misc/cxl/sysfs.c
@@ -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;
-- 
2.17.0

Reply via email to