Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
Alexei Starovoitov says: ==================== pull-request: bpf-next 2020-05-14 The following pull-request contains BPF updates for your *net-next* tree. The main changes are: 1) Merged tag 'perf-for-bpf-2020-05-06' from tip tree that includes CAP_PERFMON. 2) support for narrow loads in bpf_sock_addr progs and additional helpers in cg-skb progs, from Andrey. 3) bpf benchmark runner, from Andrii. 4) arm and riscv JIT optimizations, from Luke. 5) bpf iterator infrastructure, from Yonghong. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -273,7 +273,7 @@ out_rcu_unlock:
|
||||
}
|
||||
|
||||
static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
|
||||
bool force_bind_address_no_port, bool with_lock)
|
||||
u32 flags)
|
||||
{
|
||||
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)uaddr;
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
@@ -297,7 +297,7 @@ static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
|
||||
!ns_capable(net->user_ns, CAP_NET_BIND_SERVICE))
|
||||
return -EACCES;
|
||||
|
||||
if (with_lock)
|
||||
if (flags & BIND_WITH_LOCK)
|
||||
lock_sock(sk);
|
||||
|
||||
/* Check these errors (active socket, double bind). */
|
||||
@@ -400,18 +400,20 @@ static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
|
||||
|
||||
/* Make sure we are allowed to bind here. */
|
||||
if (snum || !(inet->bind_address_no_port ||
|
||||
force_bind_address_no_port)) {
|
||||
(flags & BIND_FORCE_ADDRESS_NO_PORT))) {
|
||||
if (sk->sk_prot->get_port(sk, snum)) {
|
||||
sk->sk_ipv6only = saved_ipv6only;
|
||||
inet_reset_saddr(sk);
|
||||
err = -EADDRINUSE;
|
||||
goto out;
|
||||
}
|
||||
err = BPF_CGROUP_RUN_PROG_INET6_POST_BIND(sk);
|
||||
if (err) {
|
||||
sk->sk_ipv6only = saved_ipv6only;
|
||||
inet_reset_saddr(sk);
|
||||
goto out;
|
||||
if (!(flags & BIND_FROM_BPF)) {
|
||||
err = BPF_CGROUP_RUN_PROG_INET6_POST_BIND(sk);
|
||||
if (err) {
|
||||
sk->sk_ipv6only = saved_ipv6only;
|
||||
inet_reset_saddr(sk);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -423,7 +425,7 @@ static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
|
||||
inet->inet_dport = 0;
|
||||
inet->inet_daddr = 0;
|
||||
out:
|
||||
if (with_lock)
|
||||
if (flags & BIND_WITH_LOCK)
|
||||
release_sock(sk);
|
||||
return err;
|
||||
out_unlock:
|
||||
@@ -451,7 +453,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return __inet6_bind(sk, uaddr, addr_len, false, true);
|
||||
return __inet6_bind(sk, uaddr, addr_len, BIND_WITH_LOCK);
|
||||
}
|
||||
EXPORT_SYMBOL(inet6_bind);
|
||||
|
||||
|
@@ -2467,7 +2467,7 @@ void fib6_gc_cleanup(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static int ipv6_route_seq_show(struct seq_file *seq, void *v)
|
||||
static int ipv6_route_native_seq_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct fib6_info *rt = v;
|
||||
struct ipv6_route_iter *iter = seq->private;
|
||||
@@ -2625,7 +2625,7 @@ static bool ipv6_route_iter_active(struct ipv6_route_iter *iter)
|
||||
return w->node && !(w->state == FWS_U && w->node == w->root);
|
||||
}
|
||||
|
||||
static void ipv6_route_seq_stop(struct seq_file *seq, void *v)
|
||||
static void ipv6_route_native_seq_stop(struct seq_file *seq, void *v)
|
||||
__releases(RCU_BH)
|
||||
{
|
||||
struct net *net = seq_file_net(seq);
|
||||
@@ -2637,6 +2637,62 @@ static void ipv6_route_seq_stop(struct seq_file *seq, void *v)
|
||||
rcu_read_unlock_bh();
|
||||
}
|
||||
|
||||
#if IS_BUILTIN(CONFIG_IPV6) && defined(CONFIG_BPF_SYSCALL)
|
||||
static int ipv6_route_prog_seq_show(struct bpf_prog *prog,
|
||||
struct bpf_iter_meta *meta,
|
||||
void *v)
|
||||
{
|
||||
struct bpf_iter__ipv6_route ctx;
|
||||
|
||||
ctx.meta = meta;
|
||||
ctx.rt = v;
|
||||
return bpf_iter_run_prog(prog, &ctx);
|
||||
}
|
||||
|
||||
static int ipv6_route_seq_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct ipv6_route_iter *iter = seq->private;
|
||||
struct bpf_iter_meta meta;
|
||||
struct bpf_prog *prog;
|
||||
int ret;
|
||||
|
||||
meta.seq = seq;
|
||||
prog = bpf_iter_get_info(&meta, false);
|
||||
if (!prog)
|
||||
return ipv6_route_native_seq_show(seq, v);
|
||||
|
||||
ret = ipv6_route_prog_seq_show(prog, &meta, v);
|
||||
iter->w.leaf = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ipv6_route_seq_stop(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct bpf_iter_meta meta;
|
||||
struct bpf_prog *prog;
|
||||
|
||||
if (!v) {
|
||||
meta.seq = seq;
|
||||
prog = bpf_iter_get_info(&meta, true);
|
||||
if (prog)
|
||||
(void)ipv6_route_prog_seq_show(prog, &meta, v);
|
||||
}
|
||||
|
||||
ipv6_route_native_seq_stop(seq, v);
|
||||
}
|
||||
#else
|
||||
static int ipv6_route_seq_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
return ipv6_route_native_seq_show(seq, v);
|
||||
}
|
||||
|
||||
static void ipv6_route_seq_stop(struct seq_file *seq, void *v)
|
||||
{
|
||||
ipv6_route_native_seq_stop(seq, v);
|
||||
}
|
||||
#endif
|
||||
|
||||
const struct seq_operations ipv6_route_seq_ops = {
|
||||
.start = ipv6_route_seq_start,
|
||||
.next = ipv6_route_seq_next,
|
||||
|
@@ -6421,6 +6421,35 @@ void __init ip6_route_init_special_entries(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
#if IS_BUILTIN(CONFIG_IPV6)
|
||||
#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
|
||||
DEFINE_BPF_ITER_FUNC(ipv6_route, struct bpf_iter_meta *meta, struct fib6_info *rt)
|
||||
|
||||
static const struct bpf_iter_reg ipv6_route_reg_info = {
|
||||
.target = "ipv6_route",
|
||||
.seq_ops = &ipv6_route_seq_ops,
|
||||
.init_seq_private = bpf_iter_init_seq_net,
|
||||
.fini_seq_private = bpf_iter_fini_seq_net,
|
||||
.seq_priv_size = sizeof(struct ipv6_route_iter),
|
||||
.ctx_arg_info_size = 1,
|
||||
.ctx_arg_info = {
|
||||
{ offsetof(struct bpf_iter__ipv6_route, rt),
|
||||
PTR_TO_BTF_ID_OR_NULL },
|
||||
},
|
||||
};
|
||||
|
||||
static int __init bpf_iter_register(void)
|
||||
{
|
||||
return bpf_iter_reg_target(&ipv6_route_reg_info);
|
||||
}
|
||||
|
||||
static void bpf_iter_unregister(void)
|
||||
{
|
||||
bpf_iter_unreg_target(&ipv6_route_reg_info);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int __init ip6_route_init(void)
|
||||
{
|
||||
int ret;
|
||||
@@ -6483,6 +6512,14 @@ int __init ip6_route_init(void)
|
||||
if (ret)
|
||||
goto out_register_late_subsys;
|
||||
|
||||
#if IS_BUILTIN(CONFIG_IPV6)
|
||||
#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
|
||||
ret = bpf_iter_register();
|
||||
if (ret)
|
||||
goto out_register_late_subsys;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu);
|
||||
|
||||
@@ -6515,6 +6552,11 @@ out_kmem_cache:
|
||||
|
||||
void ip6_route_cleanup(void)
|
||||
{
|
||||
#if IS_BUILTIN(CONFIG_IPV6)
|
||||
#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
|
||||
bpf_iter_unregister();
|
||||
#endif
|
||||
#endif
|
||||
unregister_netdevice_notifier(&ip6_route_dev_notifier);
|
||||
unregister_pernet_subsys(&ip6_route_net_late_ops);
|
||||
fib6_rules_cleanup();
|
||||
|
Reference in New Issue
Block a user