From owner-freebsd-net@FreeBSD.ORG Thu Sep 30 09:18:14 2004 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5D8D216A4CE; Thu, 30 Sep 2004 09:18:14 +0000 (GMT) Received: from elvis.mu.org (elvis.mu.org [192.203.228.196]) by mx1.FreeBSD.org (Postfix) with ESMTP id 4DD8D43D2F; Thu, 30 Sep 2004 09:18:14 +0000 (GMT) (envelope-from bright@elvis.mu.org) Received: by elvis.mu.org (Postfix, from userid 1192) id 433415C8E6; Thu, 30 Sep 2004 02:18:14 -0700 (PDT) Date: Thu, 30 Sep 2004 02:18:14 -0700 From: Alfred Perlstein To: alc@freebsd.org Message-ID: <20040930091814.GG39252@elvis.mu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.1i cc: net@freebsd.org Subject: aio patch for review. X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Sep 2004 09:18:14 -0000 properly cover the socket buffer for operations that need locking. please review. Index: vfs_aio.c =================================================================== RCS file: /home/ncvs/src/sys/kern/vfs_aio.c,v retrieving revision 1.176 diff -u -r1.176 vfs_aio.c --- vfs_aio.c 23 Sep 2004 14:45:04 -0000 1.176 +++ vfs_aio.c 30 Sep 2004 09:15:10 -0000 @@ -1297,6 +1297,7 @@ struct kevent kev; struct kqueue *kq; struct file *kq_fp; + struct sockbuf *sb; aiocbe = uma_zalloc(aiocb_zone, M_WAITOK); aiocbe->inputcharge = 0; @@ -1451,29 +1452,28 @@ * If it is not ready for io, then queue the aiocbe on the * socket, and set the flags so we get a call when sbnotify() * happens. + * + * Note if opcode is neither LIO_WRITE nor LIO_READ we lock + * and unlock the snd sockbuf for no reason. */ so = fp->f_data; + sb = (opcode == LIO_READ) ? &so->so_rcv : &so->so_snd; + SOCKBUF_LOCK(sb); s = splnet(); if (((opcode == LIO_READ) && (!soreadable(so))) || ((opcode == LIO_WRITE) && (!sowriteable(so)))) { TAILQ_INSERT_TAIL(&so->so_aiojobq, aiocbe, list); TAILQ_INSERT_TAIL(&ki->kaio_sockqueue, aiocbe, plist); - if (opcode == LIO_READ) { - SOCKBUF_LOCK(&so->so_rcv); - so->so_rcv.sb_flags |= SB_AIO; - SOCKBUF_UNLOCK(&so->so_rcv); - } else { - SOCKBUF_LOCK(&so->so_snd); - so->so_snd.sb_flags |= SB_AIO; - SOCKBUF_UNLOCK(&so->so_snd); - } + sb->sb_flags |= SB_AIO; aiocbe->jobstate = JOBST_JOBQGLOBAL; /* XXX */ ki->kaio_queue_count++; num_queue_count++; + SOCKBUF_UNLOCK(sb); splx(s); error = 0; goto done; } + SOCKBUF_UNLOCK(sb); splx(s); } -- - Alfred Perlstein - Research Engineering Development Inc. - email: bright@mu.org cell: 408-480-4684