Commit a8e11e5c authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

sysctl: define proc_do_static_key()



Convert proc_dointvec_minmax_bpf_stats() into a more generic
helper, since we are going to use jump labels more often.

Note that sysctl_bpf_stats_enabled is removed, since
it is no longer needed/used.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9a33629b
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -600,7 +600,6 @@ void bpf_map_area_free(void *base);
void bpf_map_init_from_attr(struct bpf_map *map, union bpf_attr *attr);

extern int sysctl_unprivileged_bpf_disabled;
extern int sysctl_bpf_stats_enabled;

int bpf_map_new_fd(struct bpf_map *map, int flags);
int bpf_prog_new_fd(struct bpf_prog *prog);
+3 −0
Original line number Diff line number Diff line
@@ -63,6 +63,9 @@ extern int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int,
				      void __user *, size_t *, loff_t *);
extern int proc_do_large_bitmap(struct ctl_table *, int,
				void __user *, size_t *, loff_t *);
extern int proc_do_static_key(struct ctl_table *table, int write,
			      void __user *buffer, size_t *lenp,
			      loff_t *ppos);

/*
 * Register a set of sysctl names by calling register_sysctl_table
+0 −1
Original line number Diff line number Diff line
@@ -2097,7 +2097,6 @@ int __weak skb_copy_bits(const struct sk_buff *skb, int offset, void *to,

DEFINE_STATIC_KEY_FALSE(bpf_stats_enabled_key);
EXPORT_SYMBOL(bpf_stats_enabled_key);
int sysctl_bpf_stats_enabled __read_mostly;

/* All definitions of tracepoints related to BPF. */
#define CREATE_TRACE_POINTS
+23 −21
Original line number Diff line number Diff line
@@ -230,11 +230,6 @@ static int proc_dostring_coredump(struct ctl_table *table, int write,
#endif
static int proc_dopipe_max_size(struct ctl_table *table, int write,
		void __user *buffer, size_t *lenp, loff_t *ppos);
#ifdef CONFIG_BPF_SYSCALL
static int proc_dointvec_minmax_bpf_stats(struct ctl_table *table, int write,
					  void __user *buffer, size_t *lenp,
					  loff_t *ppos);
#endif

#ifdef CONFIG_MAGIC_SYSRQ
/* Note: sysrq code uses its own private copy */
@@ -1253,12 +1248,10 @@ static struct ctl_table kern_table[] = {
	},
	{
		.procname	= "bpf_stats_enabled",
		.data		= &sysctl_bpf_stats_enabled,
		.maxlen		= sizeof(sysctl_bpf_stats_enabled),
		.data		= &bpf_stats_enabled_key.key,
		.maxlen		= sizeof(bpf_stats_enabled_key),
		.mode		= 0644,
		.proc_handler	= proc_dointvec_minmax_bpf_stats,
		.extra1		= &zero,
		.extra2		= &one,
		.proc_handler	= proc_do_static_key,
	},
#endif
#if defined(CONFIG_TREE_RCU) || defined(CONFIG_PREEMPT_RCU)
@@ -3374,26 +3367,35 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,

#endif /* CONFIG_PROC_SYSCTL */

#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_SYSCTL)
static int proc_dointvec_minmax_bpf_stats(struct ctl_table *table, int write,
#if defined(CONFIG_SYSCTL)
int proc_do_static_key(struct ctl_table *table, int write,
		       void __user *buffer, size_t *lenp,
		       loff_t *ppos)
{
	int ret, bpf_stats = *(int *)table->data;
	struct ctl_table tmp = *table;
	struct static_key *key = (struct static_key *)table->data;
	static DEFINE_MUTEX(static_key_mutex);
	int val, ret;
	struct ctl_table tmp = {
		.data   = &val,
		.maxlen = sizeof(val),
		.mode   = table->mode,
		.extra1 = &zero,
		.extra2 = &one,
	};

	if (write && !capable(CAP_SYS_ADMIN))
		return -EPERM;

	tmp.data = &bpf_stats;
	mutex_lock(&static_key_mutex);
	val = static_key_enabled(key);
	ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
	if (write && !ret) {
		*(int *)table->data = bpf_stats;
		if (bpf_stats)
			static_branch_enable(&bpf_stats_enabled_key);
		if (val)
			static_key_enable(key);
		else
			static_branch_disable(&bpf_stats_enabled_key);
			static_key_disable(key);
	}
	mutex_unlock(&static_key_mutex);
	return ret;
}
#endif