Skip site navigation (1)Skip section navigation (2)
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>