cvs commit: src/sys/kern uipc_socket.c

John Baldwin jhb at freebsd.org
Mon Jan 22 15:54:59 UTC 2007


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


More information about the cvs-src mailing list