PERFORCE change 197191 for review
Takuya ASADA
syuu at FreeBSD.org
Thu Aug 4 16:43:28 UTC 2011
http://p4web.freebsd.org/@@197191?ac=10
Change 197191 by syuu at kikurage on 2011/08/04 16:43:15
Bugfix
Affected files ...
.. //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_mqbpf/Makefile#2 edit
.. //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_mqbpf/test_mqbpf.c#3 edit
.. //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_sqbpf/test_sqbpf.c#3 edit
Differences ...
==== //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_mqbpf/Makefile#2 (text+ko) ====
@@ -1,6 +1,7 @@
PROG= test_mqbpf
SRCS+= test_mqbpf.c
+DPADD= ${LIBPCAP} ${LIBPTHREAD}
+LDADD= -lpcap -lpthread
NO_MAN=
-CFLAGS= -lpthread
.include <bsd.prog.mk>
==== //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_mqbpf/test_mqbpf.c#3 (text+ko) ====
@@ -49,6 +49,7 @@
#include <errno.h>
#include <signal.h>
#include <err.h>
+#include <pcap.h>
#include <assert.h>
#include <pthread.h>
@@ -67,19 +68,26 @@
u_char *bufa, *bufb;
unsigned long count;
unsigned long wrote;
+ pcap_dumper_t *dp;
+ pcap_t *p;
};
static char *ifname = NULL;
static struct bpf_thread_instance *instances;
-static int rxqlen, txqlen;
+static int rxqlen, txqlen, maxcpus;
int bpf_open(void);
void usage(void);
static struct ifreq ifr;
+static char *fflag;
+#if 0
+static unsigned long cflag;
+#endif
static int Iflag;
static char *iflag;
static int bflag = 32768;
+static int wflag;
static int vflag;
static int zflag;
static int Tflag;
@@ -111,26 +119,28 @@
u_int64_t ssum = 0; /* cycles spent not sleep in event loop */
u_int64_t psum = 0; /* cycles spent before buffer can be reclaimed */
unsigned long count = 0;
-#if 0
u_int recv = 0;
u_int drop = 0;
-#endif
- for (i = 0; i < (rxqlen + txqlen + 1); i++) {
- pthread_cancel(instances[i].thread);
- pthread_join(instances[i].thread, NULL);
- wrote += (double)instances[i].wrote / (double)(1024 * 1024);
+ for (i = 0; i < maxcpus; i++) {
+ if (pthread_cancel(instances[i].thread) < 0) {
+ perror("pthread_cancel");
+ exit(-1);
+ }
+ if (pthread_join(instances[i].thread, NULL) < 0) {
+ perror("pthread_join");
+ exit(-1);
+ }
+ wrote += instances[i].wrote;
sum += instances[i].sum;
rsum += instances[i].rsum;
ssum += instances[i].ssum;
psum += instances[i].psum;
count += instances[i].count;
-#if 0
if (ioctl(instances[i].bpffd, BIOCGSTATS, &bs) < 0)
err(-1, "BIOCGSTATS");
recv += bs.bs_recv;
drop += bs.bs_drop;
-#endif
}
putchar('\n');
@@ -139,14 +149,12 @@
printf("%lu cycles spent not sleeping\n", ssum);
printf("%lu cycles spent before buffer reclaims\n", psum);
printf("%lu packets processed\n", count);
+ wrote /= (double)(1024 * 1024);
throughput = (wrote * 8) / 60;
printf("wrote:%f MB throughput:%f Mbps\n",
wrote, throughput);
-
-#if 0
printf("%u packets received (BPF)\n", recv);
printf("%u packets dropped (BPF)\n", drop);
-#endif
exit(0);
}
@@ -160,13 +168,27 @@
return (low | ((u_int64_t) high << 32));
}
-/*
-#define CACHE_LINE_SIZE 32
-*/
+static void
+bpf_init_dumpfile(struct bpf_thread_instance *instance)
+{
+ char filename[strlen(fflag) + 4];
+
+ if (wflag == 0)
+ return;
+
+ snprintf(filename, strlen(fflag) + 4, "%s.%x", fflag, instance->cpu);
+ instance->p = pcap_open_dead(DLT_EN10MB, 0xffffU);
+ instance->dp = pcap_dump_open(instance->p, filename);
+ if (instance->dp == NULL) {
+ pcap_perror(instance->p, filename);
+ exit(-1);
+ }
+}
static void
bpf_process_packets(struct bpf_thread_instance *instance, struct bpf_zbuf *bz, char *bufname)
{
+ struct pcap_pkthdr phd;
int clen, hlen, i;
u_char *b,*bp, *ep, *p, by;
#define bhp ((struct bpf_hdr *)bp)
@@ -175,6 +197,10 @@
ep = bp + bz->bz_buflen;
while (bp < ep) {
instance->count++;
+#if 0
+ if (cflag > 0 && packet_count > cflag)
+ exit(0);
+#endif
if (pflag) {
/*
* XXXCSJP this prefetch method needs to be
@@ -184,12 +210,24 @@
}
clen = bhp->bh_caplen;
hlen = bhp->bh_hdrlen;
+ p = (u_char *)bp + hlen;
+ phd.ts.tv_sec = bhp->bh_tstamp.tv_sec;
+ phd.ts.tv_usec = bhp->bh_tstamp.tv_usec;
+ phd.caplen = phd.len = bhp->bh_datalen;
if (Tflag) {
for (i = 0; i < bhp->bh_datalen; i++)
by = p[i];
bp += BPF_WORDALIGN(clen + hlen);
continue;
}
+ if (wflag) {
+ pcap_dump((u_char *)instance->dp, &phd, p);
+ if (ferror((FILE *)instance->dp)) {
+ perror("dump.pcap");
+ exit(-1);
+ }
+ fflush((FILE *)instance->dp);
+ }
instance->wrote += bhp->bh_caplen;
bp += BPF_WORDALIGN(clen + hlen);
}
@@ -233,8 +271,7 @@
n = read(instance->bpffd, pbuf, bflag);
d = rdtsc();
if (n < 0)
-// err(1, "read failed");
- fprintf(stderr, "read failed");
+ err(1, "read failed");
instance->psum += d - e;
instance->rsum += d - c;
bz.bz_bufa = pbuf;
@@ -383,19 +420,24 @@
CPU_ZERO(&instance->cpuset);
CPU_SET(instance->cpu, &instance->cpuset);
- cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1,
- sizeof(cpuset_t), &instance->cpuset);
+ if (cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1,
+ sizeof(cpuset_t), &instance->cpuset) < 0) {
+ perror("cpuset_setaffinity");
+ exit(-1);
+ }
bzero(&ifr, sizeof(ifr));
strlcpy(ifr.ifr_name, iflag, sizeof(ifr.ifr_name));
instance->bpffd = bpf_open();
- if (instance->bpffd == -1) {
+ if (instance->bpffd < 0) {
(void) fprintf(stderr, "bpfnull: no bpf device available\n");
- exit(1);
+ exit(-1);
}
if (vflag)
(void) fprintf(stderr,
"DEBUG: obtained bpf fd=%d\n", instance->bpffd);
+ if (fflag)
+ bpf_init_dumpfile(instance);
#ifdef BPF_BUFMODE_ZBUF
if (zflag) {
if (vflag)
@@ -470,7 +512,7 @@
main(int argc, char *argv[])
{
char ch;
- int i, s, maxcpus;
+ int i, s;
struct sigaction action = {
.sa_handler = (void (*)(int))handle_int,
.sa_flags = 0
@@ -501,6 +543,18 @@
case 'b':
bflag = atoi(optarg);
break;
+#if 0
+ case 'c':
+ {
+ char *r;
+ cflag = strtoul(optarg, &r, 10);
+ }
+ break;
+#endif
+ case 'f':
+ fflag = optarg;
+ wflag = 1;
+ break;;
case 'i':
iflag = optarg;
break;
@@ -516,6 +570,9 @@
case 'T':
Tflag = 1;
break;
+ case 'w':
+ wflag = 1;
+ break;
case 'v':
vflag++;
break;
@@ -578,12 +635,20 @@
instances[0].other = 1;
- for (i = 0; i < maxcpus; i++)
- pthread_create(&instances[i].thread, NULL,
- (void *(*)(void *))bpf_thread, &instances[i]);
+ for (i = 0; i < maxcpus; i++) {
+ if (pthread_create(&instances[i].thread, NULL,
+ (void *(*)(void *))bpf_thread, &instances[i]) < 0) {
+ perror("pthread_create");
+ return -1;
+ }
+ }
- for (i = 0; i < maxcpus; i++)
- pthread_join(instances[i].thread, NULL);
+ for (i = 0; i < maxcpus; i++) {
+ if (pthread_join(instances[i].thread, NULL) < 0) {
+ perror("pthread_join");
+ return -1;
+ }
+ }
return (0);
}
==== //depot/projects/soc2011/mq_bpf/src/tools/regression/bpf/mq_bpf/test_sqbpf/test_sqbpf.c#3 (text+ko) ====
@@ -329,11 +329,6 @@
bmode = BPF_BUFMODE_ZBUF;
if (ioctl(bpffd, BIOCSETBUFMODE, &bmode) < 0)
err(1, "ioctl(BIOCGSETBUFMODE)");
- u_int zbufmax;
- if (ioctl(bpffd, BIOCGETZMAX, (caddr_t)&zbufmax) < 0) {
- err(1, "ioctl(BIOCGETZMAX)");
- }
- printf("zbufmax:%d\n", zbufmax);
if (ioctl(bpffd, BIOCSETZBUF, bz) < 0)
err(1, "ioctl(BIOCSETZBUF)");
if (vflag)
More information about the p4-projects
mailing list