SNIP On Thu, Nov 9, 2017 at 5:12 AM, Jiri Olsa <jolsa@xxxxxxxxxx> wrote: > > > how about something like below (untested) > > looks like there's no irq caller for modify_user_hw_breakpoint, > so we should be fine with locking nr_bp_mutex > > jirka > > > --- > diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c > index 3f8cb1e14588..f062b68399ea 100644 > --- a/kernel/events/hw_breakpoint.c > +++ b/kernel/events/hw_breakpoint.c > @@ -448,6 +448,8 @@ int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *att > else > perf_event_disable(bp); > > + release_bp_slot(bp); > + > bp->attr.bp_addr = attr->bp_addr; > bp->attr.bp_type = attr->bp_type; > bp->attr.bp_len = attr->bp_len; > @@ -455,9 +457,9 @@ int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *att > if (attr->disabled) > goto end; > > - err = validate_hw_breakpoint(bp); > + err = reserve_bp_slot(bp); > if (!err) > - perf_event_enable(bp); > + err = validate_hw_breakpoint(bp); > > if (err) { > bp->attr.bp_addr = old_addr; > @@ -469,6 +471,7 @@ int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *att > return err; > } > > + perf_event_enable(bp); > end: > bp->attr.disabled = attr->disabled; > We can do this accounting only if bp->attr.bp_type != attr->bp_type. -Milind -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html