From owner-freebsd-current@FreeBSD.ORG Tue Jan 18 16:40:17 2011 Return-Path: Delivered-To: current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E2839106566B for ; Tue, 18 Jan 2011 16:40:16 +0000 (UTC) (envelope-from beat@chruetertee.ch) Received: from marvin.chruetertee.ch (marvin.chruetertee.ch [217.150.245.55]) by mx1.freebsd.org (Postfix) with ESMTP id 90A0F8FC15 for ; Tue, 18 Jan 2011 16:40:16 +0000 (UTC) Received: from daedalus.network.local (55-221.62-81.cust.bluewin.ch [81.62.221.55]) (authenticated bits=0) by marvin.chruetertee.ch (8.14.3/8.14.3) with ESMTP id p0IGeEvN084401 (version=TLSv1/SSLv3 cipher=DHE-DSS-CAMELLIA256-SHA bits=256 verify=NO); Tue, 18 Jan 2011 16:40:14 GMT (envelope-from beat@chruetertee.ch) Message-ID: <4D35C26E.4070108@chruetertee.ch> Date: Tue, 18 Jan 2011 17:40:14 +0100 From: =?ISO-8859-1?Q?Beat_G=E4tzi?= User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.1.16) Gecko/20101210 Lightning/1.0b1 Thunderbird/3.0.11 MIME-Version: 1.0 To: Kostik Belousov References: <4D35A0BB.3010601@chruetertee.ch> <20110118144611.GP2518@deviant.kiev.zoral.com.ua> <4D35B2F2.1000804@chruetertee.ch> <20110118161355.GR2518@deviant.kiev.zoral.com.ua> In-Reply-To: <20110118161355.GR2518@deviant.kiev.zoral.com.ua> X-Enigmail-Version: 1.0.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: current@freebsd.org Subject: Re: Running linux ldconfig on tmpfs results in unkillable process X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 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: Tue, 18 Jan 2011 16:40:17 -0000 On 18.01.2011 17:13, Kostik Belousov wrote: > On Tue, Jan 18, 2011 at 04:34:10PM +0100, Beat G?tzi wrote: >> On 18.01.2011 15:46, Kostik Belousov wrote: >>> On Tue, Jan 18, 2011 at 03:16:27PM +0100, Beat G?tzi wrote: >>>> Hi, >>>> >>>> I've a tinderbox which uses tmpfs to build ports. Every time I build a >>>> port which executes linux ldconfig it results in an unkillable process >>>> which uses 100% CPU. The problem is reproduceable without tinderbox: >>>> >>>> # uname -a >>>> FreeBSD daedalus.network.local 9.0-CURRENT FreeBSD 9.0-CURRENT #3 >>>> r216761: Tue Dec 28 15:32:26 CET 2010 >>>> root@daedalus.network.local:/usr/obj/usr/src/sys/GENERIC i386 >>>> # mkdir /compat/test >>>> # mount -t tmpfs tmpfs /compat/test >>>> # cp -Rp /compat/linux/* /compat/test/ >>>> # mount -t linprocfs linprocfs /compat/test/proc >>>> # /compat/linux/sbin/ldconfig -r /compat/test/ >>>> # pgrep ldconfig >>>> 3449 >>>> # procstat -i 3449 | grep KILL >>>> 3449 ldconfig KILL --- >>>> # kill -9 3449 >>>> # procstat -i 3449 | grep KILL >>>> 3449 ldconfig KILL P-- >>>> >>>> >From top(1): >>>> PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND >>>> 3449 root 1 44 0 992K 712K CPU1 1 10:06 100.00% ldconfig >>>> >>>> When I reboot the machine it hangs after "All buffers synced.". >>>> >>>> I've uploaded some additional output of procstat and ktrace here: >>>> http://people.freebsd.org/~beat/logs/linux-ldconfig-tmpfs.txt >>>> >>>> Anyone knows how to fix this? >>> kdump for the trace of the linux binary is a garbage. You need to >>> use linux_kdump (from ports). >>> >>> I think that your process is looping in the kernel, you can confirm this >>> by dropping in the ddb and doing "bt ". >> >> I've uploaded a screenshot from the output of bt in ddb: >> http://people.freebsd.org/~beat/logs/linux-ldconfig-tmpfs-bt.jpg > > Please try this. > > diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c > index 9ff1cf0..44ad193 100644 > --- a/sys/compat/linux/linux_file.c > +++ b/sys/compat/linux/linux_file.c > @@ -369,7 +369,6 @@ getdents_common(struct thread *td, struct linux_getdents64_args *args, > lbuf = malloc(LINUX_MAXRECLEN, M_TEMP, M_WAITOK | M_ZERO); > vn_lock(vp, LK_SHARED | LK_RETRY); > > -again: > aiov.iov_base = buf; > aiov.iov_len = buflen; > auio.uio_iov = &aiov; > @@ -506,8 +505,10 @@ again: > break; > } > > - if (outp == (caddr_t)args->dirent) > - goto again; > + if (outp == (caddr_t)args->dirent) { > + nbytes = resid; > + goto eof; > + } > > fp->f_offset = off; > if (justone) > diff --git a/sys/fs/tmpfs/tmpfs_subr.c b/sys/fs/tmpfs/tmpfs_subr.c > index 84a2038..62dd0bf 100644 > --- a/sys/fs/tmpfs/tmpfs_subr.c > +++ b/sys/fs/tmpfs/tmpfs_subr.c > @@ -827,9 +827,10 @@ tmpfs_dir_getdents(struct tmpfs_node *node, struct uio *uio, off_t *cntp) > /* Copy the new dirent structure into the output buffer and > * advance pointers. */ > error = uiomove(&d, d.d_reclen, uio); > - > - (*cntp)++; > - de = TAILQ_NEXT(de, td_entries); > + if (error == 0) { > + (*cntp)++; > + de = TAILQ_NEXT(de, td_entries); > + } > } while (error == 0 && uio->uio_resid > 0 && de != NULL); > > /* Update the offset and cache. */ This patch solves the problem. Thanks a lot! Beat