From owner-p4-projects@FreeBSD.ORG Mon Dec 24 17:59:38 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9112816A421; Mon, 24 Dec 2007 17:59:38 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 36F7E16A418 for ; Mon, 24 Dec 2007 17:59:38 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id EC3C813C469 for ; Mon, 24 Dec 2007 17:59:37 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id lBOHxbjf082731 for ; Mon, 24 Dec 2007 17:59:37 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lBOHxbQL082728 for perforce@freebsd.org; Mon, 24 Dec 2007 17:59:37 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Mon, 24 Dec 2007 17:59:37 GMT Message-Id: <200712241759.lBOHxbQL082728@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson To: Perforce Change Reviews Cc: Subject: PERFORCE change 131531 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 24 Dec 2007 17:59:38 -0000 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 #include +#ifdef BIOCGETBUFMODE +#include +#endif + #include #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 #include +#include + #include #include #include @@ -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); }