On Fri, Sep 13, 2024 at 11:32:01AM +0200, Oleg Nesterov wrote: > 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? I see, that's actualy the only usage of the 'session' flag, so we could get rid of it and we'd do above check in uprobe_multi layer.. good idea thanks, jirka