Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Jan 2007 10:54:33 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        Andre Oppermann <andre@freebsd.org>
Cc:        cvs-src@freebsd.org, src-committers@freebsd.org, cvs-all@freebsd.org
Subject:   Re: cvs commit: src/sys/kern uipc_socket.c
Message-ID:  <200701221054.33982.jhb@freebsd.org>
In-Reply-To: <45B4D1AF.9070101@freebsd.org>
References:  <200611021745.kA2HjSZC018731@repoman.freebsd.org> <200701121206.47308.jhb@freebsd.org> <45B4D1AF.9070101@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 22 January 2007 10:01, Andre Oppermann wrote:
> John Baldwin wrote:
> > Also, you've introduced another regression in that if the m_get2m() fails 
it
> > should be returning ENOBUFS and not EFAULT to userland.  The comments in
> > sosend_*() about 'EFAULT being the only possible error' are obviously
> > wrong. :)
> 
> We're always calling with M_WAITOK because we're coming from userland and
> may sleep forever.

Bah, ok.  I was confused because I guess TRYWAIT can't return NULL anymore, 
but sosend_copyin() still has:

                                MGETHDR(m, M_TRYWAIT, MT_DATA);
                                if (m == NULL) {
                                        error = ENOBUFS;
                                        goto out;
                                }

although it would seem that the ZERO_COPY_SOCKETS code just needs to be 
updated.  Maybe like so:

Index: uipc_socket.c
===================================================================
RCS file: /usr/cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.288
diff -u -r1.288 uipc_socket.c
--- uipc_socket.c	8 Jan 2007 17:49:59 -0000	1.288
+++ uipc_socket.c	22 Jan 2007 15:52:06 -0000
@@ -857,20 +857,11 @@
 		if (resid >= MINCLSIZE) {
 #ifdef ZERO_COPY_SOCKETS
 			if (top == NULL) {
-				MGETHDR(m, M_TRYWAIT, MT_DATA);
-				if (m == NULL) {
-					error = ENOBUFS;
-					goto out;
-				}
+				m = m_gethdr(M_TRYWAIT, MT_DATA);
 				m->m_pkthdr.len = 0;
 				m->m_pkthdr.rcvif = NULL;
-			} else {
-				MGET(m, M_TRYWAIT, MT_DATA);
-				if (m == NULL) {
-					error = ENOBUFS;
-					goto out;
-				}
-			}
+			} else
+				m = m_get(M_TRYWAIT, MT_DATA);
 			if (so_zero_copy_send &&
 			    resid>=PAGE_SIZE &&
 			    *space>=PAGE_SIZE &&
@@ -881,14 +872,8 @@
 				len = cow_send;
 			}
 			if (!cow_send) {
-				MCLGET(m, M_TRYWAIT);
-				if ((m->m_flags & M_EXT) == 0) {
-					m_free(m);
-					m = NULL;
-				} else {
-					len = min(min(MCLBYTES, resid),
-					    *space);
-				}
+				m_clget(m, M_TRYWAIT);
+				len = min(min(MCLBYTES, resid), *space);
 			}
 #else /* ZERO_COPY_SOCKETS */
 			if (top == NULL) {

-- 
John Baldwin



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