From owner-freebsd-arch Wed Dec 13 14:53:51 2000 From owner-freebsd-arch@FreeBSD.ORG Wed Dec 13 14:53:44 2000 Return-Path: Delivered-To: freebsd-arch@freebsd.org Received: from fw.wintelcom.net (ns1.wintelcom.net [209.1.153.20]) by hub.freebsd.org (Postfix) with ESMTP id 65D9737B404; Wed, 13 Dec 2000 14:53:42 -0800 (PST) Received: (from bright@localhost) by fw.wintelcom.net (8.10.0/8.10.0) id eBDMrff06270; Wed, 13 Dec 2000 14:53:41 -0800 (PST) Date: Wed, 13 Dec 2000 14:53:41 -0800 From: Alfred Perlstein To: Matt Dillon Cc: Kirk McKusick , arch@FreeBSD.ORG, net@FreeBSD.ORG Subject: Re: patch to cleanup inflight desciptor handling. Message-ID: <20001213145341.S16205@fw.wintelcom.net> References: <200012131852.KAA17423@beastie.mckusick.com> <200012132106.eBDL6Sg86570@earth.backplane.com> <20001213141917.Q16205@fw.wintelcom.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20001213141917.Q16205@fw.wintelcom.net>; from bright@wintelcom.net on Wed, Dec 13, 2000 at 02:19:18PM -0800 Sender: bright@fw.wintelcom.net Sender: owner-freebsd-arch@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG * Alfred Perlstein [001213 14:20] wrote: > * Matt Dillon [001213 13:07] wrote: > > :I believe that your changes have been sorely needed for many > > :years. While I would like to see regular mbufs given a callback > > :mechanism, your present approach of using an mbuf cluster > > :solves 90% of the problem. > > : > > : Kirk McKusick > > > > ... Aflred, be careful that you don't break things we only just fixed > > last year. The descriptor passing code has been broken for many years. > > > > I think the reason we have to scan the descriptor list is related to > > locating isolated self-referential 'loops' with descriptor passing and > > unix domain sockets and closing them. e.g. when you pass a descriptor > > for a unix-domain socket through a unix-domain socket, it is possible > > for the socket descriptors to reference each other and thus never have > > their ref count drop to 0 even when all associated processes have > > close()'d. This happens all the time. Be sure you don't break the > > fix that solves that particular problem. > > Ok, I'll see if that can happen. Basically since the reference > never goes to zero on the socket, the buffers are never forced to > be flushed/cleared and the mbuf will then never be free'd resulting > it it leaking itself. Basically a socket hanging there with an > mbuf referencing itself. > > I wonder if Linux fixed/has this problem. Ok, my patch has this problem: void parent(int con) { int fd; fd = open("/tmp/wank", O_RDONLY); send_fd_withdata(con, con, "wank", 4); sleep (5); exit(1); } void child(int con) { int fd, error; char buf[100]; sleep(5); get_fd_withdata(con, &fd, buf, sizeof(buf)); send_fd_withdata(con, fd, "foo", 3); exit(1); buf[4] = '\0'; printf("%s\n", buf); if ((error = read(fd, buf, sizeof(buf))) < 0) perror("read"); buf[sizeof(buf)-1] = '\0'; printf("%s\n", buf); } This causes a leak, I think the trick is to just always call sorflush() when the pcb is free'd. Looking at linux they still are using gc. I'll give this a lot more thought before resubmitting this idea. sorry, -- -Alfred Perlstein - [bright@wintelcom.net|alfred@freebsd.org] "I have the heart of a child; I keep it in a jar on my desk." To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-arch" in the body of the message