• Madhavan Srinivasan's avatar
    powerpc/imc: Dont create debugfs files for cpu-less nodes · 41ba17f2
    Madhavan Srinivasan authored
    Commit <684d9840> ('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: 684d9840 ('powerpc/powernv: Add debugfs interface for imc-mode and imc')
    Reported-by: default avatarQian Cai <cai@lca.pw>
    Suggested-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: default avatarMadhavan Srinivasan <maddy@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20190827101635.6942-1-maddy@linux.vnet.ibm.com
    41ba17f2
opal-imc.c 7.98 KB