PERFORCE change 114252 for review

Christian S.J. Peron csjp at FreeBSD.org
Thu Feb 8 18:15:02 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=114252

Change 114252 by csjp at csjp_rnd01 on 2007/02/08 18:14:09

	experimental prefetching code.

Affected files ...

.. //depot/projects/zcopybpf/utils/bpfnull/README#3 edit
.. //depot/projects/zcopybpf/utils/bpfnull/bpfnull.c#14 edit

Differences ...

==== //depot/projects/zcopybpf/utils/bpfnull/README#3 (text+ko) ====

@@ -2,7 +2,7 @@
      bpfnull -- Process packets from BPF
 
 SYNOPSIS
-     bpfnull [-IwtTvz] [-i interface] [-f pcap out file]
+     bpfnull [-IwptTvz] [-i interface] [-f pcap out file]
 
 DESCRIPTION
      Process packets from BPF using new zerocopy or regular buffer method. A
@@ -17,6 +17,8 @@
     -t After packet has been received in packet buffer, touch BPF headers
        associated with EACH packet
 
+    -p Prefetch packet data into cache lines prior to processing it
+
     -T Touch each byte associated with the packet for EACH packet
 
     -v Print debug or diagnostic messages to stderr

==== //depot/projects/zcopybpf/utils/bpfnull/bpfnull.c#14 (text+ko) ====

@@ -65,6 +65,7 @@
 static int		 zflag;
 static int		 tflag;
 static int		 Tflag;
+static int		 pflag;
 static u_char		*bufa, *bufb;
 
 static int
@@ -87,6 +88,8 @@
 	}
 }
 
+#define CACHE_LINE_SIZE 32
+
 static void
 bpf_process_packets(struct bpf_zbuf *bz, char *bufname)
 {
@@ -98,7 +101,14 @@
 	if (!wflag && !tflag && !Tflag)
 		return;
 	b = bp = bz->bz_bufa;
-	ep = bp + bz->bz_buflen;
+	p = ep = bp + bz->bz_buflen;
+	if (pflag) {
+		for (i = 0; i < bz->bz_buflen;
+		    i += CACHE_LINE_SIZE) {
+			p += i;
+			__builtin_prefetch(p, 0, 2);
+		}
+	}
 	while (bp < ep) {
 		clen = bhp->bh_caplen;
 		hlen = bhp->bh_hdrlen;
@@ -107,7 +117,7 @@
 		phd.ts.tv_usec = bhp->bh_tstamp.tv_usec;
 		phd.caplen = phd.len = bhp->bh_datalen;
 		if (Tflag) {
-			for (i = 0; i < phd.caplen; i++)
+			for (i = 0; i < phd.len; i++)
 				by = p[i];
 			bp += BPF_WORDALIGN(clen + hlen);
 			continue;
@@ -278,7 +288,7 @@
 	char ch;
 
 	signal(SIGINT, (void *)handle_int);
-	while ((ch = getopt(argc, argv, "b:f:hIi:tTwvz")) != -1) {
+	while ((ch = getopt(argc, argv, "b:f:hIi:ptTwvz")) != -1) {
 		switch (ch) {
 		case 'b':
 			bflag = atoi(optarg);
@@ -293,6 +303,9 @@
 		case 'I':
 			Iflag = 1;
 			break;
+		case 'p':
+			pflag = 1;
+			break;
 		case 't':
 			tflag = 1;
 			break;


More information about the p4-projects mailing list