On Wed, Sep 03, 2025 at 01:59:13PM +0200, Oleg Nesterov wrote: > Slightly off-topic, but > > On 09/02, Jiri Olsa wrote: > > > > @@ -11144,7 +11147,7 @@ static int perf_uprobe_event_init(struct perf_event *event) > > { > > int err; > > unsigned long ref_ctr_offset; > > - bool is_retprobe; > > + bool is_retprobe, is_unique; > > > > if (event->attr.type != perf_uprobe.type) > > return -ENOENT; > > @@ -11159,8 +11162,9 @@ static int perf_uprobe_event_init(struct perf_event *event) > > return -EOPNOTSUPP; > > > > is_retprobe = event->attr.config & PERF_PROBE_CONFIG_IS_RETPROBE; > > + is_unique = event->attr.config & PERF_PROBE_CONFIG_IS_UNIQUE; > > ref_ctr_offset = event->attr.config >> PERF_UPROBE_REF_CTR_OFFSET_SHIFT; > > - err = perf_uprobe_init(event, ref_ctr_offset, is_retprobe); > > + err = perf_uprobe_init(event, ref_ctr_offset, is_retprobe, is_unique); > > I am wondering why (with or without this change) perf_uprobe_init() needs > the additional arguments besides "event". It can look at event->attr.config > itself? > > Same for perf_kprobe_init()... I think that's because we define enum perf_probe_config together with PMU_FORMAT_ATTRs and code for attr->config parsing, which makes sense to me otherwise I think we could pass perf_event_attr all the way to create_local_trace_[ku]probe jirka