file locking.
John Baldwin
jhb at freebsd.org
Thu Aug 16 16:20:33 PDT 2007
On Thursday 16 August 2007 06:31:13 pm Jeff Roberson wrote:
> On Thu, 16 Aug 2007, John Baldwin wrote:
>
> > On Thursday 16 August 2007 04:18:51 pm Jeff Roberson wrote:
> >> On Thu, 16 Aug 2007, John Baldwin wrote:
> >>
> >>> On Thursday 16 August 2007 03:01:18 am Jeff Roberson wrote:
> >>>> I have been looking at file locking for 8.0 and have come up with a way
> > to
> >>>> completely eliminate the file lock, reduce the size of struct file by
> >>>> ~4 pointers (22%), remove the global list of files and associated lock,
> >>>> and restrict the scope of unp_gc while removing several race
conditions.
> >>>
> >>
> >> Thanks for the review.
> >>
> >>> I like finit(). I would maybe change socketpair() to pass so1 and so2
to
> >>> finit() rather than setting f_data twice.
> >>
> >> I'm not sure what you mean?
> >
> > In socketpair() the new code does this:
> >
> > fp1->f_data = so1;
> > ...
> > fp2->f_data = so2;
> > ...
> > finit(fp1, ..., fp1->f_data, ...);
> > finit(fp2, ..., fp2->f_data, ...);
> >
> > It might be cleaner to do this:
> >
> > ...
> > ...
> > finit(fp1, ..., so1, ...);
> > finit(fp2, ..., so2, ...);
>
> I did not want to have one file pointing at another without an initialized
> f_data field. However, I guess the underlying sockets are already setup
> so this may not be important. The code did go to some effort to setup
> f_data early before as well so I didn't want to change that.
Until f_ops is set, f_data is irrelevant as badfileops ignores f_data.
> > So, in the old code there's a really big comment about how it makes sure
to
> > only do closef() (via unp_discard()) once but does a sorflush() for each
> > f_msgcount. Was that comment no longer true?
>
> The comment actually says:
>
> *
> * It is incorrect to simply unp_discard each entry for f_msgcount
> * times
>
> What we do is grab an extra ref to each struct file that is dead and then
> explicitly sorflush() them. This closes all of the references held by
> that socket, which would free any unreferenced non-unp descriptors.
> However, we want to prevent the algorithm from recursing in on itself so
> we hold the extra file ref for unp sockets that would be closed. Then
> when we loop releasing this one last ref at the end the actually fo_close
> will be called.
>
> This portion of the algorithm is not significantly different from before.
> I just introduced an extra flag so I could remove the race from dropping
> the lock inbetween operations and get an accurate count of how big the
> array needs to be.
Ok.
> >> Do we have an official stance on libkvm? Now that we have sysctl for
> >> run-time it's only useful for crashdump debugging. Really in most cases
> >> it could be replaced with a reasonable set of gcc scripts.
> >
> > s/gcc/gdb/. At work we do mostly post-mortem analysis, so having working
> > libkvm is still very important for us. xref the way I just fixed netstat
to
> > work again on coredumps recently. Breaking fstat on coredumps would
probably
> > be very annoying. libkvm can always use the same algo as the sysctl if
> > necessary though.
>
> Yes, I'll do that.
Cool, thanks!
--
John Baldwin
More information about the freebsd-arch
mailing list