Skip to content

Commit 66252f7

Browse files
Madhavan Srinivasangregkh
authored andcommitted
powerpc/imc: Dont create debugfs files for cpu-less nodes
commit 41ba17f upstream. Commit <684d984038aa> ('powerpc/powernv: Add debugfs interface for imc-mode and imc') added debugfs interface for the nest imc pmu devices to support changing of different ucode modes. Primarily adding this capability for debug. But when doing so, the code did not consider the case of cpu-less nodes. So when reading the _cmd_ or _mode_ file of a cpu-less node will create this crash. Faulting instruction address: 0xc0000000000d0d58 Oops: Kernel access of bad area, sig: 11 [#1] ... CPU: 67 PID: 5301 Comm: cat Not tainted 5.2.0-rc6-next-20190627+ #19 NIP: c0000000000d0d58 LR: c00000000049aa18 CTR:c0000000000d0d50 REGS: c00020194548f9e0 TRAP: 0300 Not tainted (5.2.0-rc6-next-20190627+) MSR: 9000000000009033 <SF,HV,EE,ME,IR,DR,RI,LE> CR:28022822 XER: 00000000 CFAR: c00000000049aa14 DAR: 000000000003fc08 DSISR:40000000 IRQMASK: 0 ... NIP imc_mem_get+0x8/0x20 LR simple_attr_read+0x118/0x170 Call Trace: simple_attr_read+0x70/0x170 (unreliable) debugfs_attr_read+0x6c/0xb0 __vfs_read+0x3c/0x70 vfs_read+0xbc/0x1a0 ksys_read+0x7c/0x140 system_call+0x5c/0x70 Patch fixes the issue with a more robust check for vbase to NULL. Before patch, ls output for the debugfs imc directory # ls /sys/kernel/debug/powerpc/imc/ imc_cmd_0 imc_cmd_251 imc_cmd_253 imc_cmd_255 imc_mode_0 imc_mode_251 imc_mode_253 imc_mode_255 imc_cmd_250 imc_cmd_252 imc_cmd_254 imc_cmd_8 imc_mode_250 imc_mode_252 imc_mode_254 imc_mode_8 After patch, ls output for the debugfs imc directory # ls /sys/kernel/debug/powerpc/imc/ imc_cmd_0 imc_cmd_8 imc_mode_0 imc_mode_8 Actual bug here is that, we have two loops with potentially different loop counts. That is, in imc_get_mem_addr_nest(), loop count is obtained from the dt entries. But in case of export_imc_mode_and_cmd(), loop was based on for_each_nid() count. Patch fixes the loop count in latter based on the struct mem_info. Ideally it would be better to have array size in struct imc_pmu. Fixes: 684d984 ('powerpc/powernv: Add debugfs interface for imc-mode and imc') Reported-by: Qian Cai <cai@lca.pw> Suggested-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20190827101635.6942-1-maddy@linux.vnet.ibm.com Cc: Jan Stancek <jstancek@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent b24e3e3 commit 66252f7

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

arch/powerpc/platforms/powernv/opal-imc.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ static void export_imc_mode_and_cmd(struct device_node *node,
5353
struct imc_pmu *pmu_ptr)
5454
{
5555
static u64 loc, *imc_mode_addr, *imc_cmd_addr;
56-
int chip = 0, nid;
5756
char mode[16], cmd[16];
5857
u32 cb_offset;
58+
struct imc_mem_info *ptr = pmu_ptr->mem_info;
5959

6060
imc_debugfs_parent = debugfs_create_dir("imc", powerpc_debugfs_root);
6161

@@ -69,20 +69,20 @@ static void export_imc_mode_and_cmd(struct device_node *node,
6969
if (of_property_read_u32(node, "cb_offset", &cb_offset))
7070
cb_offset = IMC_CNTL_BLK_OFFSET;
7171

72-
for_each_node(nid) {
73-
loc = (u64)(pmu_ptr->mem_info[chip].vbase) + cb_offset;
72+
while (ptr->vbase != NULL) {
73+
loc = (u64)(ptr->vbase) + cb_offset;
7474
imc_mode_addr = (u64 *)(loc + IMC_CNTL_BLK_MODE_OFFSET);
75-
sprintf(mode, "imc_mode_%d", nid);
75+
sprintf(mode, "imc_mode_%d", (u32)(ptr->id));
7676
if (!imc_debugfs_create_x64(mode, 0600, imc_debugfs_parent,
7777
imc_mode_addr))
7878
goto err;
7979

8080
imc_cmd_addr = (u64 *)(loc + IMC_CNTL_BLK_CMD_OFFSET);
81-
sprintf(cmd, "imc_cmd_%d", nid);
81+
sprintf(cmd, "imc_cmd_%d", (u32)(ptr->id));
8282
if (!imc_debugfs_create_x64(cmd, 0600, imc_debugfs_parent,
8383
imc_cmd_addr))
8484
goto err;
85-
chip++;
85+
ptr++;
8686
}
8787
return;
8888

0 commit comments

Comments
 (0)