PERFORCE change 131494 for review

Robert Watson rwatson at FreeBSD.org
Sun Dec 23 14:50:56 PST 2007


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

Change 131494 by rwatson at rwatson_cinnamon on 2007/12/23 22:50:15

	Only check whether zerocopy has picked up a userspace free
	notification if (a) there is a buffer we might want to free,
	and (b) we need to free the buffer in order to handle the
	arriving packet data.

Affected files ...

.. //depot/projects/zcopybpf/src/sys/net/bpf.c#30 edit

Differences ...

==== //depot/projects/zcopybpf/src/sys/net/bpf.c#30 (text+ko) ====

@@ -1757,19 +1757,6 @@
 	BPFD_LOCK_ASSERT(d);
 
 	/*
-	 * Detect whether user space has released a buffer back to us, and if
-	 * so, move it from being a hold buffer to a free buffer.  This may
-	 * not be the best place to do it (for example, we might only want to
-	 * run this check if we need the space), but for now it's a reliable
-	 * spot to do it.
-	 */
-	if (bpf_canfreebuf(d)) {
-		d->bd_fbuf = d->bd_hbuf;
-		d->bd_hbuf = NULL;
-		d->bd_hlen = 0;
-	}
-
-	/*
 	 * Figure out how many bytes to move.  If the packet is
 	 * greater or equal to the snapshot length, transfer that
 	 * much.  Otherwise, transfer the whole packet (unless
@@ -1785,9 +1772,18 @@
 	curlen = BPF_WORDALIGN(d->bd_slen);
 	if (curlen + totlen > d->bd_bufsize) {
 		/*
-		 * This packet will overflow the storage buffer.
-		 * Rotate the buffers if we can, then wakeup any
-		 * pending reads.
+		 * This packet will overflow the storage buffer.  If
+		 * userspace has notified us via shared memory that a buffer
+		 * can be freed, do so.
+		 */
+		if (d->bd_hbuf != NULL && bpf_canfreebuf(d)) {
+			d->bd_fbuf = d->bd_hbuf;
+			d->bd_hbuf = NULL;
+			d->bd_hlen = 0;
+		}
+
+		/*
+		 * Rotate buffers if we can, then wakeup any pending reads.
 		 */
 		if (d->bd_fbuf == NULL) {
 			/*


More information about the p4-projects mailing list