Re: [PATCHv3 1/7] uprobe: Add support for session consumer
From: Jiri Olsa <hidden>
Date: 2024-09-13 08:36:12
Also in:
bpf, lkml
On Thu, Sep 12, 2024 at 06:35:39PM +0200, Oleg Nesterov wrote:
On 09/09, Jiri Olsa wrote:quoted
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.