From owner-freebsd-current@FreeBSD.ORG Mon Nov 10 11:57:37 2003 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6D89C16A4CE for ; Mon, 10 Nov 2003 11:57:37 -0800 (PST) Received: from gw.catspoiler.org (217-ip-163.nccn.net [209.79.217.163]) by mx1.FreeBSD.org (Postfix) with ESMTP id 536AE43F93 for ; Mon, 10 Nov 2003 11:57:36 -0800 (PST) (envelope-from truckman@FreeBSD.org) Received: from FreeBSD.org (mousie.catspoiler.org [192.168.101.2]) by gw.catspoiler.org (8.12.9p2/8.12.9) with ESMTP id hAAJvQeF067350; Mon, 10 Nov 2003 11:57:31 -0800 (PST) (envelope-from truckman@FreeBSD.org) Message-Id: <200311101957.hAAJvQeF067350@gw.catspoiler.org> Date: Mon, 10 Nov 2003 11:57:26 -0800 (PST) From: Don Lewis To: l.ertl@univie.ac.at In-Reply-To: <20031110153808.A22613@pcle2.cc.univie.ac.at> MIME-Version: 1.0 Content-Type: TEXT/plain; charset=us-ascii cc: current@FreeBSD.org Subject: Re: named pipes memory leak? X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Nov 2003 19:57:37 -0000 X-List-Received-Date: Mon, 10 Nov 2003 19:57:37 -0000 On 10 Nov, Lukas Ertl wrote: > Hi, > > is there a known problem with named pipes in -CURRENT? > > The following shell script freezes a machine in several minutes and needs > a power cycle. You can see the increasing memory in vmstat -z (unpcb) and > netstat -u. The kernel is FreeBSD 5.1-CURRENT Tue Nov 4 14:08:23 CET 2003. > > ---8<--- > #/bin/sh > > FIFO=/tmp/foo > > for i in `jot 50000 1`; do > mkfifo ${FIFO} > echo blubb > ${FIFO} & > kill $! > rm ${FIFO} > done > ---8<--- If fifo_open() is interrupted, fifo_close() never gets called, and the resources are not recovered. I wish doing the resource recovery in fifo_inactive() would have worked ... Try this patch: Index: sys/fs/fifofs/fifo_vnops.c =================================================================== RCS file: /home/ncvs/src/sys/fs/fifofs/fifo_vnops.c,v retrieving revision 1.89 diff -u -r1.89 fifo_vnops.c --- sys/fs/fifofs/fifo_vnops.c 16 Jun 2003 17:17:09 -0000 1.89 +++ sys/fs/fifofs/fifo_vnops.c 10 Nov 2003 19:11:00 -0000 @@ -154,6 +154,26 @@ } /* + * Dispose of fifo resources. + * Should be called with vnode locked + */ +static void +fifo_cleanup(struct vnode *vp) +{ + struct fifoinfo *fip = vp->v_fifoinfo; + + VI_LOCK(vp); + if (vp->v_usecount == 1) { + vp->v_fifoinfo = NULL; + VI_UNLOCK(vp); + (void)soclose(fip->fi_readsock); + (void)soclose(fip->fi_writesock); + FREE(fip, M_VNODE); + } else + VI_UNLOCK(vp); +} + +/* * Open called to set up a new instance of a fifo or * to find an active instance of a fifo. */ @@ -249,6 +269,7 @@ fip->fi_readers--; if (fip->fi_readers == 0) socantsendmore(fip->fi_writesock); + fifo_cleanup(vp); return (error); } VI_LOCK(vp); @@ -268,6 +289,7 @@ fip->fi_writers--; if (fip->fi_writers == 0) socantrcvmore(fip->fi_readsock); + fifo_cleanup(vp); return (error); } /* @@ -554,15 +576,7 @@ if (fip->fi_writers == 0) socantrcvmore(fip->fi_readsock); } - VI_LOCK(vp); - if (vp->v_usecount == 1) { - vp->v_fifoinfo = NULL; - VI_UNLOCK(vp); - (void)soclose(fip->fi_readsock); - (void)soclose(fip->fi_writesock); - FREE(fip, M_VNODE); - } else - VI_UNLOCK(vp); + fifo_cleanup(vp); VOP_UNLOCK(vp, 0, td); return (0); }