Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 19 Sep 2012 21:04:30 +0200
From:      =?utf-8?Q?Dag-Erling_Sm=C3=B8rgrav?= <des@des.no>
To:        Konstantin Belousov <kostikbel@gmail.com>
Cc:        hackers@freebsd.org
Subject:   Re: fdgrowtable() cleanup
Message-ID:  <864nmtn8ap.fsf@ds4.des.no>
In-Reply-To: <20120919175354.GV37286@deviant.kiev.zoral.com.ua> (Konstantin Belousov's message of "Wed, 19 Sep 2012 20:53:54 %2B0300")
References:  <86wqzr8hbk.fsf@ds4.des.no> <20120919061005.GR37286@deviant.kiev.zoral.com.ua> <86lig6map1.fsf@ds4.des.no> <20120919175354.GV37286@deviant.kiev.zoral.com.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
Konstantin Belousov <kostikbel@gmail.com> writes:
> "Dag-Erling Sm=C3=B8rgrav" <des@des.no> writes:
> > I assume you mean assignments, not calculations.  I trust the compiler
> > to move them to where they are needed - a trivial optimization with SSA.
> It is a dereference before the assignment, so I perceive it as the
> calculation. No, I do not think that compiler can move the dereference,
> because there are many sequential points between the calculation and
> use of the result.

Sequence points are a language feature and are only meaningful in the
translation phase.  Once the code is in SSA form or some other
equivalent intermediate representation, the compiler can see that the
variables are only used in one specific case and move the assignments
inside that block.  In fact, it will probably optimize them away,
because they are completely unnecessary - I added them solely for
readability after Niclas called my attention to the fact that it is
almost impossible to understand fdgrowtable() at a first reading.

> > Correct, thanks for pointing it out.  The easiest solution is to place
> > the struct freetable between the file array and the flag array.
> As I know, for all ABIs FreeBSD run on, the structure alignment is the
> alignment of the most requiring member. You would introduce very tacit
> dependency between struct file and struct freetable.

The existing code *already* places the struct freetable immediately
after the struct file array.  What I'm proposing now is to leave the
struct freetable where it was but move the fileflags array so they don't
overlap.  The fileflags array is actually a char[] and has no alignment
requirement.

Memory usage will not increase, because the code already allocates
additional space for the struct freetable to make sure it will fit even
if onfiles < sizeof(struct freetable).

BTW, I just noticed that there is some dead code in fdgrowtable():

	nnfiles =3D NDSLOTS(nfd) * NDENTRIES; /* round up */
	if (nnfiles <=3D onfiles)
		/* the table is already large enough */
		return;

        /* ... */

	/* allocate new bitmaps if necessary */
	if (NDSLOTS(nnfiles) > NDSLOTS(onfiles))
		nmap =3D malloc(NDSLOTS(nnfiles) * NDSLOTSIZE,
		    M_FILEDESC, M_ZERO | M_WAITOK);
	else
		nmap =3D NULL;

Since neither nnflags nor onflags are modified between these two chunks
of code, the condition in the second if will always be true.

DES
--=20
Dag-Erling Sm=C3=B8rgrav - des@des.no



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