• Vasily Gorbik's avatar
    s390/kprobes: fix current_kprobe never cleared after kprobes reenter · cd579539
    Vasily Gorbik authored
    Recent test_kprobe_missed kprobes kunit test uncovers the following
    problem. Once kprobe is triggered from another kprobe (kprobe reenter),
    all future kprobes on this cpu are considered as kprobe reenter, thus
    pre_handler and post_handler are not being called and kprobes are counted
    as "missed".
    
    Commit b9599798 ("[S390] kprobes: activation and deactivation")
    introduced a simpler scheme for kprobes (de)activation and status
    tracking by using push_kprobe/pop_kprobe, which supposed to work for
    both initial kprobe entry as well as kprobe reentry and helps to avoid
    handling those two cases differently. The problem is that a sequence of
    calls in case of kprobes reenter:
    push_kprobe() <- NULL (current_kprobe)
    push_kprobe() <- kprobe1 (current_kprobe)
    pop_kprobe() -> kprobe1 (current_kprobe)
    pop_kprobe() -> kprobe1 (current_kprobe)
    leaves "kprobe1" as "current_kprobe" on this cpu, instead of setting it
    to NULL. In fact push_kprobe/pop_kprobe can only store a single state
    (there is just one prev_kprobe in kprobe_ctlblk). Which is a hack but
    sufficient, there is no need to have another prev_kprobe just to store
    NULL. To make a simple and backportable fix simply reset "prev_kprobe"
    when kprobe is poped from this "stack". No need to worry about
    "kprobe_status" in this case, because its value is only checked when
    current_kprobe != NULL.
    
    Cc: stable@vger.kernel.org
    Fixes: b9599798 ("[S390] kprobes: activation and deactivation")
    Reviewed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    cd579539
kprobes.c 13.5 KB