Return-path: Received: from mga06.intel.com ([134.134.136.31]) by Galois.linutronix.de with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1fEMoG-00061f-Cp for speck@linutronix.de; Fri, 04 May 2018 00:34:45 +0200 From: Dave Hansen Subject: [MODERATED] [PATCH 1/5] SSB extra 2 Date: Thu, 3 May 2018 15:29:44 -0700 Message-Id: =?utf-8?q?=3Ce69f3b41d5b7fa52cf43682663d1f6f3c5de7d03=2E152538?= =?utf-8?q?3411=2Egit=2Edave=2Ehansen=40intel=2Ecom=3E?= In-Reply-To: References: In-Reply-To: References: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 To: speck@linutronix.de Cc: Dave Hansen List-ID: From: Dave Hansen BPF code is often supplied from outside the kernel. While it can be programmatically verified, it is very difficult to verify potential effects from speculative execution. This patch adds some marker functions as BFP code is entered or exited. These serve only a stubs for now. There are many possibilities for optimization. The BFP programs that run on devices, for instance, are less likely to need any CPU-based mitigations. These patches are an entirely unoptimized first pass. Signed-off-by: Dave Hansen Cc: Andi Kleen Cc: Tim Chen --- include/linux/bpf.h | 2 ++ include/linux/filter.h | 18 +++++++++++++++++- kernel/bpf/sockmap.c | 6 ++++++ net/kcm/kcmsock.c | 7 ++++++- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 486e65e..887c908 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -357,7 +357,9 @@ int bpf_prog_array_copy(struct bpf_prog_array __rcu *old_array, goto _out; \ _prog = _array->progs; \ while ((__prog = READ_ONCE(*_prog))) { \ + bpf_enter_prog(__prog); \ _ret &= func(__prog, ctx); \ + bpf_leave_prog(__prog); \ _prog++; \ } \ _out: \ diff --git a/include/linux/filter.h b/include/linux/filter.h index fc4e8f9..e92854d 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -490,7 +490,23 @@ struct sk_filter { struct bpf_prog *prog; }; -#define BPF_PROG_RUN(filter, ctx) (*(filter)->bpf_func)(ctx, (filter)->insnsi) +static inline void bpf_enter_prog(const struct bpf_prog *fp) +{ +} + +static inline void bpf_leave_prog(const struct bpf_prog *fp) +{ +} + +#define BPF_PROG_RUN(filter, ctx) ({ \ + int __ret; \ + \ + bpf_enter_prog(filter); \ + __ret = (*(filter)->bpf_func)(ctx, (filter)->insnsi); \ + bpf_leave_prog(filter); \ + \ + __ret; \ +}) #define BPF_SKB_CB_LEN QDISC_CB_PRIV_LEN diff --git a/kernel/bpf/sockmap.c b/kernel/bpf/sockmap.c index a3b2138..1858b9d 100644 --- a/kernel/bpf/sockmap.c +++ b/kernel/bpf/sockmap.c @@ -477,7 +477,9 @@ static unsigned int smap_do_tx_msg(struct sock *sk, } bpf_compute_data_pointers_sg(md); + bpf_enter_prog(prog); rc = (*prog->bpf_func)(md, prog->insnsi); + bpf_leave_prog(prog); psock->apply_bytes = md->apply_bytes; /* Moving return codes from UAPI namespace into internal namespace */ @@ -1049,7 +1051,9 @@ static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb) skb->sk = psock->sock; bpf_compute_data_pointers(skb); preempt_disable(); + bpf_enter_prog(prog); rc = (*prog->bpf_func)(skb, prog->insnsi); + bpf_leave_prog(prog); preempt_enable(); skb->sk = NULL; @@ -1301,7 +1305,9 @@ static int smap_parse_func_strparser(struct strparser *strp, */ skb->sk = psock->sock; bpf_compute_data_pointers(skb); + bpf_enter_prog(prog); rc = (*prog->bpf_func)(skb, prog->insnsi); + bpf_leave_prog(prog); skb->sk = NULL; rcu_read_unlock(); return rc; diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c index dc76bc3..63bfc2a 100644 --- a/net/kcm/kcmsock.c +++ b/net/kcm/kcmsock.c @@ -381,8 +381,13 @@ static int kcm_parse_func_strparser(struct strparser *strp, struct sk_buff *skb) { struct kcm_psock *psock = container_of(strp, struct kcm_psock, strp); struct bpf_prog *prog = psock->bpf_prog; + int ret; - return (*prog->bpf_func)(skb, prog->insnsi); + bpf_enter_prog(prog); + ret = (*prog->bpf_func)(skb, prog->insnsi); + bpf_leave_prog(prog); + + return ret; } static int kcm_read_sock_done(struct strparser *strp, int err) -- 2.9.5