From owner-freebsd-bugs@FreeBSD.ORG Mon Apr 2 23:40:04 2007 Return-Path: X-Original-To: freebsd-bugs@hub.freebsd.org Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 76F3516A404 for ; Mon, 2 Apr 2007 23:40:04 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [69.147.83.40]) by mx1.freebsd.org (Postfix) with ESMTP id 572EF13C48C for ; Mon, 2 Apr 2007 23:40:04 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id l32Ne4hi007860 for ; Mon, 2 Apr 2007 23:40:04 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id l32Ne4LZ007857; Mon, 2 Apr 2007 23:40:04 GMT (envelope-from gnats) Resent-Date: Mon, 2 Apr 2007 23:40:04 GMT Resent-Message-Id: <200704022340.l32Ne4LZ007857@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Michael Conlen Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 4A24F16A401 for ; Mon, 2 Apr 2007 23:31:11 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [69.147.83.33]) by mx1.freebsd.org (Postfix) with ESMTP id 3A9C313C46A for ; Mon, 2 Apr 2007 23:31:11 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.13.1/8.13.1) with ESMTP id l32NVAsU065283 for ; Mon, 2 Apr 2007 23:31:10 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.13.1/8.13.1/Submit) id l32NQ8mq064984; Mon, 2 Apr 2007 23:26:08 GMT (envelope-from nobody) Message-Id: <200704022326.l32NQ8mq064984@www.freebsd.org> Date: Mon, 2 Apr 2007 23:26:08 GMT From: Michael Conlen To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.0 Cc: Subject: kern/111162: nfs_getpages does not restart interrupted system call X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Apr 2007 23:40:04 -0000 >Number: 111162 >Category: kern >Synopsis: nfs_getpages does not restart interrupted system call >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon Apr 02 23:40:03 GMT 2007 >Closed-Date: >Last-Modified: >Originator: Michael Conlen >Release: 6.2 >Organization: >Environment: FreeBSD web10.tarhost.com 6.2-RELEASE-p1 FreeBSD 6.2-RELEASE-p1 #7: Tue Mar 20 15:05:34 EDT 2007 root@web10.tarhost.com:/usr/obj/usr/src/sys/WWW i386 >Description: I see the following in /var/log/messages Apr 2 18:56:43 web10 kernel: nfs_getpages: error 4 Upon this happening on a client if the file was locked it remains locked which may be a problem elsewhere, however I believe nfs_getpages should restart the system call that got interrupted. >How-To-Repeat: run a high volume nfs client and wait for a process that accesses files to randomly get interrupted for some reason. >Fix: I imagine the fix is somewhere in nfs_bio.c. I would imagine you just check the error and if it's EINTR call it again but I don't know enough to know if you can just recall the function... 152 bp = getpbuf(&nfs_pbuf_freecnt); 153 154 kva = (vm_offset_t) bp->b_data; 155 pmap_qenter(kva, pages, npages); 156 cnt.v_vnodein++; 157 cnt.v_vnodepgsin += npages; 158 159 iov.iov_base = (caddr_t) kva; 160 iov.iov_len = count; 161 uio.uio_iov = &iov; 162 uio.uio_iovcnt = 1; 163 uio.uio_offset = IDX_TO_OFF(pages[0]->pindex); 164 uio.uio_resid = count; 165 uio.uio_segflg = UIO_SYSSPACE; 166 uio.uio_rw = UIO_READ; 167 uio.uio_td = td; 168 169 error = (nmp->nm_rpcops->nr_readrpc)(vp, &uio, cred); 170 pmap_qremove(kva, npages); 171 172 relpbuf(bp, &nfs_pbuf_freecnt); 173 174 if (error && (uio.uio_resid == count)) { 175 printf("nfs_getpages: error %d\n", error); 176 VM_OBJECT_LOCK(object); 177 vm_page_lock_queues(); 178 for (i = 0; i < npages; ++i) { 179 if (i != ap->a_reqpage) 180 vm_page_free(pages[i]); 181 } 182 vm_page_unlock_queues(); 183 VM_OBJECT_UNLOCK(object); 184 return VM_PAGER_ERROR; 185 } 186 >Release-Note: >Audit-Trail: >Unformatted: