Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 4 Feb 2007 01:02:12 GMT
From:      "Christian S.J. Peron" <csjp@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 113971 for review
Message-ID:  <200702040102.l1412CK2029120@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=113971

Change 113971 by csjp@csjp_rnd01 on 2007/02/04 01:01:29

	Add a timed_out argument to bpf_ioctl_getznext(). We will use this
	argument to trigger the rotation of buffers in the event there was
	a read timeout.  We need to do the initialization of this variable
	in bpfioctl() as we will clobber the descriptor state and set it to
	BPF_IDLE.
	
	This implements the buffer rotation in the event of a read timeout.

Affected files ...

.. //depot/projects/zcopybpf/src/sys/net/bpf.c#11 edit
.. //depot/projects/zcopybpf/src/sys/net/bpf_zerocopy.c#11 edit
.. //depot/projects/zcopybpf/src/sys/net/bpf_zerocopy.h#3 edit

Differences ...

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

@@ -310,13 +310,14 @@
 }
 
 static int
-bpf_ioctl_getznext(struct thread *td, struct bpf_d *d, struct bpf_zbuf *bz)
+bpf_ioctl_getznext(struct thread *td, struct bpf_d *d, struct bpf_zbuf *bz,
+    int timed_out)
 {
 
 	if (d->bd_bufmode != BPF_BUFMODE_ZBUF)
 		return (EOPNOTSUPP);
 #ifdef BPF_ZEROCOPY
-	return (bpf_zerocopy_ioctl_getznext(td, d, bz));
+	return (bpf_zerocopy_ioctl_getznext(td, d, bz, timed_out));
 #else
 	panic("bpf_ioctl_getznext");
 #endif
@@ -920,6 +921,7 @@
  *  BIOCSETZBUF		Set current zero-copy buffer locations.
  *  BIOCSETZBUF		Acknowledge reading zero-copy buffers.
  *  BIOCGETZMAX		Get maximum zero-copy buffer size.
+ *  BIOCGETZNEXT	Get next ready zero-copy buffer location
  */
 /* ARGSUSED */
 static	int
@@ -927,8 +929,8 @@
     struct thread *td)
 {
 	struct bpf_d *d = dev->si_drv1;
-	int error = 0;
-
+	int timed_out, error = 0;
+	
 	/* 
 	 * Refresh PID associated with this descriptor.
 	 */
@@ -936,6 +938,13 @@
 	d->bd_pid = td->td_proc->p_pid;
 	if (d->bd_state == BPF_WAITING)
 		callout_stop(&d->bd_callout);
+	/*
+	 * Before we clobber the BPF state, check to see if this descriptor
+	 * was timed out.  If so, we capture that bit of information so we
+	 * can pass it to bpf_ioctl_getznext() so that it knows to rotate
+	 * the buffers.
+	 */
+	timed_out = (d->bd_state == BPF_TIMED_OUT) ? 1 : 0;
 	d->bd_state = BPF_IDLE;
 	BPFD_UNLOCK(d);
 
@@ -1278,7 +1287,8 @@
 		return (bpf_ioctl_getzmax(td, d, (u_int *)addr));
 
 	case BIOCGETZNEXT:
-		return (bpf_ioctl_getznext(td, d, (struct bpf_zbuf *)addr));
+		return (bpf_ioctl_getznext(td, d, (struct bpf_zbuf *)addr,
+		    timed_out));
 
 	case BIOCSETZBUF:
 		return (bpf_ioctl_setzbuf(td, d, (struct bpf_zbuf *)addr));

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

@@ -548,7 +548,7 @@
  */
 int
 bpf_zerocopy_ioctl_getznext(struct thread *td, struct bpf_d *d,
-    struct bpf_zbuf *bz)
+    struct bpf_zbuf *bz, int timed_out)
 {
 	struct zbuf *zb;
 
@@ -564,7 +564,8 @@
 	 * held buffer.
 	 */
 	BPFD_LOCK(d);
-	if (d->bd_immediate && d->bd_hbuf == NULL && d->bd_slen != 0)
+	if ((timed_out || d->bd_immediate) && d->bd_hbuf == NULL
+	    && d->bd_slen != 0)
 		ROTATE_BUFFERS(d);
 	bzero(bz, sizeof(*bz));
 	if (d->bd_hbuf != NULL) {

==== //depot/projects/zcopybpf/src/sys/net/bpf_zerocopy.h#3 (text+ko) ====

@@ -50,7 +50,7 @@
 int	bpf_zerocopy_ioctl_getzmax(struct thread *td, struct bpf_d *d,
 	    u_int *i);
 int	bpf_zerocopy_ioctl_getznext(struct thread *td, struct bpf_d *d,
-	    struct bpf_zbuf *bz);
+	    struct bpf_zbuf *bz, int timed_out);
 int	bpf_zerocopy_ioctl_setzbuf(struct thread *td, struct bpf_d *d,
 	    struct bpf_zbuf *bz);
 int	bpf_zerocopy_uiomove(struct bpf_d *d, caddr_t buf, u_int len,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200702040102.l1412CK2029120>