Date: Mon, 24 Dec 2007 17:59:37 GMT From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 131531 for review Message-ID: <200712241759.lBOHxbQL082728@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=131531 Change 131531 by rwatson@rwatson_cinnamon on 2007/12/24 17:58:48 First cut at improving behavior of zero-copy BPF buffers on systems with weaker memory ordering with i386. In certain cases, it will also help consistency on i386. Suggested by: jhb Affected files ... .. //depot/projects/zcopybpf/src/contrib/libpcap/pcap-bpf.c#15 edit .. //depot/projects/zcopybpf/src/sys/net/bpf_zerocopy.c#25 edit Differences ... ==== //depot/projects/zcopybpf/src/contrib/libpcap/pcap-bpf.c#15 (text+ko) ==== @@ -39,6 +39,10 @@ #include <sys/ioctl.h> #include <sys/utsname.h> +#ifdef BIOCGETBUFMODE +#include <machine/atomic.h> +#endif + #include <net/if.h> #ifdef _AIX @@ -160,7 +164,8 @@ */ if (p->zbuffer == p->zbuf2 || p->zbuffer == NULL) { bzh = (struct bpf_zbuf_header *)p->zbuf1; - if (bzh->bzh_kernel_gen != bzh->bzh_user_gen) { + if (bzh->bzh_user_gen != + atomic_load_acq_int(&bzh->bzh_kernel_gen)) { p->bzh = bzh; p->zbuffer = (u_char *)p->zbuf1; p->buffer = p->zbuffer + sizeof(*bzh); @@ -169,7 +174,8 @@ } } else if (p->zbuffer == p->zbuf1) { bzh = (struct bpf_zbuf_header *)p->zbuf2; - if (bzh->bzh_kernel_gen != bzh->bzh_user_gen) { + if (bzh->bzh_user_gen != + atomic_load_acq_int(&bzh->bzh_kernel_gen)) { p->bzh = bzh; p->zbuffer = (u_char *)p->zbuf2; p->buffer = p->zbuffer + sizeof(*bzh); @@ -249,9 +255,8 @@ static int pcap_ack_zbuf(pcap_t *p) { - struct bpf_zbuf bz; - p->bzh->bzh_user_gen = p->bzh->bzh_kernel_gen; + atomic_store_rel_int(&p->bzh->bzh_user_gen, p->bzh->bzh_kernel_gen); p->bzh = NULL; p->buffer = NULL; return (0); ==== //depot/projects/zcopybpf/src/sys/net/bpf_zerocopy.c#25 (text+ko) ==== @@ -42,6 +42,8 @@ #include <sys/socket.h> #include <sys/uio.h> +#include <machine/atomic.h> + #include <net/if.h> #include <net/bpf.h> #include <net/bpfdesc.h> @@ -354,7 +356,7 @@ zb = (struct zbuf *)d->bd_hbuf; KASSERT(zb != NULL, ("bpf_zerocopy_bufheld: zb == NULL")); zb->zb_header->bzh_kernel_len = d->bd_hlen; - zb->zb_header->bzh_kernel_gen++; + atomic_add_rel_int(&zb->zb_header->bzh_kernel_gen, 1); } /* @@ -376,7 +378,8 @@ zb = (struct zbuf *)d->bd_hbuf; if (zb == NULL) return (0); - if (zb->zb_header->bzh_kernel_gen == zb->zb_header->bzh_user_gen) + if (zb->zb_header->bzh_kernel_gen == + atomic_load_acq_int(&zb->zb_header->bzh_user_gen)) return (1); return (0); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200712241759.lBOHxbQL082728>