diff options
| -rw-r--r-- | include/linux/uprobes.h | 1 | ||||
| -rw-r--r-- | kernel/events/uprobes.c | 29 | 
2 files changed, 9 insertions, 21 deletions
| diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h index e6f0331e3d45..18d839da6517 100644 --- a/include/linux/uprobes.h +++ b/include/linux/uprobes.h @@ -59,7 +59,6 @@ struct uprobe_consumer {  #ifdef CONFIG_UPROBES  enum uprobe_task_state {  	UTASK_RUNNING, -	UTASK_BP_HIT,  	UTASK_SSTEP,  	UTASK_SSTEP_ACK,  	UTASK_SSTEP_TRAPPED, diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index d2392968d4e6..d3f5381e7482 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -1469,10 +1469,6 @@ static void handle_swbp(struct pt_regs *regs)  	bp_vaddr = uprobe_get_swbp_addr(regs);  	uprobe = find_active_uprobe(bp_vaddr, &is_swbp); -	utask = current->utask; -	if (utask) -		utask->state = UTASK_RUNNING; -  	if (!uprobe) {  		if (is_swbp > 0) {  			/* No matching uprobe; signal SIGTRAP. */ @@ -1491,6 +1487,7 @@ static void handle_swbp(struct pt_regs *regs)  		return;  	} +	utask = current->utask;  	if (!utask) {  		utask = add_utask();  		/* Cannot allocate; re-execute the instruction. */ @@ -1547,13 +1544,12 @@ static void handle_singlestep(struct uprobe_task *utask, struct pt_regs *regs)  }  /* - * On breakpoint hit, breakpoint notifier sets the TIF_UPROBE flag.  (and on - * subsequent probe hits on the thread sets the state to UTASK_BP_HIT) and - * allows the thread to return from interrupt. + * On breakpoint hit, breakpoint notifier sets the TIF_UPROBE flag and + * allows the thread to return from interrupt. After that handle_swbp() + * sets utask->active_uprobe.   * - * On singlestep exception, singlestep notifier sets the TIF_UPROBE flag and - * also sets the state to UTASK_SSTEP_ACK and allows the thread to return from - * interrupt. + * On singlestep exception, singlestep notifier sets the TIF_UPROBE flag + * and allows the thread to return from interrupt.   *   * While returning to userspace, thread notices the TIF_UPROBE flag and calls   * uprobe_notify_resume(). @@ -1563,10 +1559,10 @@ void uprobe_notify_resume(struct pt_regs *regs)  	struct uprobe_task *utask;  	utask = current->utask; -	if (!utask || utask->state == UTASK_BP_HIT) -		handle_swbp(regs); -	else +	if (utask && utask->active_uprobe)  		handle_singlestep(utask, regs); +	else +		handle_swbp(regs);  }  /* @@ -1575,17 +1571,10 @@ void uprobe_notify_resume(struct pt_regs *regs)   */  int uprobe_pre_sstep_notifier(struct pt_regs *regs)  { -	struct uprobe_task *utask; -  	if (!current->mm || !test_bit(MMF_HAS_UPROBES, ¤t->mm->flags))  		return 0; -	utask = current->utask; -	if (utask) -		utask->state = UTASK_BP_HIT; -  	set_thread_flag(TIF_UPROBE); -  	return 1;  } | 
