• Thomas Richter's avatar
    perf record: Fix module size on s390 · 12a6d294
    Thomas Richter authored
    On s390 the modules loaded in memory have the text segment located after
    the GOT and Relocation table. This can be seen with this output:
    
      [root@m35lp76 perf]# fgrep qeth /proc/modules
      qeth 151552 1 qeth_l2, Live 0x000003ff800b2000
      ...
      [root@m35lp76 perf]# cat /sys/module/qeth/sections/.text
      0x000003ff800b3990
      [root@m35lp76 perf]#
    
    There is an offset of 0x1990 bytes. The size of the qeth module is
    151552 bytes (0x25000 in hex).
    
    The location of the GOT/relocation table at the beginning of a module is
    unique to s390.
    
    commit 203d8a4a ("perf s390: Fix 'start' address of module's map")
    adjusts the start address of a module in the map structures, but does
    not adjust the size of the modules. This leads to overlapping of module
    maps as this example shows:
    
    [root@m35lp76 perf] # ./perf report -D
         0 0 0xfb0 [0xa0]: PERF_RECORD_MMAP -1/0: [0x3ff800b3990(0x25000)
              @ 0]:  x /lib/modules/.../qeth.ko.xz
         0 0 0x1050 [0xb0]: PERF_RECORD_MMAP -1/0: [0x3ff800d85a0(0x8000)
              @ 0]:  x /lib/modules/.../ip6_tables.ko.xz
    
    The module qeth.ko has an adjusted start address modified to b3990, but
    its size is unchanged and the module ends at 0x3ff800d8990.  This end
    address overlaps with the next modules start address of 0x3ff800d85a0.
    
    When the size of the leading GOT/Relocation table stored in the
    beginning of the text segment (0x1990 bytes) is subtracted from module
    qeth end address, there are no overlaps anymore:
    
       0x3ff800d8990 - 0x1990 = 0x0x3ff800d7000
    
    which is the same as
    
       0x3ff800b2000 + 0x25000 = 0x0x3ff800d7000.
    
    To fix this issue, also adjust the modules size in function
    arch__fix_module_text_start(). Add another function parameter named size
    and reduce the size of the module when the text segment start address is
    changed.
    
    Output after:
         0 0 0xfb0 [0xa0]: PERF_RECORD_MMAP -1/0: [0x3ff800b3990(0x23670)
              @ 0]:  x /lib/modules/.../qeth.ko.xz
         0 0 0x1050 [0xb0]: PERF_RECORD_MMAP -1/0: [0x3ff800d85a0(0x7a60)
              @ 0]:  x /lib/modules/.../ip6_tables.ko.xz
    Reported-by: default avatarStefan Liebler <stli@linux.ibm.com>
    Signed-off-by: default avatarThomas Richter <tmricht@linux.ibm.com>
    Acked-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
    Cc: Hendrik Brueckner <brueckner@linux.ibm.com>
    Cc: Vasily Gorbik <gor@linux.ibm.com>
    Cc: stable@vger.kernel.org
    Fixes: 203d8a4a ("perf s390: Fix 'start' address of module's map")
    Link: http://lkml.kernel.org/r/20190724122703.3996-1-tmricht@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    12a6d294
machine.h 9.46 KB