Commit 115506fe authored by David S. Miller's avatar David S. Miller
Browse files


Alexei Starovoitov says:

====================
pull-request: bpf-next 2020-05-01 (v2)

The following pull-request contains BPF updates for your *net-next* tree.

We've added 61 non-merge commits during the last 6 day(s) which contain
a total of 153 files changed, 6739 insertions(+), 3367 deletions(-).

The main changes are:

1) pulled work.sysctl from vfs tree with sysctl bpf changes.

2) bpf_link observability, from Andrii.

3) BTF-defined map in map, from Andrii.

4) asan fixes for selftests, from Andrii.

5) Allow bpf_map_lookup_elem for SOCKMAP and SOCKHASH, from Jakub.

6) production cloudflare classifier as a selftes, from Lorenz.

7) bpf_ktime_get_*_ns() helper improvements, from Maciej.

8) unprivileged bpftool feature probe, from Quentin.

9) BPF_ENABLE_STATS command, from Song.

10) enable bpf_[gs]etsockopt() helpers for sock_ops progs, from Stanislav.

11) enable a bunch of common helpers for cg-device, sysctl, sockopt progs,
 from Stanislav.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 5b95dea3 57dc6f3b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -203,7 +203,7 @@ static void __init register_insn_emulation(struct insn_emulation_ops *ops)
}

