• Heiko Carstens's avatar
    s390/pageattr: handle numpages parameter correctly · 4d81aaa5
    Heiko Carstens authored
    Both set_memory_ro() and set_memory_rw() will modify the page
    attributes of at least one page, even if the numpages parameter is
    zero.
    
    The author expected that calling these functions with numpages == zero
    would never happen. However with the new 444d13ff ("modules: add
    ro_after_init support") feature this happens frequently.
    
    Therefore do the right thing and make these two functions return
    gracefully if nothing should be done.
    
    Fixes crashes on module load like this one:
    
    Unable to handle kernel pointer dereference in virtual kernel address space
    Failing address: 000003ff80008000 TEID: 000003ff80008407
    Fault in home space mode while using kernel ASCE.
    AS:0000000000d18007 R3:00000001e6aa4007 S:00000001e6a10800 P:00000001e34ee21d
    Oops: 0004 ilc:3 [#1] SMP
    Modules linked in: x_tables
    CPU: 10 PID: 1 Comm: systemd Not tainted 4.7.0-11895-g3fa9045 #4
    Hardware name: IBM              2964 N96              703              (LPAR)
    task: 00000001e9118000 task.stack: 00000001e9120000
    Krnl PSW : 0704e00180000000 00000000005677f8 (rb_erase+0xf0/0x4d0)
               R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:0 AS:3 CC:2 PM:0 RI:0 EA:3
    Krnl GPRS: 000003ff80008b20 000003ff80008b20 000003ff80008b70 0000000000b9d608
               000003ff80008b20 0000000000000000 00000001e9123e88 000003ff80008950
               00000001e485ab40 000003ff00000000 000003ff80008b00 00000001e4858480
               0000000100000000 000003ff80008b68 00000000001d5998 00000001e9123c28
    Krnl Code: 00000000005677e8: ec1801c3007c        cgij    %r1,0,8,567b6e
               00000000005677ee: e32010100020        cg      %r2,16(%r1)
              #00000000005677f4: a78401c2            brc     8,567b78
              >00000000005677f8: e35010080024        stg     %r5,8(%r1)
               00000000005677fe: ec5801af007c        cgij    %r5,0,8,567b5c
               0000000000567804: e30050000024        stg     %r0,0(%r5)
               000000000056780a: ebacf0680004        lmg     %r10,%r12,104(%r15)
               0000000000567810: 07fe                bcr     15,%r14
    Call Trace:
    ([<000003ff80008900>] __this_module+0x0/0xffffffffffffd700 [x_tables])
    ([<0000000000264fd4>] do_init_module+0x12c/0x220)
    ([<00000000001da14a>] load_module+0x24e2/0x2b10)
    ([<00000000001da976>] SyS_finit_module+0xbe/0xd8)
    ([<0000000000803b26>] system_call+0xd6/0x264)
    Last Breaking-Event-Address:
     [<000000000056771a>] rb_erase+0x12/0x4d0
     Kernel panic - not syncing: Fatal exception: panic_on_oops
    Reported-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
    Reported-and-tested-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
    Fixes: e8a97e42 ("s390/pageattr: allow kernel page table splitting")
    Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    4d81aaa5
pageattr.c 8.08 KB