hprobe
struct hprobe hprobe;
(void)hprobe_consume(&ri->hprobe, &hstate);
hprobe_finalize(&ri->hprobe, hstate);
hprobe_expire(&ri->hprobe, false);
uprobe = hprobe_expire(&o->hprobe, true);
hprobe_init_stable(&n->hprobe, uprobe);
hprobe_init_leased(&ri->hprobe, uprobe, srcu_idx);
uprobe = hprobe_consume(&ri->hprobe, &hstate);
hprobe_finalize(&ri->hprobe, hstate);
static void hprobe_init_leased(struct hprobe *hprobe, struct uprobe *uprobe, int srcu_idx)
hprobe->state = HPROBE_LEASED;
hprobe->uprobe = uprobe;
hprobe->srcu_idx = srcu_idx;
static void hprobe_init_stable(struct hprobe *hprobe, struct uprobe *uprobe)
hprobe->state = uprobe ? HPROBE_STABLE : HPROBE_GONE;
hprobe->uprobe = uprobe;
hprobe->srcu_idx = -1;
static inline struct uprobe *hprobe_consume(struct hprobe *hprobe, enum hprobe_state *hstate)
*hstate = xchg(&hprobe->state, HPROBE_CONSUMED);
return hprobe->uprobe;
static void hprobe_finalize(struct hprobe *hprobe, enum hprobe_state hstate)
__srcu_read_unlock(&uretprobes_srcu, hprobe->srcu_idx);
put_uprobe(hprobe->uprobe);
static struct uprobe *hprobe_expire(struct hprobe *hprobe, bool get)
hstate = READ_ONCE(hprobe->state);
return get ? get_uprobe(hprobe->uprobe) : hprobe->uprobe;
struct uprobe *uprobe = try_get_uprobe(hprobe->uprobe);
if (try_cmpxchg(&hprobe->state, &hstate, uprobe ? HPROBE_STABLE : HPROBE_GONE)) {
__srcu_read_unlock(&uretprobes_srcu, hprobe->srcu_idx);