static int emulation_proc_handler(struct ctl_table *table, int write,
				  void __user *buffer, size_t *lenp,
				  void *buffer, size_t *lenp,
				  loff_t *ppos)
{
	int ret = 0;
+1 −2
Original line number Diff line number Diff line
@@ -341,8 +341,7 @@ static unsigned int find_supported_vector_length(unsigned int vl)
#ifdef CONFIG_SYSCTL

static int sve_proc_do_default_vl(struct ctl_table *table, int write,
				  void __user *buffer, size_t *lenp,
				  loff_t *ppos)
				  void *buffer, size_t *lenp, loff_t *ppos)
{
	int ret;
	int vl = sve_default_vl;
+5 −8
Original line number Diff line number Diff line
@@ -95,16 +95,15 @@ int proc_lasat_ip(struct ctl_table *table, int write,
		len = 0;
		p = buffer;
		while (len < *lenp) {
			if (get_user(c, p++))
				return -EFAULT;
			c = *p;
			p++;
			if (c == 0 || c == '\n')
				break;
			len++;
		}
		if (len >= sizeof(ipbuf)-1)
			len = sizeof(ipbuf) - 1;
		if (copy_from_user(ipbuf, buffer, len))
			return -EFAULT;
		memcpy(ipbuf, buffer, len);
		ipbuf[len] = 0;
		*ppos += *lenp;
		/* Now see if we can convert it to a valid IP */
@@ -122,11 +121,9 @@ int proc_lasat_ip(struct ctl_table *table, int write,
		if (len > *lenp)
			len = *lenp;
		if (len)
			if (copy_to_user(buffer, ipbuf, len))
				return -EFAULT;
			memcpy(buffer, ipbuf, len);
		if (len < *lenp) {
			if (put_user('\n', ((char *) buffer) + len))
				return -EFAULT;
			*((char *)buffer + len) = '\n';
			len++;
		}
		*lenp = len;
+68 −35
Original line number Diff line number Diff line
@@ -13,8 +13,35 @@
#include <linux/filter.h>
#include "bpf_jit.h"

/*
 * Stack layout during BPF program execution:
 *
 *                     high
 *     RV32 fp =>  +----------+
 *                 | saved ra |
 *                 | saved fp | RV32 callee-saved registers
 *                 |   ...    |
 *                 +----------+ <= (fp - 4 * NR_SAVED_REGISTERS)
 *                 |  hi(R6)  |
 *                 |  lo(R6)  |
 *                 |  hi(R7)  | JIT scratch space for BPF registers
 *                 |  lo(R7)  |
 *                 |   ...    |
 *  BPF_REG_FP =>  +----------+ <= (fp - 4 * NR_SAVED_REGISTERS
 *                 |          |        - 4 * BPF_JIT_SCRATCH_REGS)
 *                 |          |
 *                 |   ...    | BPF program stack
 *                 |          |
 *     RV32 sp =>  +----------+
 *                 |          |
 *                 |   ...    | Function call stack
 *                 |          |
 *                 +----------+
 *                     low
 */

enum {
	/* Stack layout - these are offsets from (top of stack - 4). */
	/* Stack layout - these are offsets from top of JIT scratch space. */
	BPF_R6_HI,
	BPF_R6_LO,
	BPF_R7_HI,
@@ -29,7 +56,11 @@ enum {
	BPF_JIT_SCRATCH_REGS,
};

#define STACK_OFFSET(k) (-4 - ((k) * 4))
/* Number of callee-saved registers stored to stack: ra, fp, s1--s7. */
#define NR_SAVED_REGISTERS	9

/* Offset from fp for BPF registers stored on stack. */
#define STACK_OFFSET(k)	(-4 - (4 * NR_SAVED_REGISTERS) - (4 * (k)))

#define TMP_REG_1	(MAX_BPF_JIT_REG + 0)
#define TMP_REG_2	(MAX_BPF_JIT_REG + 1)
@@ -111,11 +142,9 @@ static void emit_imm64(const s8 *rd, s32 imm_hi, s32 imm_lo,

static void __build_epilogue(bool is_tail_call, struct rv_jit_context *ctx)
{
	int stack_adjust = ctx->stack_size, store_offset = stack_adjust - 4;
	int stack_adjust = ctx->stack_size;
	const s8 *r0 = bpf2rv32[BPF_REG_0];

	store_offset -= 4 * BPF_JIT_SCRATCH_REGS;

	/* Set return value if not tail call. */
	if (!is_tail_call) {
		emit(rv_addi(RV_REG_A0, lo(r0), 0), ctx);
@@ -123,15 +152,15 @@ static void __build_epilogue(bool is_tail_call, struct rv_jit_context *ctx)
	}

	/* Restore callee-saved registers. */
	emit(rv_lw(RV_REG_RA, store_offset - 0, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_FP, store_offset - 4, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S1, store_offset - 8, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S2, store_offset - 12, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S3, store_offset - 16, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S4, store_offset - 20, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S5, store_offset - 24, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S6, store_offset - 28, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S7, store_offset - 32, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_RA, stack_adjust - 4, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_FP, stack_adjust - 8, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S1, stack_adjust - 12, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S2, stack_adjust - 16, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S3, stack_adjust - 20, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S4, stack_adjust - 24, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S5, stack_adjust - 28, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S6, stack_adjust - 32, RV_REG_SP), ctx);
	emit(rv_lw(RV_REG_S7, stack_adjust - 36, RV_REG_SP), ctx);

	emit(rv_addi(RV_REG_SP, RV_REG_SP, stack_adjust), ctx);

@@ -770,12 +799,13 @@ static int emit_bpf_tail_call(int insn, struct rv_jit_context *ctx)
	emit_bcc(BPF_JGE, lo(idx_reg), RV_REG_T1, off, ctx);

	/*
	 * if ((temp_tcc = tcc - 1) < 0)
	 * temp_tcc = tcc - 1;
	 * if (tcc < 0)
	 *   goto out;
	 */
	emit(rv_addi(RV_REG_T1, RV_REG_TCC, -1), ctx);
	off = (tc_ninsn - (ctx->ninsns - start_insn)) << 2;
	emit_bcc(BPF_JSLT, RV_REG_T1, RV_REG_ZERO, off, ctx);
	emit_bcc(BPF_JSLT, RV_REG_TCC, RV_REG_ZERO, off, ctx);

	/*
	 * prog = array->ptrs[index];
@@ -1259,17 +1289,20 @@ notsupported:

void bpf_jit_build_prologue(struct rv_jit_context *ctx)
{
	/* Make space to save 9 registers: ra, fp, s1--s7. */
	int stack_adjust = 9 * sizeof(u32), store_offset, bpf_stack_adjust;
	const s8 *fp = bpf2rv32[BPF_REG_FP];
	const s8 *r1 = bpf2rv32[BPF_REG_1];

	bpf_stack_adjust = round_up(ctx->prog->aux->stack_depth, 16);
	int stack_adjust = 0;
	int bpf_stack_adjust =
		round_up(ctx->prog->aux->stack_depth, STACK_ALIGN);

	/* Make space for callee-saved registers. */
	stack_adjust += NR_SAVED_REGISTERS * sizeof(u32);
	/* Make space for BPF registers on stack. */
	stack_adjust += BPF_JIT_SCRATCH_REGS * sizeof(u32);
	/* Make space for BPF stack. */
	stack_adjust += bpf_stack_adjust;

	store_offset = stack_adjust - 4;

	stack_adjust += 4 * BPF_JIT_SCRATCH_REGS;
	/* Round up for stack alignment. */
	stack_adjust = round_up(stack_adjust, STACK_ALIGN);

	/*
	 * The first instruction sets the tail-call-counter (TCC) register.
@@ -1280,24 +1313,24 @@ void bpf_jit_build_prologue(struct rv_jit_context *ctx)
	emit(rv_addi(RV_REG_SP, RV_REG_SP, -stack_adjust), ctx);

	/* Save callee-save registers. */
	emit(rv_sw(RV_REG_SP, store_offset - 0, RV_REG_RA), ctx);
	emit(rv_sw(RV_REG_SP, store_offset - 4, RV_REG_FP), ctx);
	emit(rv_sw(RV_REG_SP, store_offset - 8, RV_REG_S1), ctx);
	emit(rv_sw(RV_REG_SP, store_offset - 12, RV_REG_S2), ctx);
	emit(rv_sw(RV_REG_SP, store_offset - 16, RV_REG_S3), ctx);
	emit(rv_sw(RV_REG_SP, store_offset - 20, RV_REG_S4), ctx);
	emit(rv_sw(RV_REG_SP, store_offset - 24, RV_REG_S5), ctx);
	emit(rv_sw(RV_REG_SP, store_offset - 28, RV_REG_S6), ctx);
	emit(rv_sw(RV_REG_SP, store_offset - 32, RV_REG_S7), ctx);
	emit(rv_sw(RV_REG_SP, stack_adjust - 4, RV_REG_RA), ctx);
	emit(rv_sw(RV_REG_SP, stack_adjust - 8, RV_REG_FP), ctx);
	emit(rv_sw(RV_REG_SP, stack_adjust - 12, RV_REG_S1), ctx);
	emit(rv_sw(RV_REG_SP, stack_adjust - 16, RV_REG_S2), ctx);
	emit(rv_sw(RV_REG_SP, stack_adjust - 20, RV_REG_S3), ctx);
	emit(rv_sw(RV_REG_SP, stack_adjust - 24, RV_REG_S4), ctx);
	emit(rv_sw(RV_REG_SP, stack_adjust - 28, RV_REG_S5), ctx);
	emit(rv_sw(RV_REG_SP, stack_adjust - 32, RV_REG_S6), ctx);
	emit(rv_sw(RV_REG_SP, stack_adjust - 36, RV_REG_S7), ctx);

	/* Set fp: used as the base address for stacked BPF registers. */
	emit(rv_addi(RV_REG_FP, RV_REG_SP, stack_adjust), ctx);

	/* Set up BPF stack pointer. */
	/* Set up BPF frame pointer. */
	emit(rv_addi(lo(fp), RV_REG_SP, bpf_stack_adjust), ctx);
	emit(rv_addi(hi(fp), RV_REG_ZERO, 0), ctx);

	/* Set up context pointer. */
	/* Set up BPF context pointer. */
	emit(rv_addi(lo(r1), RV_REG_A0, 0), ctx);
	emit(rv_addi(hi(r1), RV_REG_ZERO, 0), ctx);

+5 −6
Original line number Diff line number Diff line
@@ -51,10 +51,9 @@ static struct platform_device *appldata_pdev;
 */
static const char appldata_proc_name[APPLDATA_PROC_NAME_LENGTH] = "appldata";
static int appldata_timer_handler(struct ctl_table *ctl, int write,
				  void __user *buffer, size_t *lenp, loff_t *ppos);
				  void *buffer, size_t *lenp, loff_t *ppos);
static int appldata_interval_handler(struct ctl_table *ctl, int write,
					 void __user *buffer,
					 size_t *lenp, loff_t *ppos);
				     void *buffer, size_t *lenp, loff_t *ppos);

static struct ctl_table_header *appldata_sysctl_header;
static struct ctl_table appldata_table[] = {
@@ -217,7 +216,7 @@ static void __appldata_vtimer_setup(int cmd)
 */
static int
appldata_timer_handler(struct ctl_table *ctl, int write,
			   void __user *buffer, size_t *lenp, loff_t *ppos)
			   void *buffer, size_t *lenp, loff_t *ppos)
{
	int timer_active = appldata_timer_active;
	int rc;
@@ -250,7 +249,7 @@ appldata_timer_handler(struct ctl_table *ctl, int write,
 */
static int
appldata_interval_handler(struct ctl_table *ctl, int write,
			   void __user *buffer, size_t *lenp, loff_t *ppos)
			   void *buffer, size_t *lenp, loff_t *ppos)
{
	int interval = appldata_interval;
	int rc;
@@ -280,7 +279,7 @@ appldata_interval_handler(struct ctl_table *ctl, int write,
 */
static int
appldata_generic_handler(struct ctl_table *ctl, int write,
			   void __user *buffer, size_t *lenp, loff_t *ppos)
			   void *buffer, size_t *lenp, loff_t *ppos)
{
	struct appldata_ops *ops = NULL, *tmp_ops;
	struct list_head *lh;
Loading