Date: Wed, 18 Nov 2009 22:39:06 +0000 (GMT) From: Robert Watson <rwatson@FreeBSD.org> To: Jung-uk Kim <jkim@FreeBSD.org> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r199492 - in head/sys: amd64/amd64 i386/i386 net Message-ID: <alpine.BSF.2.00.0911182238090.12162@fledge.watson.org> In-Reply-To: <200911181926.nAIJQHOR081471@svn.freebsd.org> References: <200911181926.nAIJQHOR081471@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 18 Nov 2009, Jung-uk Kim wrote: > Author: jkim > Date: Wed Nov 18 19:26:17 2009 > New Revision: 199492 > URL: http://svn.freebsd.org/changeset/base/199492 > > Log: > - Make BPF JIT compiler working again in userland. We are limiting size of > generated native binary to page size for now. > - Update copyright date and fix some style nits. I'm not sure if you have noticed, but there are a bunch of embedded target ports of the BPF JIT in the PR collection -- ARM, MIPS, etc. Any chance we might see those integrated into 9.x at some point? The less cache-rich CPUs are especially helped by JIT parts. Robert N M Watson Computer Laboratory University of Cambridge > > Modified: > head/sys/amd64/amd64/bpf_jit_machdep.c > head/sys/amd64/amd64/bpf_jit_machdep.h > head/sys/i386/i386/bpf_jit_machdep.c > head/sys/i386/i386/bpf_jit_machdep.h > head/sys/net/bpf_jitter.c > head/sys/net/bpf_jitter.h > > Modified: head/sys/amd64/amd64/bpf_jit_machdep.c > ============================================================================== > --- head/sys/amd64/amd64/bpf_jit_machdep.c Wed Nov 18 18:48:18 2009 (r199491) > +++ head/sys/amd64/amd64/bpf_jit_machdep.c Wed Nov 18 19:26:17 2009 (r199492) > @@ -1,6 +1,6 @@ > /*- > * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) > - * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org> > + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org> > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > @@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$"); > #include <net/if.h> > #else > #include <stdlib.h> > +#include <sys/mman.h> > +#include <sys/param.h> > #endif > > #include <sys/types.h> > @@ -97,9 +99,9 @@ emit_code(bpf_bin_stream *stream, u_int > bpf_filter_func > bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) > { > + bpf_bin_stream stream; > struct bpf_insn *ins; > u_int i, pass; > - bpf_bin_stream stream; > > /* > * NOTE: do not modify the name of this variable, as it's used by > @@ -475,20 +477,31 @@ bpf_jit_compile(struct bpf_insn *prog, u > } > > pass++; > - if (pass == 2) > + if (pass >= 2) { > +#ifndef _KERNEL > + if (mprotect(stream.ibuf, stream.cur_ip, > + PROT_READ | PROT_EXEC) != 0) { > + munmap(stream.ibuf, BPF_JIT_MAXSIZE); > + stream.ibuf = NULL; > + } > +#endif > break; > + } > > #ifdef _KERNEL > stream.ibuf = (char *)malloc(stream.cur_ip, M_BPFJIT, M_NOWAIT); > - if (stream.ibuf == NULL) { > - free(stream.refs, M_BPFJIT); > - return (NULL); > - } > + if (stream.ibuf == NULL) > + break; > #else > - stream.ibuf = (char *)malloc(stream.cur_ip); > - if (stream.ibuf == NULL) { > - free(stream.refs); > - return (NULL); > + if (stream.cur_ip > BPF_JIT_MAXSIZE) { > + stream.ibuf = NULL; > + break; > + } > + stream.ibuf = (char *)mmap(NULL, BPF_JIT_MAXSIZE, > + PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); > + if (stream.ibuf == MAP_FAILED) { > + stream.ibuf = NULL; > + break; > } > #endif > > > Modified: head/sys/amd64/amd64/bpf_jit_machdep.h > ============================================================================== > --- head/sys/amd64/amd64/bpf_jit_machdep.h Wed Nov 18 18:48:18 2009 (r199491) > +++ head/sys/amd64/amd64/bpf_jit_machdep.h Wed Nov 18 19:26:17 2009 (r199492) > @@ -1,6 +1,6 @@ > /*- > * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) > - * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org> > + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org> > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > > Modified: head/sys/i386/i386/bpf_jit_machdep.c > ============================================================================== > --- head/sys/i386/i386/bpf_jit_machdep.c Wed Nov 18 18:48:18 2009 (r199491) > +++ head/sys/i386/i386/bpf_jit_machdep.c Wed Nov 18 19:26:17 2009 (r199492) > @@ -1,6 +1,6 @@ > /*- > * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) > - * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org> > + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org> > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > @@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$"); > #include <net/if.h> > #else > #include <stdlib.h> > +#include <sys/mman.h> > +#include <sys/param.h> > #endif > > #include <sys/types.h> > @@ -97,9 +99,9 @@ emit_code(bpf_bin_stream *stream, u_int > bpf_filter_func > bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) > { > + bpf_bin_stream stream; > struct bpf_insn *ins; > u_int i, pass; > - bpf_bin_stream stream; > > /* > * NOTE: do not modify the name of this variable, as it's used by > @@ -498,20 +500,31 @@ bpf_jit_compile(struct bpf_insn *prog, u > } > > pass++; > - if (pass == 2) > + if (pass >= 2) { > +#ifndef _KERNEL > + if (mprotect(stream.ibuf, stream.cur_ip, > + PROT_READ | PROT_EXEC) != 0) { > + munmap(stream.ibuf, BPF_JIT_MAXSIZE); > + stream.ibuf = NULL; > + } > +#endif > break; > + } > > #ifdef _KERNEL > stream.ibuf = (char *)malloc(stream.cur_ip, M_BPFJIT, M_NOWAIT); > - if (stream.ibuf == NULL) { > - free(stream.refs, M_BPFJIT); > - return (NULL); > - } > + if (stream.ibuf == NULL) > + break; > #else > - stream.ibuf = (char *)malloc(stream.cur_ip); > - if (stream.ibuf == NULL) { > - free(stream.refs); > - return (NULL); > + if (stream.cur_ip > BPF_JIT_MAXSIZE) { > + stream.ibuf = NULL; > + break; > + } > + stream.ibuf = (char *)mmap(NULL, BPF_JIT_MAXSIZE, > + PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); > + if (stream.ibuf == MAP_FAILED) { > + stream.ibuf = NULL; > + break; > } > #endif > > > Modified: head/sys/i386/i386/bpf_jit_machdep.h > ============================================================================== > --- head/sys/i386/i386/bpf_jit_machdep.h Wed Nov 18 18:48:18 2009 (r199491) > +++ head/sys/i386/i386/bpf_jit_machdep.h Wed Nov 18 19:26:17 2009 (r199492) > @@ -1,6 +1,6 @@ > /*- > * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) > - * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org> > + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org> > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > > Modified: head/sys/net/bpf_jitter.c > ============================================================================== > --- head/sys/net/bpf_jitter.c Wed Nov 18 18:48:18 2009 (r199491) > +++ head/sys/net/bpf_jitter.c Wed Nov 18 19:26:17 2009 (r199492) > @@ -1,6 +1,6 @@ > /*- > * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) > - * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org> > + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org> > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > @@ -43,6 +43,8 @@ __FBSDID("$FreeBSD$"); > #else > #include <stdlib.h> > #include <string.h> > +#include <sys/mman.h> > +#include <sys/param.h> > #include <sys/types.h> > #endif > > @@ -127,7 +129,7 @@ bpf_destroy_jit_filter(bpf_jit_filter *f > { > > if (filter->func != bpf_jit_accept_all) > - free(filter->func); > + munmap(filter->func, BPF_JIT_MAXSIZE); > free(filter); > } > #endif > > Modified: head/sys/net/bpf_jitter.h > ============================================================================== > --- head/sys/net/bpf_jitter.h Wed Nov 18 18:48:18 2009 (r199491) > +++ head/sys/net/bpf_jitter.h Wed Nov 18 19:26:17 2009 (r199492) > @@ -1,6 +1,6 @@ > /*- > * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) > - * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org> > + * Copyright (C) 2005-2009 Jung-uk Kim <jkim@FreeBSD.org> > * All rights reserved. > * > * Redistribution and use in source and binary forms, with or without > @@ -36,6 +36,8 @@ > > #ifdef _KERNEL > MALLOC_DECLARE(M_BPFJIT); > +#else > +#define BPF_JIT_MAXSIZE PAGE_SIZE > #endif > > extern int bpf_jitter_enable; >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?alpine.BSF.2.00.0911182238090.12162>