]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
powerpc/pseries/htmdump: Fix the offset value used in htm status dump
authorAthira Rajeev <atrajeev@linux.ibm.com>
Sat, 14 Mar 2026 13:24:32 +0000 (18:54 +0530)
committerMadhavan Srinivasan <maddy@linux.ibm.com>
Wed, 6 May 2026 01:57:44 +0000 (07:27 +0530)
H_HTM call is invoked using three parameters specifying
the address of the buffer, size of the buffer and offset
where to read from. offset used was always zero.
"offset" is value from output buffer header that points
to next entry to dump. zero is the first entry to dump.
next entry is read from the output bufferbyte offset 0x8.
Update htmstatus_read() function to use right offset. Return
when offset points to -1

Fixes: 627cf584f4c3 ("powerpc/pseries/htmdump: Add htm status support to htmdump module")
Signed-off-by: Athira Rajeev <atrajeev@linux.ibm.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/20260314132432.25581-3-atrajeev@linux.ibm.com
arch/powerpc/platforms/pseries/htmdump.c

index 34978a794eba1ef716f7aaa5cccc40bc2619d084..76444c6c5cc1221f201d209cb3c149ec201034b3 100644 (file)
@@ -231,15 +231,26 @@ static ssize_t htmstatus_read(struct file *filp, char __user *ubuf,
        u64 *num_entries;
        u64 to_copy;
        int htmstatus_flag;
+       loff_t offset = 0;
+       u64 status_offset = 0;
 
        /*
         * Invoke H_HTM call with:
         * - operation as htm status (H_HTM_OP_STATUS)
-        * - last three values as addr, size and offset
+        * - last three values as addr, size and offset.
+        *   "offset" is value from output buffer header
+        *   that points to next entry to dump. 0 is the first
+        *   entry to dump. next entry is read from the output
+        *   bufferbyte offset 0x8.
         */
+       if (*ppos) {
+               status_offset = *(u64 *)(htm_status_data + 0x8);
+               if (status_offset == -1)
+                       return 0;
+       }
        rc = htm_hcall_wrapper(htmflags, nodeindex, nodalchipindex, coreindexonchip,
                                   htmtype, H_HTM_OP_STATUS, virt_to_phys(htm_status_data),
-                                  PAGE_SIZE, 0);
+                                  PAGE_SIZE, be64_to_cpu(status_offset));
 
        ret = htm_return_check(rc);
        if (ret <= 0) {
@@ -261,7 +272,9 @@ static ssize_t htmstatus_read(struct file *filp, char __user *ubuf,
        else
                htmstatus_flag = 0x6;
        to_copy = 32 + (be64_to_cpu(*num_entries) * htmstatus_flag);
-       return simple_read_from_buffer(ubuf, count, ppos, htm_status_data, to_copy);
+       *ppos += to_copy;
+
+       return simple_read_from_buffer(ubuf, count, &offset, htm_status_data, to_copy);
 }
 
 static const struct file_operations htmstatus_fops = {