Getting rid of atomic_load_acq_int(&fdp->fd_nfiles)) from fget_unlocked

Mateusz Guzik mjguzik at gmail.com
Sun Jul 13 03:55:05 UTC 2014


Currently:
        /*
         * Avoid reads reordering and then a first access to the
         * fdp->fd_ofiles table which could result in OOB operation.
         */
        if (fd < 0 || fd >= atomic_load_acq_int(&fdp->fd_nfiles))
                return (EBADF);

However, if we put fd_nfiles and fd_otable into one atomically replaced
structure the only need to:
1. make sure the pointer is read once
2. issue a data dependency barrier - this is a noop on all supported
architectures and we don't even have approprate macro, so doing nothing
seems fine

The motivation is to boost performance to amortize for seqlock cost, in
case it hits the tree.

This has no impact on races with capability lookup.

In a microbenchmark of 16 threads reading from the same pipe fd
immediately returning EAGAIN the numbers are:
x vanilla-readpipe-run-sum             
+ noacq-readpipe-run-sum
[..]
    N           Min           Max        Median           Avg        Stddev
x  20      13133671      14900364      13893331      13827075     471500.82
+  20      59479718      59527286      59496714      59499504     13752.968
Difference at 95.0% confidence
	4.56724e+07 +/- 213483
	330.312% +/- 1.54395%

There are 3 steps:
1. tidy up capsicum to accept fde:
http://people.freebsd.org/~mjg/patches/single-fdtable-read-capsicum.patch
2. add __READ_ONCE:
http://people.freebsd.org/~mjg/patches/read-once.patch
3. put stuff into one structure:
http://people.freebsd.org/~mjg/patches/filedescenttable.patch

Comments?
-- 
Mateusz Guzik <mjguzik gmail.com>


More information about the freebsd-arch mailing list