Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Dec 2000 14:53:41 -0800
From:      Alfred Perlstein <bright@wintelcom.net>
To:        Matt Dillon <dillon@earth.backplane.com>
Cc:        Kirk McKusick <mckusick@mckusick.com>, arch@FreeBSD.ORG, net@FreeBSD.ORG
Subject:   Re: patch to cleanup inflight desciptor handling.
Message-ID:  <20001213145341.S16205@fw.wintelcom.net>
In-Reply-To: <20001213141917.Q16205@fw.wintelcom.net>; from bright@wintelcom.net on Wed, Dec 13, 2000 at 02:19:18PM -0800
References:  <200012131852.KAA17423@beastie.mckusick.com> <200012132106.eBDL6Sg86570@earth.backplane.com> <20001213141917.Q16205@fw.wintelcom.net>

next in thread | previous in thread | raw e-mail | index | archive | help
* Alfred Perlstein <bright@wintelcom.net> [001213 14:20] wrote:
> * Matt Dillon <dillon@earth.backplane.com> [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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001213145341.S16205>