Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.17-rc2 158 lines 3.1 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */ 3 4#include <vmlinux.h> 5#include <bpf/bpf_tracing.h> 6#include <bpf/bpf_helpers.h> 7#include <bpf/bpf_core_read.h> 8#include "bpf_experimental.h" 9#include "bpf_misc.h" 10 11char _license[] SEC("license") = "GPL"; 12 13char value[16]; 14 15static __always_inline void read_xattr(struct cgroup *cgroup) 16{ 17 struct bpf_dynptr value_ptr; 18 19 bpf_dynptr_from_mem(value, sizeof(value), 0, &value_ptr); 20 bpf_cgroup_read_xattr(cgroup, "user.bpf_test", 21 &value_ptr); 22} 23 24SEC("lsm.s/socket_connect") 25__success 26int BPF_PROG(trusted_cgroup_ptr_sleepable) 27{ 28 u64 cgrp_id = bpf_get_current_cgroup_id(); 29 struct cgroup *cgrp; 30 31 cgrp = bpf_cgroup_from_id(cgrp_id); 32 if (!cgrp) 33 return 0; 34 35 read_xattr(cgrp); 36 bpf_cgroup_release(cgrp); 37 return 0; 38} 39 40SEC("lsm/socket_connect") 41__success 42int BPF_PROG(trusted_cgroup_ptr_non_sleepable) 43{ 44 u64 cgrp_id = bpf_get_current_cgroup_id(); 45 struct cgroup *cgrp; 46 47 cgrp = bpf_cgroup_from_id(cgrp_id); 48 if (!cgrp) 49 return 0; 50 51 read_xattr(cgrp); 52 bpf_cgroup_release(cgrp); 53 return 0; 54} 55 56SEC("lsm/socket_connect") 57__success 58int BPF_PROG(use_css_iter_non_sleepable) 59{ 60 u64 cgrp_id = bpf_get_current_cgroup_id(); 61 struct cgroup_subsys_state *css; 62 struct cgroup *cgrp; 63 64 cgrp = bpf_cgroup_from_id(cgrp_id); 65 if (!cgrp) 66 return 0; 67 68 bpf_for_each(css, css, &cgrp->self, BPF_CGROUP_ITER_ANCESTORS_UP) 69 read_xattr(css->cgroup); 70 71 bpf_cgroup_release(cgrp); 72 return 0; 73} 74 75SEC("lsm.s/socket_connect") 76__failure __msg("expected an RCU CS") 77int BPF_PROG(use_css_iter_sleepable_missing_rcu_lock) 78{ 79 u64 cgrp_id = bpf_get_current_cgroup_id(); 80 struct cgroup_subsys_state *css; 81 struct cgroup *cgrp; 82 83 cgrp = bpf_cgroup_from_id(cgrp_id); 84 if (!cgrp) 85 return 0; 86 87 bpf_for_each(css, css, &cgrp->self, BPF_CGROUP_ITER_ANCESTORS_UP) 88 read_xattr(css->cgroup); 89 90 bpf_cgroup_release(cgrp); 91 return 0; 92} 93 94SEC("lsm.s/socket_connect") 95__success 96int BPF_PROG(use_css_iter_sleepable_with_rcu_lock) 97{ 98 u64 cgrp_id = bpf_get_current_cgroup_id(); 99 struct cgroup_subsys_state *css; 100 struct cgroup *cgrp; 101 102 bpf_rcu_read_lock(); 103 cgrp = bpf_cgroup_from_id(cgrp_id); 104 if (!cgrp) 105 goto out; 106 107 bpf_for_each(css, css, &cgrp->self, BPF_CGROUP_ITER_ANCESTORS_UP) 108 read_xattr(css->cgroup); 109 110 bpf_cgroup_release(cgrp); 111out: 112 bpf_rcu_read_unlock(); 113 return 0; 114} 115 116SEC("lsm/socket_connect") 117__success 118int BPF_PROG(use_bpf_cgroup_ancestor) 119{ 120 u64 cgrp_id = bpf_get_current_cgroup_id(); 121 struct cgroup *cgrp, *ancestor; 122 123 cgrp = bpf_cgroup_from_id(cgrp_id); 124 if (!cgrp) 125 return 0; 126 127 ancestor = bpf_cgroup_ancestor(cgrp, 1); 128 if (!ancestor) 129 goto out; 130 131 read_xattr(cgrp); 132 bpf_cgroup_release(ancestor); 133out: 134 bpf_cgroup_release(cgrp); 135 return 0; 136} 137 138SEC("cgroup/sendmsg4") 139__success 140int BPF_PROG(cgroup_skb) 141{ 142 u64 cgrp_id = bpf_get_current_cgroup_id(); 143 struct cgroup *cgrp, *ancestor; 144 145 cgrp = bpf_cgroup_from_id(cgrp_id); 146 if (!cgrp) 147 return 0; 148 149 ancestor = bpf_cgroup_ancestor(cgrp, 1); 150 if (!ancestor) 151 goto out; 152 153 read_xattr(cgrp); 154 bpf_cgroup_release(ancestor); 155out: 156 bpf_cgroup_release(cgrp); 157 return 0; 158}