On Thu, Sep 12, 2024 at 06:35:39PM +0200, Oleg Nesterov wrote: > On 09/09, Jiri Olsa wrote: > > > > handle_uretprobe_chain(struct return_instance *ri, struct pt_regs *regs) > > { > > + struct return_consumer *ric = NULL; > > struct uprobe *uprobe = ri->uprobe; > > struct uprobe_consumer *uc; > > - int srcu_idx; > > + int srcu_idx, iter = 0; > > > > srcu_idx = srcu_read_lock(&uprobes_srcu); > > 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 jirka > > Oleg. >