On 09/13, Jiri Olsa wrote: > > On Thu, Sep 12, 2024 at 06:35:39PM +0200, Oleg Nesterov wrote: > > > list_for_each_entry_srcu(uc, &uprobe->consumers, cons_node, > > > srcu_read_lock_held(&uprobes_srcu)) { > > > + /* > > > + * If we don't find return consumer, it means uprobe consumer > > > + * was added after we hit uprobe and return consumer did not > > > + * get registered in which case we call the ret_handler only > > > + * if it's not session consumer. > > > + */ > > > + ric = return_consumer_find(ri, &iter, uc->id); > > > + if (!ric && uc->session) > > > + continue; > > > if (uc->ret_handler) > > > - uc->ret_handler(uc, ri->func, regs); > > > + uc->ret_handler(uc, ri->func, regs, ric ? &ric->cookie : NULL); > > > > So why do we need the new uc->session member and the uc->session above ? > > > > If return_consumer_find() returns NULL, uc->ret_handler(..., NULL) can handle > > this case itself? > > I tried to explain that in the comment above.. we do not want to > execute session ret_handler at all in this case, because its entry > counterpart did not run I understand, but the session ret_handler(..., __u64 *data) can simply do // my ->handler() didn't run or it didn't return 0 if (!data) return; at the start? Oleg.