bpf_spin_lock(&glock);
bpf_rbtree_add(&groot, &n->node, less); /* m becomes an owning ref but is never drop'd or added to a tree */
m = bpf_refcount_acquire(n);
bpf_spin_unlock(&glock); if (!m) return 2;
m->key = 2; return 0;
}
SEC("?tc")
__failure __msg("Possibly NULL pointer passed to trusted arg0") long refcount_acquire_maybe_null(void *ctx)
{ struct node_acquire *n, *m;
n = bpf_obj_new(typeof(*n)); /* Intentionally not testing !n * it's MAYBE_NULL for refcount_acquire
*/
m = bpf_refcount_acquire(n); if (m)
bpf_obj_drop(m); if (n)
bpf_obj_drop(n);
SEC("?fentry.s/bpf_testmod_test_read")
__failure __msg("function calls are not allowed while holding a lock") int BPF_PROG(rbtree_fail_sleepable_lock_across_rcu, struct file *file, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf, loff_t off, size_t len)
{ struct node_acquire *n;
n = bpf_obj_new(typeof(*n)); if (!n) return 0;
/* spin_{lock,unlock} are in different RCU CS */
bpf_rcu_read_lock();
bpf_spin_lock(&glock);
bpf_rbtree_add(&groot, &n->node, less);
bpf_rcu_read_unlock();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.