Messages in this thread | | | Date | Tue, 7 Aug 2018 11:10:08 +0200 | From | Oleg Nesterov <> | Subject | Re: [PATCH 3/2] perf/hw_breakpoint: Remove superfluous bp->attr.disabled = 0 new attr has disabled set |
| |
On 08/07, Jiri Olsa wrote: > > On Mon, Aug 06, 2018 at 06:34:36PM +0200, Oleg Nesterov wrote: > > > --- a/kernel/events/hw_breakpoint.c > > > +++ b/kernel/events/hw_breakpoint.c > > > @@ -526,10 +526,9 @@ int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *att > > > if (err) > > > return err; > > > > > > - if (!attr->disabled) { > > > + if (!attr->disabled) > > > perf_event_enable(bp); > > > - bp->attr.disabled = 0; > > > - } > > > + > > > > Yes, but again, this still looks confusing. > > > > IMO, we should either remove "bp->attr.disabled = attr->disabled" in > > modify_user_hw_breakpoint_check() because bp->attr.disabled is not really > > used, or we should set bp->attr.disabled = 1 on failure just for consistency. > > > > > > Hmm... actually ptrace_get_dr7() checks ->attr.disabled, so we can hit > > WARN_ON(second_pass) in ptrace_write_dr7() in case when attr.disabled is > > falsely 0 because modify_user_hw_breakpoint_check() failed before? > > hum, I can't see how modify_user_hw_breakpoint_check could falsely set disabled > new attr stuff is copied once all checks passed
Hmm. So modify_user_hw_breakpoint() does perf_event_disable(bp) first and afaics this doesn't set bp->attr.disabled = 1.
If modify_user_hw_breakpoint_check() fails after that we do not update bp->attr, so bp->attr.disabled is still zero while this bp is actually disabled.
Again, afaics the core perf code doesn't actually use bp->attr.disabled after perf_event__state_init(). But this can confuse ptrace_write_dr7/ptrace_get_dr7.
No?
I am on Linus's tree, but I see the same logic in https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git/tree/kernel/events/hw_breakpoint.c?h=perf/core
Oleg.
| |